`
cevin15
  • 浏览: 26018 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

用cookie实现简单的单点登录功能

阅读更多
看到篇博文,是关于单点登录的。
引用
编写你自己的单点登录(SSO)服务:http://blog.csdn.net/javachannel/article/details/752437

根据这个博文,自己动手尝试了一下这种单点登录解决方案,当然,这个解决方案有个缺陷,就是有个前提,应用必须能够共享cookie。
记下思路,作为备忘。
1、关于cookie的设置。cookie使用了setDomain和setPath,这样才能保证这个cookie能被所有应用共享。
引用
1.可在同一应用服务器内共享方法:设置cookie.setPath("/");
2.跨域共享cookie的方法:设置cookie.setDomain(".jszx.com"),这个参数必须以“.”开始。 ;

2、用cookie来保存用户已登录的状态。在注销用户时,把该cookie设置过期,当然,也要使用setDomain和setPath。
3、使用了三个web project来做练习,一个作为登录验证系统,另外两个应用系统,代码基本相同。应用系统配置filter来过滤访问请求。

过滤器代码
public class UserFilter implements Filter {
	private static String loginUrl = "";

	public void destroy() {
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse resp = (HttpServletResponse) response;
		if (isCookieLogined(req)) {
			chain.doFilter(request, response);
		} else {
			String fromUrl = req.getRequestURL().toString();
			resp.sendRedirect(loginUrl + "?fromUrl=" + fromUrl);
		}
	}

	public void init(FilterConfig filterConfig) throws ServletException {
		loginUrl = filterConfig.getServletContext().getInitParameter("loginUrl");
	}

	private boolean isCookieLogined(HttpServletRequest req) {
		Cookie[] cookies = req.getCookies();
		if(cookies!=null){
			for (Cookie cookie : cookies) {
				if (cookie.getName().equals("user")&&cookie.getValue()!=null) {
					//TODO:此处应该调用auth的cookie验证方法
					return true;
				}
			}
		}
		return false;
	}
}

登录验证系统的登录代码
public class LoginServlet extends HttpServlet {

	private static final long serialVersionUID = -8212504322196762878L;
	private static ConcurrentMap<String, String> userMap = new ConcurrentHashMap<String, String>();

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String fromUrl = request.getParameter("fromUrl");
		request.setAttribute("fromUrl", fromUrl);
		
		request.getRequestDispatcher("index.jsp").forward(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String user = request.getParameter("user");
		if(this.isRegister(user)){
			this.saveCookie(user, response);
			String fromUrl = request.getParameter("fromUrl");
			response.sendRedirect(fromUrl);
		}
	}
	
	@Override
	/**
	 * 初始化数据
	 */
	public void init() throws ServletException {
		userMap.put("cevin", "cevin");
		userMap.put("aki", "aki");
	}

	private boolean isRegister(String user){
		if(userMap.get(user)!=null){
			return true;
		}
		return false;
	}
	
	private void saveCookie(String user, HttpServletResponse response){
		Cookie cookie = new Cookie(CommonUtils.COOKIE_USER, user);
		cookie.setDomain(getServletContext().getInitParameter("domain"));
		cookie.setMaxAge(Integer.parseInt(getServletContext().getInitParameter("cookieLife")));
		cookie.setPath("/");
		response.addCookie(cookie);
	}
}
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics