项目单点登录
void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain){ doBeforeSsoFilter(req, resp); //过滤前预处理,抽象方法,子类可实现 HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)resp; if (request.getRequestURL() != null && isexclusion(request.getRequestURL().toString())) //检查url是否为null或是被忽略不进行过滤的 { chain.doFilter(req, resp); return; } if (isDownloadToolUser) { doDownloadToolActions(request); //如果是下载请求就执行下载 } else { String ssoInfo = SsoFilterUtil.getCookieValueByName(request, SsoFilterConstants.SSO_TOKEN_KEY); //获取token Cookie String ssoInfoSub = SsoFilterUtil.getCookieValueByName(request, SsoFilterSubConstants.SSO_TOKEN_KEY); //获取子应用自定义token Cookie if (ssoInfo != null && ssoInfo.length() > 0 || ssoInfoSub != null && ssoInfoSub.length() > 0) { if (!isUserLogin(request)) //token有效并且没有登录过该应用(如果有session,并且里面的用户信息bean里保存的uid值和解密cookie里保存的uid值一致就认为用户已经登录了。) { if (rebuildSession(request) || rebuildSessionBySub(request))//从单点登录服务器获取UserInfoBean复制进本应用的session中(具体方法很复制,用到了websphere的jar包以及RMI通讯接口) { doAfterSsoInfoBuilt(req, resp); } else // 如果复制失败(有可能是用户类型不合要求,单点登录服务器上没用户登录记录,或者登录信息uid对比不一致) { clearSsoInfo(request, response); //清空登录信息 1移出session中可能的UserInfoBean,2 添加cookie SSO_TOKEN_KEY 值"" ,3 添加cookie LOGIN_FLAG 值 "out" doAfterSsoInfoCleared(request, response) //清理后处理逻辑,抽象方法,子类可实现 redirect2Login(request, response, "0"); //重定向到单点登录服务器去登录,并把当前URL作为参数传过去。 } } } else //如果没有SSO_TOKEN_KEY的cookie就转到单点登录页面 { clearSsoInfo(request, response); doAfterSsoInfoCleared(request, response); redirect2Login(request, response, "0"); } } doOthersInFilter(req, resp); //其他过滤逻辑,抽象方法,子类可实现 String currentURL = SsoUtil.getRequestURLWithParas(request); //将post的参数全加到url上来 if (currentURL != null && currentURL.indexOf(SsoFilterConstants.SSOTIME4UPDATE_URL) != -1) { if (isUserLogin(request)) { updateSsoTime(request, response);//更新单点登录响应时间(添加LOGIN_LASTEST_TIME cookie ,值取当前时间戳并加密) } return; } else { chain.doFilter(req, resp); return; } }
这是单点登录的其他需要用到单点登录的应用端的逻辑,单点登录服务器的代码没在我这个项目的jar包里,暂时还未找到