`
dean_liu
  • 浏览: 76319 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Spring Security会话超时AJAX处理

    博客分类:
  • Java
 
阅读更多
Spring Security版本:2.0.5

应用场景:
用户登录系统,进行录入操作,长时间未保存,当会话超时后,用户进行保存(通过AJAX请求),系统提示“会话超时请重新登录”。

Spring Security目前的行为:
Spring Security实际上是把这种请求当成未登录的请求,并抛出不允许访问的异常(org.springframework.security.AccessDeniedException),然后请求重定向到登录页面。
相关的方法有:
org.springframework.security.ui.ExceptionTranslationFilter.doFilterHttp(HttpServletRequest, HttpServletResponse, FilterChain)
org.springframework.security.ui.ExceptionTranslationFilter.handleException(ServletRequest, ServletResponse, FilterChain, SpringSecurityException)
org.springframework.security.ui.ExceptionTranslationFilter.sendStartAuthentication(ServletRequest, ServletResponse, FilterChain, AuthenticationException)
org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint.commence(ServletRequest, ServletResponse, AuthenticationException)

见org.springframework.security.ui.ExceptionTranslationFilter.handleException(ServletRequest, ServletResponse, FilterChain, SpringSecurityException)中:
		if (exception instanceof AuthenticationException) {
			if (logger.isDebugEnabled()) {
				logger.debug("Authentication exception occurred; redirecting to authentication entry point", exception);
			}

			sendStartAuthentication(request, response, chain, (AuthenticationException) exception);
		}
		else if (exception instanceof AccessDeniedException) {
			if (authenticationTrustResolver.isAnonymous(SecurityContextHolder.getContext().getAuthentication())) {
				if (logger.isDebugEnabled()) {
					logger.debug("Access is denied (user is anonymous); redirecting to authentication entry point", exception);
				}

				sendStartAuthentication(request, response, chain, new InsufficientAuthenticationException("Full authentication is required to access this resource"));//在这里重定向到登录页面
			}
			else {
				if (logger.isDebugEnabled()) {
					logger.debug("Access is denied (user is not anonymous); delegating to AccessDeniedHandler", exception);
				}

				accessDeniedHandler.handle(request, response, (AccessDeniedException) exception);
			}
		}

正常来说应该要重写org.springframework.security.ui.ExceptionTranslationFilter.handleException方法,加入相应的逻辑(判断是否为AJAX请求并作出对应的处理),但由于handleException为私有方法,不能直接对其进行扩展,所以只能寻找其它扩展方式了。

可以选择重写org.springframework.security.ui.webapp.AuthenticationProcessingFilterEntryPoint.commence,这个方法的作用是执行重定向到登录页面,我们可以简单的认为当请求为AJAX时即是会话超时的场景,当然再严谨一点,比如异常的类型与消息,代码如下:
	public void commence(ServletRequest request, ServletResponse response,
			AuthenticationException authException) throws IOException,
			ServletException {
		HttpServletRequest httpRequest = (HttpServletRequest)request;
		if ("XMLHttpRequest".equals(httpRequest.getHeader("X-Requested-With"))){
			Map<String, Object> error = new HashMap<String, Object>();
			error.put("success", false);
			error.put("code", "001");
			error.put("message", "与服务器的会话已经超时");
			error.put("data", "");	// 兼容extjs form loading
			RenderUtils.renderJSON((HttpServletResponse)response, error);
		} else
			super.commence(request, response, authException);
	}

...
<http entry-point-ref="authenticationProcessingFilterEntryPoint">
...
分享到:
评论

相关推荐

    spring security用户权限项目

    5. **会话管理(Session Management)**:Spring Security 可以配置会话超时、会话固定攻击防护等策略,保护用户会话的安全。 **Spring MVC 知识点** 1. **DispatcherServlet**:作为 Spring MVC 的核心,它负责...

    springsecurity前端素材.zip

    在本“springsecurity前端素材”中,我们有两个主要的文件夹:templates和static,它们分别代表了前端展示层的不同方面。 **templates** 文件夹通常包含了应用的HTML模板文件,这些文件被用于构建用户界面。在...

    spring security 参考手册中文版

    远程处理 - spring-security-remoting.jar 25 Web - spring-security-web.jar 25 配置 - spring-security-config.jar 26 LDAP - spring-security-ldap.jar 26 ACL - spring-security-acl.jar 26 CAS - spring-...

    SessionTimeOutAjaxRequest:当浏览器触发 Ajax 请求时,如何检测用户会话超时?

    [Spring Security 第六部分:Ajax 调用的会话超时处理] ( ) 安装 安装 使用 mvn clean install 编译项目 从 Maven 运行 Jetty:mvn jetty:run 用法 在连接到应用程序 默认用户是“ddoan/password”,但您可以在 ...

    spring-978-1-7871-2951-1:Spring Security-第三版

    5. **会话管理**:涵盖了会话固定攻击的防御策略,如会话超时和会话ID的刷新。 6. **Web安全**:讲解了防止XSS(跨站脚本攻击)、CSRF(跨站请求伪造)和其他常见Web安全威胁的方法。 7. **Ajax与前端安全**:阐述...

    SpringSecurityTest

    自定义身份验证过期功能意味着项目可能扩展了Spring Security的默认行为,允许根据特定业务需求定制用户的会话超时或令牌过期策略。这可能涉及自定义TokenEnhancer、TokenStore或AuthenticationProvider等。 7. **...

    spring boot+shiro+mybatis实现不同用户登录显示不同的权限菜单

    Spring Security可以作为Spring Boot的安全模块,但在这里我们选择了Apache Shiro来处理权限控制。 **Apache Shiro** Apache Shiro是一个轻量级的安全框架,它专注于认证、授权(权限)和会话管理。在本项目中,...

    springCloud

    Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring ...

    SpringBoot-Web-Mvc-Security:以Spring方式构建企业Java应用程序

    弹簧靴以Spring方式构建企业Java应用程序例防止暴力认证尝试连续3次失败的登录尝试后阻止用户帐户限制用户的最大会话设置会话超时并在超时时更新数据库表角色和权限管理跟踪用户登录忘记密码并发送电子邮件重置密码...

    structs框架(用户登录部分)

    Structs虽然不直接提供完整的安全解决方案,但可以与Spring Security、Apache Shiro等安全框架集成,实现用户认证与授权,防止SQL注入、XSS攻击等。 9. **模板引擎** Structs支持多种模板引擎,如FreeMarker、...

    Ebay-like website for a college project.zip

    - 会话超时机制,防止长时间未活动的会话被恶意利用。 5. **安全**: - 用户认证与授权,可能采用Spring Security或自定义的权限管理实现。 - 输入验证,防止SQL注入和跨站脚本攻击(XSS)。 - 加密敏感信息,...

    DWR中文文档.pdf

    Acegi是Spring Security的前身,它是一个用于实现安全性的框架。 - **4.8.1 问题提出** 如何在DWR中实现安全认证和授权。 - **4.8.2 解决方案** 通过集成Acegi和DWR来实现安全性的解决方案。 #### 五、DWR中的...

    DWR推送技术大全 dwr推送聊天实例

    DWR可以集成Spring Security等框架进行会话管理和权限控制。 总的来说,DWR推送技术通过Comet实现了高效的服务器到客户端的数据推送,简化了实时Web应用的开发。结合提供的源码示例"j-jetty-dwr-comet-src",开发者...

    Pagina登录Java

    10. **Session管理**:成功登录后,服务器可能会创建一个session来跟踪用户的会话状态,直到用户注销或会话超时。 以上是对"Pagina登录Java"项目可能涉及的技术点的解析,具体的实现细节和代码结构会根据实际项目...

    loginApp1_0_0

    9. **前后端交互**:现代Web应用常使用JSON格式进行Ajax通信,前端(可能是JavaScript或者框架如React、Vue)与后端(Java服务器)通过RESTful API交换数据。 10. **安全最佳实践**:遵循OWASP(Open Web ...

Global site tag (gtag.js) - Google Analytics