• SpringMVC 学习(九)之拦截器


    目录

    1 拦截器介绍

    2 创建一个拦截器类

    3 配置拦截器


    1 拦截器介绍

            在 SpringMVC 中,拦截器 (Interceptor) 是一种用于拦截 HTTP 请求并在请求处理之前或之后执行自定义逻辑的组件。拦截器可以用于实现以下功能:

    • 权限验证:在请求处理之前进行用户身份验证和授权
    • 日志记录:记录请求的相关信息,如请求路径、参数、处理时间等
    • 异常处理:捕获并处理请求处理过程中抛出的异常
    • 性能监控:统计请求的响应时间、吞吐量等性能指标
    • 数据转换:在请求处理之前或之后对请求或响应的数据进行转换或修改
    • 缓存控制:在请求处理之前检查缓存,决定是否从缓存中获取数据

    从以上功能可以看出,拦截器和过滤器作用很相似,但它们存在一些区别。

    • 层次结构:拦截器是 SpringMVC 框架特有的组件,不依赖 servlet 容器,过滤器是 Web 容器级别的组件,依赖 servlet 容器,可以应用于任何 Web 应用
    • 拦截范围:拦截器只能对 SpringMVC 的请求起作用,而过滤器则可以对几乎所有的请求起作用。拦截器可以获取 Spring 容器中的各个 bean,而过滤器就不行,在拦截器注入一个 service,可以调用业务逻辑
    • 触发时机:拦截器在 SpringMVC 的控制器方法被调用之前或之后触发,可以拦截并处理控制器方法的调用。过滤器在 HTTP 请求到达 Web 服务器之前或之后触发,可以在请求进入应用 (SpringMVC) 之前或响应返回给客户端之前进行处理
    • 调用顺序:过滤器在拦截器之前被调用,它们都可以按照 XML 文件中的配置顺序依次执行或注解 @Order 指定的顺序执行

    2 创建一个拦截器类

            创建一个拦截器类需要实现 HandlerInterceptor 接口,该接口包括三个方法:preHandle、postHandle 和 afterCompletion。在这些方法中,可以编写拦截器的逻辑。

    • preHandle:控制器方法执行之前执行 preHandle(),其 boolean 类型的返回值表示是否拦截或放行,返回 true 表示放行,即调用控制器方法;返回 false 表示拦截,即不调用控制器方法
    • postHandle:控制器方法执行之后,渲染视图之前执行 postHandle()
    • afterComplation:处理完视图和模型数据,渲染视图完毕之后执行 afterComplation()
    1. public class CustomInterceptor implements HandlerInterceptor {
    2. @Override
    3. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    4. // 在处理器执行之前调用
    5. String userName=request.getParameter("userName");
    6. String password = request.getParameter("password");
    7. if (userName==null||password==null){
    8. response.setStatus(500);
    9. response.setContentType("text/html; charset=UTF-8");
    10. response.getWriter().print("参数缺失");
    11. return false;
    12. }
    13. //进行用户校验
    14. if (userName.equals("admin")&&password.equals("admin")){
    15. return true; // 返回true继续执行,返回false中断执行
    16. }else {
    17. response.setStatus(500);
    18. response.setContentType("text/html; charset=UTF-8");
    19. response.getWriter().print("用户名或密码错误");
    20. return false;
    21. }
    22. }
    23. @Override
    24. public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    25. // 在处理器执行之后,返回ModelAndView之前调用
    26. }
    27. @Override
    28. public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    29. // 在整个请求处理完成后调用
    30. }
    31. }

    3 配置拦截器

    基于注解

    addPathPatterns 用于设置拦截哪些请求,excludePathPatterns 用于设置不拦截哪些请求

    1. @Configuration
    2. public class MvcConfig implements WebMvcConfigurer {
    3. @Autowired
    4. private CustomInterceptor customInterceptor ;
    5. @Override
    6. public void addInterceptors(InterceptorRegistry registry) {
    7. registry.addInterceptor(customInterceptor)
    8. .addPathPatterns("/**")
    9. .excludePathPatterns("/error");
    10. }
    11. }

    基于 XML

    通过 设置需要拦截的请求,通过 设置需要排除的请求,即不需要拦截的请求
    1. <mvc:interceptors>
    2. <mvc:interceptor>
    3. <mvc:mapping path="/**"/>
    4. <mvc:exclude-mapping path="/testRequestEntity"/>
    5. <-- 拦截器类 -->
    6. <bean class="com.example.CustomInterceptor" />
    7. mvc:interceptor>
    8. mvc:interceptors>

    注:对于多个拦截器,前面的拦截器不通过,即 preHandle() 返回 false,中断后续执行。

  • 相关阅读:
    java通过jol-core库分析对象内存分布以及查看Synchronized锁升级过程
    C++字符串类 - std::string - 常用总结
    Android WebView使用总结
    2022-08-27 第二小组 张明旭 Vue.js学习记录
    MongoDB 使用账号密码在navicat登录
    (Network)IP地址的网络号和广播地址
    目前最火的测试框架,pytest封神级讲解
    创作神器:9款国产ai写作服务工具大盘点
    再谈线程池——深入剖析线程池的前世今生
    【MATLAB教程案例51】传统神经网络学习——使用matlab神经网络工具箱实现BP、PNN、GRNN神经网络等
  • 原文地址:https://blog.csdn.net/zjs246813/article/details/136331150