sping-mvc ajax访问 session超时 添加拦截

本文介绍如何在Spring MVC中通过配置文件及自定义拦截器实现对AJAX请求的Session超时检查,并利用JavaScript捕获此状态,引导用户重新登录。

学识尚浅,若有需更正地方,请见谅并留言,谢谢!


我们先了解一下一些必要的信息。ajax 请求和普通的 http 请求是不一样的,Ajax请求是XMLHTTPRequest对象发起的,而http请求是浏览器发起的。

二者不同地方体现在HTTP请求的头信息中。

AJAX请求头中带有X-Requested-With信息,其值为XMLHttpRequest。而普通请求是没有的。


spring-mvc.xml 配置文件设置

[html]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. <!-- 配置拦截器,拦截请求(除了登录ajax请求外拦截全部ajax请求) -->  
  2.     <mvc:interceptors >  
  3.         <mvc:interceptor>  
  4.             <mvc:mapping path="/**"/>  
  5.             <mvc:exclude-mapping path="/admin/login/**"/>   
  6.             <bean class="com.wxc.paycoss.filter.AjaxCheckSession"/>  
  7.         </mvc:interceptor>  
  8.     </mvc:interceptors></span>  

说明:其中<bean> 中的 class 是对应包下的拦截器路径


下面是拦截器  AjaxCheckSession.Java  (这个类自由命名)


[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. package com.wxc.paycoss.filter;  
  2.   
  3. import javax.servlet.http.HttpServletRequest;  
  4. import javax.servlet.http.HttpServletResponse;  
  5.   
  6. import org.slf4j.Logger;  
  7. import org.slf4j.LoggerFactory;  
  8. import org.springframework.web.servlet.ModelAndView;  
  9. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;  
  10. import org.springframework.web.util.UrlPathHelper;  
  11.   
  12. import com.cvicse.paycoss.base.Const;  
  13. import com.cvicse.paycoss.domain.Oper;  
  14.   
  15.   
  16. public class AjaxCheckSession  extends HandlerInterceptorAdapter{  
  17.     private final Logger logger = LoggerFactory.getLogger(PaycossContextListener.class);  
  18.      // URL辅助工具类  
  19.     private UrlPathHelper urlPathHelper = new UrlPathHelper();  
  20.   
  21.     @Override  
  22.     public void afterCompletion(HttpServletRequest request,  
  23.             HttpServletResponse response, Object handler, Exception ex)  
  24.             throws Exception {  
  25.         // TODO Auto-generated method stub  
  26.         super.afterCompletion(request, response, handler, ex);  
  27.     }  
  28.   
  29.     @Override  
  30.     public void afterConcurrentHandlingStarted(HttpServletRequest request,  
  31.             HttpServletResponse response, Object handler) throws Exception {  
  32.         // TODO Auto-generated method stub  
  33.         super.afterConcurrentHandlingStarted(request, response, handler);  
  34.     }  
  35.   
  36.     @Override  
  37.     public void postHandle(HttpServletRequest request,  
  38.             HttpServletResponse response, Object handler,  
  39.             ModelAndView modelAndView) throws Exception {  
  40.         // TODO Auto-generated method stub  
  41.         super.postHandle(request, response, handler, modelAndView);  
  42.     }  
  43.   
  44.     @Override  
  45.     public boolean preHandle(HttpServletRequest request,  
  46.             HttpServletResponse response, Object handler) throws Exception {  
  47.           
  48.           
  49.         Oper oper = (Oper) request.getSession().getAttribute(Const.SESSION_LOGIN_ADMIN_USER);  
  50.           
  51.         String requestCTX = urlPathHelper.getContextPath(request);  
  52.         System.out.println(requestCTX);  
  53.         String requestUri = request.getRequestURI(); //请求完整路径,可用于登陆后跳转  
  54.         String contextPath = request.getContextPath();  //项目下完整路径  
  55.         String url = requestUri.substring(contextPath.length()); //请求页面  
  56.         logger.debug("======拦截器配置成功======");  
  57.         logger.debug("======拦截来自:"+requestUri+"的请求=======");  
  58.         logger.debug("======拦截的页面路径是:==:"+url+"=======");  
  59.         //throw new Exception("登录超时!");  
  60.           
  61.         if(oper == null){//如果获取不到登录的session  
  62.             //如果是ajax请求  
  63.             if (request.getHeader("x-requested-with") != null   
  64.                     && request.getHeader("x-requested-with").equalsIgnoreCase("XMLHttpRequest")){   
  65.                 response.setHeader("sessionstatus""timeout"); // 响应头设置session状态   
  66.                 return false;  //session超时,ajax访问返回false  
  67.             }  
  68.         }  
  69.           
  70.         return super.preHandle(request, response, handler);  
  71.     }  
  72.       
  73. }  
以上代码有一些log打印根据自己需要,可以只选其中必须的代码


有了配置文件,也有了拦截器,在拦截器中已经设置了返回的信息,而这些信息会被 JavaScript 获取到。

$.ajaxSetup方法是来设置AJAX请求默认选项的,我们可以认为是全局的选项设置,因此可以将这段代码提到外部JS文件中,在需要的页面引用。


[javascript]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 设置未来(全局)的AJAX请求默认选项 
  3.  * 主要设置了AJAX请求遇到Session过期的情况 
  4.  */  
  5.   
  6. $.ajaxSetup({  
  7.   type: 'POST',  
  8.   contentType:"application/x-www-form-urlencoded;charset=utf-8",  
  9.   complete: function(xhr,status) {  
  10.     var sessionStatus = xhr.getResponseHeader('sessionstatus');  
  11.     if(sessionStatus == 'timeout') {  
  12.       //var top = getTopWinow();  
  13.       //var yes = confirm('由于您长时间没有操作, session已过期, 请重新登录.');  
  14.       //if (yes) {  
  15.         alert("登录超时,请重新登录!");  
  16.         window.location.href = '/admin/login/out.do';  
  17.       //}  
  18.     }  
  19.   }  
  20. });  
  21.   
  22. /** 
  23. * 在页面中任何嵌套层次的窗口中获取顶层窗口 
  24. * @return 当前页面的顶层窗口对象 
  25. */  
  26.   
  27. function getTopWinow(){  
  28.   var p = window;  
  29.   while(p != p.parent){  
  30.     p = p.parent;  
  31.   }  
  32.   return p;  
  33. }  


在这里不得不说一下 ajaxSetup 中的 contentType ,若不设置,有可能弹出的信息是中文,但是往往会出现编码乱码。
<think>我们正在解决用户关于`spring-boot-maven-plugin`在Maven配置中出现标红(错误提示)的问题。 根据引用[1]:原来的配置报红,配置如下: <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> 出现标红的原因通常有几个: 1. 插件版本未指定,且未继承父项目(如spring-boot-starter-parent)来管理版本。 2. Maven仓库中无法找到该插件(可能是网络问题或仓库配置问题)。 3. 项目的JDK版本与插件要求的版本不兼容。 根据引用[2]:该插件会严格遵循Maven的编译规则,如果存在不兼容的依赖,会在打包阶段暴露问题。因此,配置阶段的标红可能是由于配置问题导致的。 根据引用[3]:在配置插件时,可以通过指定`<version>`或通过父项目继承版本。 解决方案: 1. 指定插件版本:在插件声明中添加`<version>`标签,版本号应与使用的Spring Boot版本一致。 例如:<version>2.7.5</version> (根据实际使用的Spring Boot版本) 2. 继承Spring Boot父项目:在pom.xml中设置父项目为spring-boot-starter-parent,这样就不需要为每个插件指定版本。 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.5</version> <!-- 使用你的Spring Boot版本 --> <relativePath/> <!-- lookup parent from repository --> </parent> 3. 检查Maven仓库配置:确保你的Maven settings.xml配置了正确的镜像仓库,并且网络通畅。 4. 检查JDK版本:确保项目使用的JDK版本与插件兼容。Spring Boot 2.x通常需要JDK 8或以上,Spring Boot 3.x需要JDK 17或以上。 5. 如果是在多模块项目中,确保插件配置在需要打包为Spring Boot应用的模块中,而不是父模块(除非父模块也是可运行的应用)。 修改后的配置示例(指定版本): <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <!-- 推荐在properties中定义spring-boot.version --> </plugin> </plugins> </build> 或者在properties中定义版本: <properties> <spring-boot.version>2.7.5</spring-boot.version> </properties> 然后使用`${spring-boot.version}`引用。 如果问题仍然存在,可以尝试清理Maven本地仓库(删除.m2/repository/org/springframework/boot目录)并重新下载。 另外,在IDE中(如IntelliJ IDEA)有时会出现误报,可以尝试重新导入Maven项目(Reimport All Maven Projects)。 总结:标红的最常见原因是插件版本缺失。通过显式指定版本或继承父项目可以解决。 </think>### Spring Boot Maven 插件标红原因分析与解决方案 `spring-boot-maven-plugin` 在 Maven 配置中出现标红(错误提示)通常由以下原因导致: #### 一、主要原因 1. **插件版本缺失** **核心问题**:未明确指定插件版本号,导致 Maven 无法解析 **触发场景**:未继承 Spring Boot 父 POM 且未声明版本时发生 ```xml <!-- 错误示例:缺少版本声明 --> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> ``` 2. **依赖冲突** - Spring Boot 版本与插件版本不兼容 - 项目中存在多个冲突的插件声明 3. **仓库访问问题** - Maven 仓库未配置镜像源 - 插件 JAR 下载失败或损坏 4. **JDK 版本不兼容** - JDK 版本低于插件要求(如 Spring Boot 3.x 要求 JDK 17+) #### 二、解决方案 1. **显式声明版本号**(推荐) 在插件配置中添加与 Boot 版本一致的版本号: ```xml <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>3.2.0</version> <!-- 与项目Boot版本一致 --> </plugin> ``` 2. **继承父 POM**(最佳实践) 继承 Spring Boot 父项目自动管理版本: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.2.0</version> </parent> ``` 3. **检查依赖树** 执行命令排查冲突: ```bash mvn dependency:tree -Dincludes=org.springframework.boot ``` 4. **清理本地仓库** 删除损坏的依赖缓存: ```bash # 删除插件本地缓存 rm -rf ~/.m2/repository/org/springframework/boot/spring-boot-maven-plugin ``` #### 三、验证配置 正确配置示例: ```xml <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <version>${spring-boot.version}</version> <!-- 在properties中定义 --> <executions> <execution> <goals> <goal>repackage</goal> <!-- 关键执行目标 --> </goals> </execution> </executions> </plugin> </plugins> </build> ``` #### 四、调试步骤 1. 执行 `mvn clean install -U` 强制更新依赖 2. 检查 IDE 是否启用正确的 Maven 配置 3. 查看错误详情: ```bash mvn help:describe -Dplugin=org.springframework.boot:spring-boot-maven-plugin ``` > **注意**:Spring Boot 3.x 开始强制要求使用 JDK 17+,JDK 8 环境必然导致插件解析失败[^1][^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值