大白话讲解之springMVC拦截器

 相信大家。。。

拦截器是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。

  1. HttpServletRequest request

    • 表示客户端发起的 HTTP 请求对象。
    • 通过该对象,可以获取请求的各种信息,如请求参数、请求头、请求方法、请求路径等。
  2. HttpServletResponse response

    • 表示服务器响应客户端的 HTTP 响应对象。
    • 通过该对象,可以设置响应的状态码、响应头、响应体等。
  3. 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("/**");
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值