java请求后端接口拦截器执行两次

场景: 在spring boot web服务中,添加了请求日志拦截器,在请求当中,发现每发送一次请求,都会产生两次拦截器的拦截,并且第二次请求的地址会将@RequestMapping("/**/**")的内容重新添加到请求地址当中

直接公布答案:

解决方式:

        代码自动生成时,控制层的注解写成了@Controller,改为@RestController即可

解决思路:

        在跟踪源码的时候,我的目标是找到为什么地址会重复拼接,在代码跟踪时,发现在进行一次转发的时候地址发生了改变,为什么会发生转发而不是直接返回结果呢,马上就想到可能Controller返回不是REST风格,而是页面,然后进行了转发,果然在看到代码后,使用的注解位@Controller.修改完问题得到了解决

### SSM框架中后端拦截器的实现与用法 #### 一、SSM框架中的拦截器概述 在SSM框架中,Spring MVC提供了强大的拦截器功能,用于在控制器方法执行前或执行后进行特定逻辑处理。通过配置拦截器,可以实现在请求到达Controller层之前的预处理操作,比如权限校验、日志记录等。 #### 二、拦截器的工作原理 当客户端发起HTTP请求时,Spring MVC会按照一定的顺序调用拦截器链中的各个拦截器实例。如果某个拦截器返回`false`,则后续的拦截器以及目标Controller都不会被执行,而是直接进入回调阶段[^2]。 #### 三、拦截器的定义方式 拦截器可以通过自定义类来实现,该类需继承`HandlerInterceptorAdapter`或者实现`HandlerInterceptor`接口。以下是两种常见的实现方式: 1. **继承 `HandlerInterceptorAdapter` 类** 这种方式较为简单,只需重写所需的方法即可。 ```java public class MyInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("preHandle method is called"); // 如果返回 false,则中断后续流程;如果返回 true,则继续向下执行 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("postHandle method is called"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("afterCompletion method is called"); } } ``` 2. **实现 `HandlerInterceptor` 接口** 此方式更加灵活,适合需要完全控制拦截行为的场景。 ```java public class CustomInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("CustomInterceptor's preHandle method is invoked."); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("CustomInterceptor's postHandle method is invoked."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("CustomInterceptor's afterCompletion method is invoked."); } } ``` #### 四、拦截器的配置 为了使自定义的拦截器生效,需要将其注册到Spring容器中并指定其作用范围。通常可以在XML文件中完成此配置,如下所示: ```xml <!-- 配置拦截器 --> <mvc:interceptors> <!-- 定义全局拦截器 --> <mvc:interceptor> <!-- 设置拦截路径 --> <mvc:mapping path="/user/**"/> <!-- 注册拦截器类 --> <bean class="com.jdsydwr.config.MyInterceptor"/> </mvc:interceptor> <!-- 可以设置多个拦截器 --> </mvc:interceptors> ``` 上述代码片段表明,只有匹配`/user/**`路径的请求才会被`MyInterceptor`所拦截。 #### 五、实际应用场景 - 权限验证:判断当前用户是否有权访问某些资源。 - 日志记录:跟踪用户的每一次请求及其参数。 - 性能监控:统计每次请求耗时以便优化系统性能。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值