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日

相关文章

  • Java 实现栈的三种方式

    下面是详细讲解“Java 实现栈的三种方式”的完整攻略。 1. 栈的概述 栈(Stack)是一种常见的操作系统模型,具有“先进后出”(Last In First Out)的特点。栈被广泛应用于函数调用、表达式求值、程序递归等领域,是算法和数据结构中必不可少的基本数据结构之一。 栈的基本操作包含了入栈(push)、出栈(pop)、获取栈顶元素(peek)等。实…

    Java 2023年5月18日
    00
  • Mac系统中Apache Tomcat安装配置

    下面是 “Mac系统中Apache Tomcat安装配置” 的完整攻略: 准备工作 在开始安装和配置Apache Tomcat之前,需要确保你的Mac系统上已经安装了Java环境。同时,你需要知道以下几个信息: Apache Tomcat的版本号(例如8.5.65) Apache Tomcat的安装路径(例如/usr/local/tomcat) 安装Apac…

    Java 2023年5月19日
    00
  • SpringBoot+Hibernate实现自定义数据验证及异常处理

    下面将为您讲解“SpringBoot+Hibernate实现自定义数据验证及异常处理”的完整攻略。 一、概述 在一个Web应用中,对用户提交的数据进行数据验证和异常处理是非常重要的。本文将介绍如何使用SpringBoot和Hibernate实现自定义的数据验证及异常处理。 二、自定义数据验证 1. Hibernate validator 在SpringBoo…

    Java 2023年5月20日
    00
  • javaweb在线支付功能实现代码

    下面是“javaweb在线支付功能实现代码”的完整攻略。 确定支付方式和接口 首先需要确定网站支持哪些支付方式,例如支付宝、微信支付等,然后根据支付方式找到相应的支付接口,例如支付宝的即时到账接口或者微信支付的统一下单接口。 创建订单 在用户确认需要支付时,需要创建对应的订单并保存到数据库中。订单包含以下信息: 订单号:唯一标识该订单 商品名称:用户购买的商…

    Java 2023年6月15日
    00
  • 基于Spring MVC 简介及入门小例子(推荐)

    以下是关于“基于Spring MVC 简介及入门小例子(推荐)”的完整攻略,其中包含两个示例。 1. 前言 Spring MVC是一种常用的Java Web开发框架,其核心思想是基于MVC模式来实现Web应用程序的开发。本攻略将详细讲解Spring MVC的基本概念和使用方法,帮助读者快速入门Spring MVC框架。 2. Spring MVC基本概念 以…

    Java 2023年5月16日
    00
  • java求数组最大值和最小数示例分享

    Java求数组最大值和最小值示例分享 在Java开发中,我们经常需要对数组中的元素进行操作。其中,求出数组的最大值和最小值是常见操作之一。下面我们将会介绍两种不同的方法来求数组的最大值和最小值。 方法一: 遍历比较法 遍历比较法是一种简单粗暴的方法。我们可以通过循环遍历数组中的每一个元素,并且在遍历的过程中与当前的最大值或最小值进行比较。当我们遍历完整个数组…

    Java 2023年5月26日
    00
  • Jvm调优和SpringBoot项目优化的详细教程

    Jvm调优和SpringBoot项目优化的详细教程 在开发Java应用程序时,我们需要对JVM进行调优,以提高应用程序的性能和稳定性。同时,我们也需要对Spring Boot应用程序进行优化,以提高应用程序的响应速度和可靠性。本文将详细讲解如何进行JVM调优和Spring Boot项目优化。 Jvm调优 步骤一:设置JVM参数 我们需要设置JVM参数来调优J…

    Java 2023年5月15日
    00
  • 使用JavaScript实现Java的List功能(实例讲解)

    我们来详细讲解如何使用JavaScript实现Java的List功能。 1. 确定需求 首先我们需要确定需求,即实现一个类似于Java中的List的数据结构,可以用来存放一组数据,并且可以对数据进行添加、删除、修改、查找等操作。 2. 设计数据结构 接下来我们需要设计数据结构,在这里我们可以使用JavaScript中的数组来实现List功能。通过数组,我们可…

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