相信大家。。。
拦截器是SpringMVC中的概念,即只在MVC中生效,拦截器是一种动态拦截方法的调用机制。
作用:(1)在指定方法调用前后执行预先设定后的代码
(2)阻止原始方法执行【校验用的多】
1.实现一个拦截器
实现一个拦截器需要先定义一个拦截器接口即HandlerInterceptor,并重写几个方法。其中需要注意一下Interceptor这个类也要添加@component注解,保证Inteceptor放入IOC容器中。
@Component
public class Interceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
2.拦截方法参数讲解
(1)三个方法 【preHandle】、【postHandle】、【afterCompletion】中都有三个参数分别是
HttpServletRequest request, HttpServletResponse response, Object handler。
-
HttpServletRequest request:- 表示客户端发起的 HTTP 请求对象。
- 通过该对象,可以获取请求的各种信息,如请求参数、请求头、请求方法、请求路径等。
-
HttpServletResponse response:- 表示服务器响应客户端的 HTTP 响应对象。
- 通过该对象,可以设置响应的状态码、响应头、响应体等。
-
Object handler:- 表示当前请求所映射的处理器对象(通常是 Controller 类的实例)。可以获取到Controller类的实例以及当前执行的方法
- 这个参数通常在 Spring MVC 中使用,用于在拦截器中对处理器进行一些操作,如记录日志、进行权限验证等。
【postHandle】方法中还有modelAndView它表示如果处理器执行完成具有返回结果,可以读取到对应数据与页面信息,并进行调整。
【afterCompletion】方法中还有ex,它表示处理器或者表现怎敢执行过程中如果出现异常对象,可以针对异常情况单独处理。
3.拦截方法讲解
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
- 在请求处理之前被调用。
- 用于进行一些预处理操作,比如日志记录、权限验证等。
- 如果该方法返回 true,则继续执行后续的拦截器以及处理器(Controller)的方法;如果返回 false,则结束拦截器链,不再执行后续的拦截器和处理器。
postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView):
- 在请求处理之后、视图渲染之前被调用。
- 可以对请求的结果进行进一步的处理或修改,比如添加公共的模型数据、对视图进行更改等。
- 在该方法中还可以修改 ModelAndView 对象中的数据,以影响最终返回的视图。
4.拦截器链配置
当配置多个拦截器链,可以形成拦截器链。这里引用一张图来阐述具体的过程。

5.拦截器实践
下面我将给出一个具体的案例,关于校验登录状态。该逻辑定义在preHandle
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//判断handle是否是HandlerMethod即是否是controller中的方法,如果不是直接放行,
//因为可能是访问静态资源的方法
if (!(handler instanceof HandlerMethod)){
return true;
}
String token = request.getHeader("Authorization");
if (StringUtils.isEmpty(token)){
//返回失败结果
response.setContentType("application/json;charset=utf-8");
response.getWriter().println(JSONUtils.toJSONString("未登录"));
}
//执行检验token业务逻辑
SysUser sysUser=loginService.checkToken(token);
if(sysUser==null){
//返回失败结果
response.setContentType("application/json;charset=utf-8");
response.getWriter().println(JSONUtils.toJSONString("未登录"));
}
return true;
}
光写完拦截器中的逻辑还不行,还需要注册拦截器才能生效
@Configuration
@ComponentScan("com.Interceptor")
@EnableWebMvc
public class WebMVC implements WebMvcConfigurer {
@Autowired
private Interceptor interceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(interceptor).addPathPatterns("/**");
}
}

934

被折叠的 条评论
为什么被折叠?



