SpringMVC自定义拦截器实现过程详解

下面是SpringMVC自定义拦截器实现的详细攻略。

什么是拦截器?

拦截器(Interceptor)是SpringMVC框架提供的用于处理请求的一种机制。拦截器在处理请求的过程中,可以在Controller之前或之后执行一些共同的操作,如记录日志、检查用户权限、对请求参数进行统一预处理等等。拦截器类似于Servlet的过滤器(Filter),不同的是拦截器可以选择性地进行拦截。

实现过程

第一步:创建拦截器类

拦截器是一个类,需要实现HandlerInterceptor接口,并实现其中的三个方法:

  • preHandle:在请求处理之前执行,返回值为布尔类型。如果返回true,则继续执行请求;如果返回false,则停止执行请求,直接返回响应。
  • postHandle:在请求处理之后执行,但未返回响应之前。可以进行一些request,response的后处理操作。
  • afterCompletion:在请求处理之后执行,包括返回响应之后。一般用于资源清理等操作。
public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        // 处理逻辑
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        // 处理逻辑
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        // 处理逻辑
    }
}

第二步:配置拦截器

  1. 创建配置类

创建一个配置类,用于配置拦截器。

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 添加拦截器
        registry.addInterceptor(new MyInterceptor()).addPathPatterns("/**");
    }
}

上面的代码中,我们新建一个类InterceptorConfig,并实现了WebMvcConfigurer接口,重写了addInterceptors方法。在这个方法中,我们可以添加自己的拦截器。

  1. 配置拦截器类

将拦截器和配置类联系起来,我们需要在Web应用程序的配置文件(一般是JavaConfig 或 XML)中注册我们的拦截器配置类。比如,在SpringBoot工程中,我们可以新建一个类InterceptorConfig,加上@Configuration注解,代码如下:

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Bean
    public MyInterceptor myInterceptor(){
        return new MyInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(myInterceptor()).addPathPatterns("/**");
    }

}

上面的代码中,我们新建了一个名为“myInterceptor”的拦截器类。在addInterceptors方法中,我们添加了myInterceptor并设置了拦截的路径为“/**”。

第三步:测试拦截器

测试拦截器的效果,我们可以创建一个简单的Controller,用于测试。代码如下:

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(){
        return "Hello,MVC";
    }
}

我们可以使用Postman或者浏览器访问http://localhost:8080/hello,预期拦截器的功能能够正确地进行拦截处理。

示例一:拦截未登录用户访问

在上面这个例子中,我们新建一个MyInterceptor拦截器用于处理请求。下面我们来看一个更实际的例子吧,在我们平常的网站系统中,需要对未登录的用户进行拦截,如果未登录则跳转到登录页面进行登录后再进行访问。

public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        HttpSession session = request.getSession();
        Object object = session.getAttribute("user");
        if (object == null) {
            response.sendRedirect("/login/loginPage");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }
}

上述代码中,我们定义了一个LoginInterceptor拦截器,用于拦截未登录的请求。在preHandle方法中,我们通过HttpSession来获取用户的登录状态。如果用户没有登录,则重定向到登录页面,否则继续执行请求。另外两个方法不做处理,保持默认即可。

我们将LoginInterceptor添加到配置文件中,配置类代码如下:

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Bean
    public LoginInterceptor loginInterceptor() {
        return new LoginInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginInterceptor()).addPathPatterns("/**").excludePathPatterns("/login/loginPage", "/login");
    }
}

上述代码中,我们将LoginInterceptor添加到配置文件中,配置了拦截器的路径为“/**”,即所有请求都需要进行拦截。但我们需要排除登录的请求(即“/login/loginPage”和“/login”),不进行拦截处理。

示例二:拦截非法字符

我们再来看一个示例,在我们的网站系统中,给用户提供评论的功能,但是我们不允许用户输入敏感字符,这时候我们可以用拦截器对用户输入的评论进行过滤。

public class CommentInterceptor implements HandlerInterceptor {

    private static final String REGEX = ".*渣.*|.*垃圾.*|.*差评.*|.*欠揍.*|.*好评.*|.*五星.*";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String comment = request.getParameter("comment");
        if (StringUtils.isNotBlank(comment) && comment.matches(REGEX)) {
            throw new RuntimeException("包含非法字符,请勿输入敏感字眼!");
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
    }
}

上述代码中,我们定义了一个CommentInterceptor拦截器,用于拦截用户评论中是否包含敏感字符。在preHandle方法中,我们获取用户评论的内容,并进行正则匹配。如果匹配到了敏感字符,我们抛出一个异常。

我们将CommentInterceptor添加到配置文件中,配置类代码如下:

@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

    @Bean
    public CommentInterceptor commentInterceptor() {
        return new CommentInterceptor();
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(commentInterceptor()).addPathPatterns("/comment");
    }
}

上述代码中,我们将CommentInterceptor添加到配置文件中,配置了拦截器的路径为“/comment”,即评论请求需要进行拦截。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringMVC自定义拦截器实现过程详解 - Python技术站

(0)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • 基于Ajax技术实现考试倒计时并自动提交试卷

    实现基于Ajax技术的考试倒计时并自动提交试卷,主要分为以下几个步骤: 前端设计:基于HTML、CSS和JavaScript实现考试页面的布局和倒计时功能,并设置提交试卷的按钮。 示例代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"&g…

    Java 2023年6月15日
    00
  • Java比较器实现方法项目案例

    我来为您介绍如何实现Java比较器的方法。具体攻略请见下文: Java比较器实现方法项目案例 什么是Java比较器 Java中的比较器是一种用于比较两个对象的工具,它可以定制比较规则,让对象按照特定的顺序进行排序。比较器主要使用在集合框架中,例如TreeSet和TreeMap等需要元素进行排序的类。 在Java中,比较器主要有两种实现方式:一种是实现Comp…

    Java 2023年5月19日
    00
  • JavaScript实现简易登录注册页面

    针对“JavaScript实现简易登录注册页面”的完整攻略,我将按照以下方式进行讲解: 确定页面元素和功能 实现登录和注册功能 数据存储和验证 示例说明 确定页面元素和功能 在实现登录注册功能之前,我们需要先明确需要哪些页面元素和功能。通常登录注册页面需要的元素包括: 用户名输入框 密码输入框 登录按钮 注册按钮 其中登录按钮需要进行用户名和密码验证,如果验…

    Java 2023年6月15日
    00
  • SpringBoot实现线程池

    下面是SpringBoot实现线程池的完整攻略: 1. 什么是线程池 线程池是一种多线程处理的实现方式,简单来说就是在程序启动时提前创建好一定数量的线程,在需要处理多任务时就从线程池中调用空闲线程执行,任务执行完成后又返回线程池。这样避免了频繁的创建和销毁线程的开销,提高了程序执行效率。 2. SpringBoot实现线程池 Spring Boot中提供了T…

    Java 2023年5月19日
    00
  • Spring源码阅读MethodInterceptor解析

    我会为你提供一份详细的“Spring源码阅读MethodInterceptor解析”的攻略。 Spring源码阅读MethodInterceptor解析 概述 Spring框架的核心功能是基于面向切面编程(AOP)技术实现的,而MethodInterceptor是AOP中最有代表性的接口之一。本文将对MethodInterceptor进行深入分析。 什么是M…

    Java 2023年5月31日
    00
  • Java-lambda表达式入门看这一篇就够了

    Java-lambda表达式入门看这一篇就够了 什么是Lambda表达式? Lambda表达式是Java 8的新特性,它允许我们以更简洁的方式编写匿名内部类,使代码更易读易写。Lambda表达式本质上就是一个函数,不需要写函数名,可以传递到需要函数式接口的任何地方。Lambda表达式由参数列表、箭头符号和函数体组成,其中箭头符号可以理解为“传递至”的意思,函…

    Java 2023年5月26日
    00
  • java使用Dijkstra算法实现单源最短路径

    Java使用Dijkstra算法实现单源最短路径攻略 算法简介 Dijkstra算法是一种经典的计算图的单源最短路径的算法。它的基本思想是从起始点开始,首先确定该点到其他所有点的最短距离,然后以最短距离作为中介点,依次直到所有点的最短路径都被确定。Dijkstra算法主要应用在网络路由、航空等行业中。 算法步骤 将图中节点分为两个集合:已确定路径的节点集合和…

    Java 2023年5月19日
    00
  • java随机生成字符串(字符随机生成类 生成随机字符组合)

    生成随机的字符串在Java开发中是比较常见的需求,可以用于验证码生成、密码加密等场景。下面是一个完整的攻略,可以让您方便地实现这一功能。 1. 使用Java内置库实现随机字符串 Java提供了一个类 java.util.UUID,使用该类可以方便地生成随机的字符串。UUID是根据时间戳、硬件地址等信息生成的一串字符串,具有很高的唯一性。 示例代码如下: im…

    Java 2023年5月26日
    00
合作推广
合作推广
分享本页
返回顶部