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

看到篇博文,是关于单点登录的。
[quote]编写你自己的单点登录(SSO)服务:[url]http://blog.csdn.net/javachannel/article/details/752437[/url][/quote]
根据这个博文,自己动手尝试了一下这种单点登录解决方案,当然,这个解决方案有个缺陷,就是有个前提,应用必须能够共享cookie。
记下思路,作为备忘。
1、关于cookie的设置。cookie使用了setDomain和setPath,这样才能保证这个cookie能被所有应用共享。
[quote]1.可在同一应用服务器内共享方法:设置cookie.setPath("/");
2.跨域共享cookie的方法:设置cookie.setDomain(".jszx.com"),这个参数必须以“.”开始。 ; [/quote]
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);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值