自定义拦截器实现

这篇具有很好参考价值的文章主要介绍了自定义拦截器实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在 Spring MVC 框架中, 拦截器作为一种机制, 用于对请求进行拦截. 拦截器可以在请求进入处理器之前、处理器返回处理之后、视图渲染之前等各个环节进行拦截.
拦截器通常用于实现一下功能 :

  • 鉴权和身份认证
  • 日志记录和统计
  • 请求参数和校验和过滤
  • 缓存和性能优化
  • 路径重定向和错误处理

也就是说, 当需要对多个请求进行相同或者类似处理时, 可以使用拦截器来统一处理, 从而避免冗余的代码和低效的维护.

一. 自定义拦截器实现

1. 创建一个 Spring Boot 项目, 添加 Spring Web、 Lombok 起步依赖.

正常创建一个 Spring Boot 的 Maven 项目即可.

2. 创建一个公共包 common 实现登录拦截器类

在 Spring MVC 中, 拦截器是通过实现 HandlerInterceptor 接口实现的.
在实现 HandlerInterceptor 接口时, 重写里面的拦截器方法.
image.png

a. preHandle

该方法用于在请求处理之前进行拦截和处理. 该方法在 DispatcherServlet ( 调度器 ) 将请求对象封装为 HandlerExecutionChain 对象后、但在调用处理器( Controller ) 之前被调用
在 preHandle 方法中, 我们可以对请求进行检查、验证、修改等操作, 例如 :

  • 身份认证和权限控制
  • 请求参数校验和过滤
  • 缓存和性能优化

b. postHandle

该方法用于在请求处理完成之后, 试图渲染之前进行拦截和处理. 该方法在 HandlerAdapter 将处理器执行并将其结果返回给 DispatcherServlet 之后调用.
在 postHandle 方法中, 我们可以做一些与请求处理有关的操作, 例如 :

  • 修改 Model 数据
  • 添加一些公共的 Model 属性
  • 对视图进行渲染前的处理

c. afterCompletion

该方法用于请求处理完毕后进行回收和清理工作, 该方法在视图渲染完毕之后被调用, 用于释放资源和进行日志记录等操作
在 afterCompletion 方法中, 我们可以进行一些与请求处理过程相关的清理工作, 例如 :

  • 清理 ThreadLocal 变量
  • 关闭打开的文件或数据库连接
  • 记录请求处理时间和结果

3. 重写方法

由于我们是一个登陆拦截器, 可以想象在各个功能使用之前就需要进行权限的鉴定和登陆的检验. 因此应该重写 preHandle 方法, 在请求处理之前进行拦截和处理

@Component
    public class LoginInterceptor implements HandlerInterceptor {

        /**
* 拦截器为调用方法执行之前执行的方法
*
* @param request  请求
* @param response 响应
* @param handler  表示要执行的处理器, 即处理请求的 Controller 对象或者是拦截器的对象
* @return true 拦截器验证成功, 继续执行后续操作
* false 拦截器验证失败, 验证未通过后续流程不执行
* @throws Exception 异常
*/
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

            // 用户登录判断
            HttpSession session = request.getSession(false);
            if (session != null && session.getAttribute("session_userinfo") != null) {
                // 该用户已经登陆
                return true;
            }
            // 请求无权限, 返回状态码提示
            response.setStatus(401);
            return false;
        }
    }

4. 添加拦截器配置

有了拦截器, 但还没有实现拦截规则, 并且这个拦截的规则是要随着 Web 项目的启动而启动的, 否则在进行页面访问时, 就无法提前拦截了. 因此还需要将自定义的拦截器添加到我们的系统配置当中.
而在 Spring MVC 中提供了一个 WebMvcConfigurer 接口, 因为我们配置的是拦截器, 因此重写里面的 addInterceptors 方法即可.
image.png
在重写的方法中, 将我们实现的登陆拦截器添加进去, 然后配置拦截的规则即可

@Configuration
    public class MyInterceptorConfig implements WebMvcConfigurer {

        // 将自定义的拦截器注入
        @Autowired
        private LoginInterceptor interceptor;

        /**
* @param registry 注册对象
*/
        @Override
        public void addInterceptors(InterceptorRegistry registry) {

            // 注册对象将拦截器添加进框架中
            registry.addInterceptor(interceptor)
                // 配置拦截规则
                .addPathPatterns("/**") // 拦截所有的 url
                .excludePathPatterns("/user/reg") // 排除用户注册 url
                .excludePathPatterns("/user/login") // 排除用户登陆 url
                .excludePathPatterns("/image/**"); // 排除 image 文件夹底下的所有文件
        }
    }

一般对于拦截规则的设置, 我们都是先拦截所有, 然后放行部分. 并且里面的路径写法和我们之前学习的相同.

5. 验证拦截器

当写好拦截器后, 我们创建一个用户操作类

@RestController
    @RequestMapping("/user")
    public class UserController {

        @RequestMapping("/reg")
        public String register() {
            return "注册成功";
        }

        @RequestMapping("/login")
        public String login() {
            return "登陆成功";
        }

        @RequestMapping("article")
        public String writer() {
            return "写文章鉴权";
        }
    }

根据我们的拦截规则, 我们排除了 url 为 /user/reg 和 user/login 以及 image 文件底下的所有文件. 因此这三个都是可以访问的, 其他的 ulr 都是不可以访问的, 也就是我们上面写的 /user/article 是无法访问的, 会被拦截并返回 401

可以看到, 我们放行的方法都能够正确经过拦截器的处理
image.pngimage.png

而我们的 /user/article 被拦截器拦截在外无法执行
image.png

6. 调整返回错误信息

对于我们刚刚的做法中, 当被拦截以后, 说明这个方法是不符合要求的请求, 直接返回了 401 拒绝访问, 但在开发中, 无论是否被拦截, 都应该将信息返回给前端, 而并非返回页面而是要一个数据, 前端根据我们返回的数据进行判断后再执行下一步操作.
因此, 我们可以封装一个统一的返回对象 ResultAjax
即使后端拦截了这个方法, 它没有进行登录, 我们也不能帮前端进行重定向让给用户去登录, 这是要越权行为. 我们只需要返回约定的错误代码 code 告诉前端, 并把错误信息返回给前端即可.

@Data
    public class ResultAjax {
        private int code;
        private String msg;
        private String date;
    }

当被拦截时, 说明为经过登陆鉴权, 返回约定的对象即可

@Component
    public class LoginInterceptor implements HandlerInterceptor {

        /**
* 拦截器为调用方法执行之前执行的方法
*
* @param request  请求
* @param response 响应
* @param handler  表示要执行的处理器对象, 即处理请求的 Controller 对象或者是拦截器的对象
* @return true 拦截器验证成功, 继续执行后续操作
* false 拦截器验证失败, 验证未通过后续流程不执行
* @throws Exception 异常
*/
        @Autowired
        private ResultAjax resultAjax;

        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

            // 用户登录判断
            HttpSession session = request.getSession(false);
            if (session != null && session.getAttribute("session_userinfo") != null) {
                // 该用户已经登陆
                return true;
            }

            ObjectMapper objectMapper = new ObjectMapper();

            // 设置数据返回格式, 防止乱码解析
            response.setContentType("application/json; charset = utf8");

            // 当前方法未通过登陆鉴权, 返回约定的结果
            resultAjax.setCode(-1); // 约定错误都为 -1 状态码, 成功都为 200
            resultAjax.setMsg("用户未登录, 请登录后再操作 !");
            resultAjax.setDate(""); // 为登陆没有数据返回

            // 将返回的数据对象转为 JSON 格式字符串
            String respJson = objectMapper.writeValueAsString(resultAjax);

            // 返回统一的处理对象给前端
            response.getWriter().write(respJson);
            return false;
        }
    }

image.png
这是一般我们的处理情况, 最好的还是进行一个统一的格式的错误信息返回. 关于统一的数据处理和错误处理, 在后续文章中会讲解到.文章来源地址https://www.toymoban.com/news/detail-488141.html

到了这里,关于自定义拦截器实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring拦截器实现鉴权

    拦截器(Interceptor)类似于Servlet中的过滤器,主要用于拦截用户请求并做出相应的处理,例如拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。拦截器允许自定义预处理(Pre-Processing),在其中可以选择禁止对应Handler 的执行;也允许自定义后处理(Post-Pre

    2024年02月11日
    浏览(19)
  • SpringBoot定义拦截器+自定义注解+Redis实现接口防刷(限流)

    在拦截器Interceptor中拦截请求 通过地址+请求uri作为调用者访问接口的区分在Redis中进行计数达到限流目的 定义参数 访问周期 最大访问次数 禁用时长 代码实现 定义拦截器:实现HandlerInterceptor接口,重写preHandle()方法 注册拦截器:配置类实现WebMvcConfigurer接口,重写addIntercep

    2024年02月05日
    浏览(32)
  • 利用Mybatis拦截器实现自定义的ID增长器

    原生的Mybatis框架是没有ID自增器,但例如国产的Mybatis Plus却是支持,不过,Mybatis Plus却是缺少了自定属性的填充;例如:我们需要自定义填充一些属性,updateDate、createDate等,这时Mybatis Plus自带的ID自增器就无法满足需求;这种时候我们就需要自定义的ID增加器,可以自定义

    2024年02月19日
    浏览(22)
  • Spring Boot入门(23):记录接口日志再也不难!用AOP和自定义注解给Spring Boot加上日志拦截器!

            在上两期中,我们着重介绍了如何集成使用 Logback 与 log4j2 日志框架的使用,今天我们讲解的主题依旧跟日志有关,不过不是使用何种开源框架,而是自己动手造。         Spring的核心之一AOP;AOP翻译过来叫面向切面编程, 核心就是这个切面. 切面表示从业务逻辑中

    2024年02月11日
    浏览(28)
  • 使用spring boot拦截器实现青少年模式

    便用Spring Boot拦截器采累计在线时间采实现青少年模式的步骤,可以参考以卜步骤: 1.创建一个拦截器类,实现Handlerlnterceptor 接口。 2.在拦截器类中,定义一个变量来记录用户在线时间。 3.在preHandle方法中,记录用户的登录时间。 4.在afterCompletion方法中,计算用户在线时间,

    2023年04月08日
    浏览(22)
  • Springboot 自定义 Mybatis拦截器,实现 动态查询条件SQL自动组装拼接(玩具)

    ps:最近在参与3100保卫战,战况很激烈,刚刚打完仗,来更新一下之前写了一半的博客。 该篇针对日常写查询的时候,那些动态条件sql 做个简单的封装,自动生成(抛砖引玉,搞个小玩具,不喜勿喷)。 来看看我们平时写那些查询,基本上都要写的一些动态sql:   一个字段

    2024年02月12日
    浏览(24)
  • 掌握Spring MVC拦截器整合技巧,实现灵活的请求处理与权限控制!

    (1)浏览器发送一个请求会先到Tomcat的web服务器。 (2)Tomcat服务器接收到请求以后,会去判断请求的是静态资源还是动态资源。 (3)如果是静态资源,会直接到Tomcat的项目部署目录下去直接访问。 (4)如果是动态资源,就需要交给项目的后台代码进行处理。 (5)在找到具体的方法之前

    2024年01月22日
    浏览(27)
  • SpringBoot中接口幂等性实现方案-自定义注解+Redis+拦截器实现防止订单重复提交

    SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数): SpringBoot+Redis+自定义注解实现接口防刷(限制不同接口单位时间内最大请求次数)_redis防刷_霸道流氓气质的博客-CSDN博客 以下接口幂等性的实现方式与上面博客类似,可参考。 什么是幂等性? 幂等

    2024年02月15日
    浏览(27)
  • spring boot3token拦截器链的设计与实现

      ⛰️个人主页:     蒾酒 🔥系列专栏:《spring boot实战》 🌊山高路远,行路漫漫,终有归途。 目录 写在前面 流程分析 需要清楚的 实现步骤 1.定义拦截器 2.创建拦截器链配置类 3.配置拦截器链顺序 4.配置拦截排除项 最后 本文介绍了spring boot后端服务开发中有关如何设计

    2024年03月11日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包