项目单点登录

 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包里,暂时还未找到

posted @ 2013-01-09 17:14  寂静沙滩  阅读(703)  评论(0编辑  收藏  举报