SpringMVC拦截器-路径语法-略坑

本文详细解析了SpringMVC中拦截器的正确配置方式,特别是针对.html后缀的路径匹配问题。纠正了常见的配置误区,并解释了不同路径配置的意义。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目中遇到一种场景,登录拦截器需要拦截.html后缀等动态请求,但是发现语法不对头。
 
   <mvc:interceptors>
     <mvc:interceptor>
     正确的写法:<mvc:mapping path="/**/*.html"/>
        错误的写法:<mvc:mapping path="/**.html"/>,<mvc:mapping path="*.html"/>
   </mvc:interceptors> 

   为什么会这样呢?mvc:mapping的语法,与通常的url映射不太一样,比如web.xml拦截器、Struts。
(当然,这个是我的个人感觉) 。

   我之前的个人感觉是:*.html就是最简单的拦截后缀的path写法。 

   遇到这个问题,是因为boss写登录拦截器遇到了这个问题,我协助解决下。解决这个问题,参考了网上的2个答案。 

问题1
  

SpringMVC interceptor有时候配置的时候path="/**" 两个星号什么意思,与path="/"以及path="/*"什么区别



靠谱答案: /**的意思是所有文件夹及里面的子文件夹
/*是所有文件夹,不含子文件夹
/是web项目的根目录

参考:”  http://zhidao.baidu.com/link?url=UTFGv5dfiMQsSwECUd_zrXx3EObYNuT6fU8BRKB_pbf_R_tByYJcqoYL-YLQ7Z2Frhii9nWTC-V9Z7I8BbR-ea

问题2
 
springmvc3 如何拦截所有后缀地址
<mvc:mapping> 如何拦截所有后缀 .htm的请求 

<mvc:mapping path="*.htm" /> 这样拦截无效

靠谱答案:
/**/*.html
我看了下回答正确的人等级,发现在ITEye还算是比较活跃的,各种等级都偏高。
参考:
http://www.iteye.com/problems/89040 ;

转载于:https://www.cnblogs.com/qitian1/p/6463054.html

### Spring MVC 6 及以上版本中拦截器的使用方法与实现方式 Spring MVC 的拦截器机制允许开发者在请求到达目标控制器之前或之后执行特定逻辑。随着 Spring Framework 版本不断更新,Spring MVC 6 引入了一些新的特性和改进,使得拦截器的功能更加灵活。 #### 拦截器的核心概念 拦截器通过 `HandlerInterceptor` 接口定义其行为模式。此接口提供了三个主要的方法来控制请求生命周期中的不同阶段: 1. **preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)** 此方法会在实际调用控制器方法前被触发。如果返回值为 `false`,则中断后续操作并直接跳转到视图渲染阶段[^1]。 2. **postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)** 当控制器方法完成处理但尚未渲染视图时会调用该方法。可以在此修改模型数据或者调整响应头等内容。 3. **afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)** 请求完全结束(包括视图渲染完成后),无论成功与否都会调用这个回调函数。通常用于资源清理工作等场景下[^1]。 #### 配置拦截器的方式 在传统 XML 配置时代,可以通过 `<mvc:interceptors>` 节点声明拦截规则;而在现代基于 Java Config 或者更高层次框架支持的情况下,则推荐采用编程式注册形式: ##### 方法一:继承 WebMvcConfigurer 并重写 addInterceptors() 这是官方文档提倡的一种做法,在 Spring Boot 应用程序里尤为常见。下面给出具体代码示例说明如何创建自定义拦截器以及将其加入应用上下文中去。 ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 添加全局生效的拦截器实例 registry.addInterceptor(new MyCustomInterceptor()) .addPathPatterns("/**") // 设置需要匹配哪些URL路径 .excludePathPatterns("/login", "/logout"); //排除不需要拦截的部分链接地址 super.addInterceptors(registry); } } ``` 其中 `MyCustomInterceptor` 是实现了 `HandlerInterceptor` 接口的一个类对象表示具体的业务逻辑实现部分[^2]。 ##### 方法二:利用注解驱动开发简化配置过程 除了显式的编码之外还可以借助于一些特殊的元数据标签快速定义简单的过滤条件。比如前面提到过的例子就是典型的代表之一——即通过组合多个属性共同作用从而达到精确控制的目的[^3]。 --- ### 示例代码展示完整的拦截器定义流程 以下是构建一个基本功能齐全的拦截器全过程演示: ```java // Step 1 定义一个新的Java Bean 类型作为我们的拦截组件主体结构体 @Component public class AuthenticationInterceptor implements HandlerInterceptor { private static final Logger logger = LoggerFactory.getLogger(AuthenticationInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token != null && validateToken(token)) { return true; // 继续向下传递给下一个环节继续运行下去吧~ } else { response.sendError(HttpServletResponse.SC_UNAUTHORIZED,"Invalid Token Provided."); return false;// 停止进一步动作啦!!! } } private boolean validateToken(String token){ /* 这里编写验证令牌合法性的算法 */ return !StringUtils.isEmpty(token); } } //Step 2 注册刚才建立好的那个家伙成为系统可用的服务单元咯~ @Configuration public class AppConfig extends WebSecurityConfigurationAdapter{ ... @Bean public AuthenticationInterceptor authInterceptor(){ return new AuthenticationInterceptor(); } @Override protected void configure(HttpSecurity http)throws Exception{ ..... http.authorizeRequests().antMatchers("/api/v1/*").authenticated(). and().addFilterBefore(authInterceptor(), BasicAuthenticationFilter.class); } } ``` --- ### 新特性介绍 对于最新版号大于等于六以上的 spring framework 来说确实存在不少值得关注的变化之处: - 支持更丰富的表达式语法扩展能力以便更好地满足复杂需求; - 提供了更多内置工具帮助减少重复劳动量的同时提升整体性能表现水平; - 对异步请求的支持得到了显著增强等等一系列亮点均值得深入探索学习一番呢😊! ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值