CAS-Client客户端研究(一)-AuthenticationFilter

转载于:http://blog.csdn.net/yuwenruli/article/details/6600032

最近研究CAS,先从客户开始来说明CAS的逻辑,可能会结合源代码。

必要说明:http://blog.csdn.net/yuwenruli/article/details/6602180

先来说说配置过滤器需要的参数吧(参考:http://blog.csdn.net/yuwenruli/article/details/6612010):

必要参数

casServerLoginUrl :定义CAS服务器的登录URL地址,例如: https://localhost:8443/cas/login

service or serverName:

service :发送到CAS服务器的service URL地址,例如https://localhost:8443/yourwebapp/index.html

serverName:CAS客户端的服务器名称,Service URL使用这个名称动态组装,例如:http://localhost:8080 (必须包括协议,如果端口是标准端口则可以不写,例如80端口)

可选参数:

  • renew : 指定renew是否为true,有效值为true和false,如果为true则每次请求都产生新的session。默认是false。
  • gateway - 指定是否使用防火墙,有效值是true和false,默认是false。
  • artifactParameterName - 指定request保存票据的参数名称,默认是ticket。
  • serviceParameterName - 指定request保存service的参数名称,默认是service。


言归正传,现在从第一个Filter开始,下面是这个Filter的逻辑过程。

CAS-Client客户端研究(一)-AuthenticationFilter_第1张图片

我们发现这个Filter的职责只是判断是否已经登录,如果没有登录,则根据配置(gateway)来决定条状到什么地方。

我们来看看源代码中怎么做的,

[java] view plain copy
print ?
  1. public final void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {  
  2.        // 转换参数  
  3.     final HttpServletRequest request = (HttpServletRequest) servletRequest;  
  4.        final HttpServletResponse response = (HttpServletResponse) servletResponse;  
  5.        //从session中取得Assertion  
  6.        final HttpSession session = request.getSession(false);  
  7.        final Assertion assertion = session != null ? (Assertion) session.getAttribute(CONST_CAS_ASSERTION) : null;  
  8.        //如果存在,则说明已经登录,本过滤器处理完成,处理下个过滤器  
  9.        if (assertion != null) {  
  10.            filterChain.doFilter(request, response);  
  11.            return;  
  12.        }  
  13.        //如果session中没有Assertion对象,组装serviceUrl并试着从参数中取得ticket属性。  
  14.        final String serviceUrl = constructServiceUrl(request, response);  
  15.        final String ticket = CommonUtils.safeGetParameter(request,getArtifactParameterName());  
  16.        final boolean wasGatewayed = this.gatewayStorage.hasGatewayedAlready(request, serviceUrl);  
  17.        //如果ticket不为空,或者wasGatewayed为true,则本过滤器处理完成,处理下个过滤器  
  18.        if (CommonUtils.isNotBlank(ticket) || wasGatewayed) {  
  19.            filterChain.doFilter(request, response);  
  20.            return;  
  21.        }  
  22.        // 定义需要条状的url地址  
  23.        final String modifiedServiceUrl;  
  24.   
  25.        log.debug(”no ticket and no assertion found”);  
  26.        //ticket 为空,并且wasGatewayed也为false,则根据初始化参数gateway的值来组装跳转url。  
  27.        if (this.gateway) {  
  28.            log.debug(”setting gateway attribute in session”);  
  29.            modifiedServiceUrl = this.gatewayStorage.storeGatewayInformation(request, serviceUrl);  
  30.        } else {  
  31.            modifiedServiceUrl = serviceUrl;  
  32.        }  
  33.   
  34.        if (log.isDebugEnabled()) {  
  35.            log.debug(”Constructed service url: ” + modifiedServiceUrl);  
  36.        }  
  37.          
  38.        //组装跳转url  
  39.        final String urlToRedirectTo = CommonUtils.constructRedirectUrl(this.casServerLoginUrl, getServiceParameterName(),   
  40.             modifiedServiceUrl, this.renew, this.gateway, this.aspId);  
  41.   
  42.        if (log.isDebugEnabled()) {  
  43.            log.debug(”redirecting to \”“ + urlToRedirectTo + “\”“);  
  44.        }  
  45.        //跳转到urlToRedirectTo指定的url,如果没有配置gateway,则跳转到casServerLoginUrl参数指定的url。  
  46.        response.sendRedirect(urlToRedirectTo);  
  47.    }  

你可能感兴趣的:(java,单点登录,session,service,filter)