这里只给出核心代码 doFilter
首先要明确一点 SingleSignOutFilter 会拦截所有请求,而不是仅仅拦截logout时的请求
在sso client应用中存在一个Map<Ticket,HttpSession>对象
在sso server认证用户名密码成功后,会redirect一个带有ticket的请求到sso client
这时就执行下面的逻辑,ticket和当前session会被缓存到Map
退出时,sso server发送带logoutRequest参数的http请求到每一个sso client
这时就会执行下面的逻辑 --- 删除ticket对应的session 然后销毁session
public void doFilter(final ServletRequest servletRequest, final ServletResponse servletResponse, final FilterChain filterChain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) servletRequest;
//add for webdav sso
String reqURI = ((HttpServletRequest)request).getRequestURI();
boolean isCesso = false;
if(reqURI.endsWith("/webdav") || reqURI.contains("/webdav/")){
if(request.getHeader(WEBDAV_CESSO_FLAG)!=null
&& !request.getHeader(WEBDAV_CESSO_FLAG).equals(""))
isCesso = Boolean.valueOf(request.getHeader(WEBDAV_CESSO_FLAG).toString());
if(!isCesso){
filterChain.doFilter(servletRequest, servletResponse);
return;
}
}
//退出时,cas server向cas client发送post请求,其中包括了sessionId,此filter获取session并销毁之
if ("POST".equals(request.getMethod())) {
final String logoutRequest = request.getParameter("logoutRequest");
if (logoutRequest!=null && !"".equals(logoutRequest)) {
final String sessionIdentifier = XmlUtils.getTextForElement(logoutRequest, "SessionIndex");
if (!"".equals(sessionIdentifier)&& sessionIdentifier!=null) {
log.info(" client---Remove A Session Indentify : "+sessionIdentifier);
final HttpSession session = SESSIONSTORAGE.removeByMappingId(sessionIdentifier);
//首先注销本地session
request.getSession().invalidate();
log.info("client---invalidate request's Session");
if (session != null) {
session.invalidate();
}
return;
}
}
} else {
//非logout请求,判断是否包含ticket参数,如果包含缓存ticket session到map
String artifact = request.getParameter(this.artifactParameterName);
final HttpSession session = request.getSession();
if(null == artifact && null != session.getAttribute("ticket")){
artifact = (String)session.getAttribute("ticket");
}
if (!"".equals(artifact)&&!"null".equals(artifact) && artifact!=null
&& SESSIONSTORAGE.getSessionByMappingID(artifact)==null) {
log.info(" client---Add A New Session Indentify : "+artifact);
SESSIONSTORAGE.addSessionByMappingId(artifact, session);
}
}
filterChain.doFilter(servletRequest, servletResponse);
}
分享到:
相关推荐
2. **NewSingleSignOutFilter.java**:这是一个过滤器类,可能是对CAS官方提供的`SingleSignOutFilter`的优化或扩展。在Spring Security或者 CAS服务器的配置中,这类过滤器通常会被用来监听和处理HTTP的logout请求...
org.jasig.cas.client.session.SingleSignOutFilter </filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/* </filter-mapping> <filter...
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/* </filter-mapping> ...
通过`DelegatingFilterProxy`,它指向了名为 `singleSignOutFilter` 的bean。当用户在任何已集成CAS的应用中登出时,这个过滤器会广播登出事件,使得其他应用也同步登出状态。 整合完成后,用户在访问应用时,首先...
- **配置客户端退出过滤器**:`<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>` 处理 CAS 发送的登出通知。 - **配置客户端应用访问地址**:`<param-value>...
3. **关键代码分析**:`SingleSignOutFilter`类是实现单点登出的关键组件之一。下面简要分析其核心代码: ```java public void doFilter(final ServletRequest servletRequest, final ServletResponse servlet...
* 单点登出过滤器:org.jasig.cas.client.session.SingleSignOutFilter * 认证过滤器:org.jasig.cas.client.authentication.AuthenticationFilter * Ticket校验过滤器:org.jasig.cas.client.validation.Cas20...
CAS(Central Authentication Service)是一种广泛使用的开放源代码的单点登录(Single Sign-On,简称SSO)协议,它允许用户通过一个认证过程访问多个应用系统,而无需在每个系统上分别进行登录。在这个场景中,"cas...
7. **单点登出**:CAS还支持单点登出(Single Sign-Out,SSO),即用户在一个应用中登出后,所有其他已通过CAS认证的应用也会同步登出。你可以在客户端配置中开启这一功能。 8. **测试与调试**:完成以上步骤后,你...
- 配置`SingleSignOutFilter`以支持CAS的单点登出功能,当用户在一个应用中登出时,其他所有已登录的应用也会同步登出。 - `SingleSignOutHttpSessionListener`是一个监听器,用于监听Session事件,配合`Single...
特别是`SingleSignOutFilter`,需确保其映射在所有其他过滤器之前。 完成以上步骤后,你就成功地搭建了一个基于CAS的SSO测试环境。用户只需在首次登录时提供凭证,之后访问其他受CAS保护的应用时,无需再次登录,...
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>casFilter</filter-name> <url-pattern>/* </filter-mapping> ``` **2.2.2.2 拷贝...
org.jasig.cas.client.session.SingleSignOutFilter </filter-class> </filter> <filter-mapping> <filter-name>CASSingleSignOutFilter</filter-name> <url-pattern>/* </filter-mapping> <filter> <filter-...
这包括设置监听器(Listener)、单点注销过滤器(Single Sign Out Filter)、认证过滤器(Authentication Filter)以及票证验证过滤器(Cas30ProxyReceivingTicketValidationFilter)。其中,初始化参数如...
5. 当用户在CAS服务器上登出时,`SingleSignOutFilter`监听并同步客户端应用程序的会话,实现SSO登出。 **注意事项** - `client.url`和`cas.server.url`是需要替换的实际客户端和CAS服务器的URL。 - 数据库配置...
<filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CASFilter</filter-name> <url-pattern>/* </filter-mapping> ``` 此外还需要配置...
例如,在JAVA程序中,需要在 `web.xml` 配置文件中添加相应的 Filter,如 `SingleSignOutFilter`、`AuthenticationFilter` 和 `Cas30ProxyReceivingTicketValidationFilter`,这些 Filter 负责处理CAS的登录、登出和...