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日

相关文章

  • 35道SpringBoot面试题及答案(小结)

    下面是对于 “35道SpringBoot面试题及答案(小结)” 的详细讲解: 概述 该篇文章主要包含了35道关于Spring Boot的面试题及详细的答案解析,可以帮助读者更好地了解Spring Boot的使用和原理。同时也适用于准备面试的读者,可以通过该篇文章来检验自身的学习掌握情况以及提高面试通过率。 答案解析 文章主要分为以下几个部分: Spring …

    Java 2023年5月15日
    00
  • Java中Arraylist的最大长度

    Java中ArrayList的最大长度 简介 ArrayList是Java中非常常用的数据结构,它是可变长度的数组。ArrayList最大长度由内存大小决定。当数组长度大于内存大小时,便会抛出OutOfMemoryError异常。 ArrayList的初始化长度 初始化ArrayList时可以指定其大小,如下所示: ArrayList<String&g…

    Java 2023年5月26日
    00
  • SpringMVC基于注解方式实现上传下载

    SpringMVC基于注解方式实现上传下载 SpringMVC是一种基于Java的Web框架,它可以帮助我们快速地开发Web用程序。本文将详细介绍如何使用SpringMVC基于注解方式实现上传下载,并提供两个示例说明。 上传文件 在SpringMVC中,我们可以使用MultipartFile类来处理上传的文件。以下是一个上传文件的示例。 步骤1:配置web.…

    Java 2023年5月17日
    00
  • Hibernate+JDBC实现批量插入、更新及删除的方法详解

    Hibernate+JDBC实现批量插入、更新及删除的方法详解 本文将介绍如何使用Hibernate+JDBC实现批量插入、更新及删除数据的方法。 数据库连接 首先,我们需要在Hibernate的配置文件中配置数据库连接信息,以便在后续操作中使用: <property name="hibernate.connection.driver_cla…

    Java 2023年5月20日
    00
  • JDBC下Idea添加mysql-jar包的详细过程

    JDBC是Java语言操作关系型数据库的标准API,目前已经成为了Java中最流行的访问数据库的方式之一,因此在开发Java应用程序时,经常需要使用JDBC操作数据库。 而在使用Idea开发Java应用程序时,需要添加mysql-jar包才能够操作MySQL数据库。以下是JDBC下Idea添加mysql-jar包的详细过程: 下载mysql-jar包 首先,…

    Java 2023年6月16日
    00
  • SSH 框架简介

    SSH框架简介 SSH框架是一种基于Java的web开发框架,它整合了Struts, Spring 和 Hibernate 三个优秀的开源框架,并提供了一系列的组件来支持Web应用的开发和部署。 SSH框架的三个组成部分 Struts Struts是一款广泛应用于Web应用开发中的MVC框架,它的目的是将业务逻辑、数据和展现层分离出来,提高应用程序的可拓展性…

    Java 2023年5月20日
    00
  • 详解美团实现搜索关键词自动匹配功能的方法

    以下是详解美团实现搜索关键词自动匹配功能的方法的完整攻略: 介绍 美团实现搜索关键词自动匹配功能的方法可分为两个方面:前端交互和后端搜索引擎的支持,下面将对这两个方面一一解释。 前端交互 前端交互实现起来比较简单,主要分为以下两个步骤: 1. 给输入框添加键盘监听事件 这个步骤的意思是监听用户在输入框中的输入,并将输入的内容发送到后端搜索引擎进行匹配。代码如…

    Java 2023年5月19日
    00
  • 详解SpringMVC从基础到源码

    以下是关于“详解SpringMVC从基础到源码”的完整攻略,其中包含两个示例。 详解SpringMVC从基础到源码 SpringMVC是一个基于MVC模式的Web框架,它提供了一种灵活、高效的方式来开发Web应用程序。在本攻略中,我们将从基础概念到源码实现,全面讲解SpringMVC的工作原理和实现细节。 SpringMVC基础概念 MVC模式 MVC模式是…

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