springMVC拦截器HandlerInterceptor用法代码示例

下面详细讲解一下“springMVC拦截器HandlerInterceptor用法代码示例”的完整攻略。

什么是HandlerInterceptor?

HandlerInterceptor是Spring MVC框架的拦截器,用于在controller处理请求之前和之后进行一些额外的处理。HandlerInterceptor是一个接口,需要自定义实现它,并将其注册为Spring中的Bean,以便在需要的地方执行。

HandlerInterceptor有三个拦截点:

  1. 在Controller之前执行preHandle()方法
  2. 在Controller之后,视图渲染之前执行postHandle()方法
  3. 在整个请求完成之后执行afterCompletion()方法

HandlerInterceptor的使用方法

1. 自定义HandlerInterceptor

HandlerInterceptor接口需要实现三个方法,它们的作用分别是:

  1. preHandle:该方法在Controller处理请求之前调用,返回值为true表示继续处理,返回false表示请求结束。

  2. postHandle:该方法在Controller处理请求之后,但在渲染视图之前调用。

  3. afterCompletion:该方法在整个请求完成之后调用,通常用于清理资源等操作。

以下是一个自定义的HandlerInterceptor示例:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class MyInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("preHandle method is calling");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle method is calling");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        System.out.println("afterCompletion method is calling");
    }

}

2. 注册HandlerInterceptor

要使用HandlerInterceptor,需要将其注册为Spring中的Bean。可以通过配置文件或Java代码将其注册。这里使用Java代码的方式进行注册。

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {

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

}

在上面的代码中,addInterceptor() 方法用于添加自定义的 HandlerInterceptor。addPathPatterns() 方法用于设置处理拦截器的路径模式,这里表示所有请求都会被拦截器处理。

3. 测试HandlerInterceptor

最后,我们需要测试一下 HandlerInterceptor 是否已经被正确配置。我们可以创建一个简单的Controller来测试拦截器是否被调用。

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String sayHello() {
        return "Hello, world!";
    }

}

如果一切正常,当我们访问 /hello 时,MyInterceptor 的 preHandle() 方法会被调用,并输出一条日志信息:

preHandle method is calling

HandlerInterceptor示例说明

下面我们以两个示例的方式说明 HandlerInterceptor 的使用方法。

示例一:实现用户登录拦截器

假设我们设计了一个在线商城的网站,用户需要登录才能购买商品。为了实现这个功能,我们可以写一个拦截器来检查用户是否已经登录。

首先,我们需要在登录成功之后,将用户信息存储在 Session 中。在之后的每个请求中,我们可以通过检查 Session 中是否存在用户信息来判断用户是否已经登录。如果 Session 中不存在用户信息,我们就重定向到登录页面。

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

在上面的代码中,我们实现了 LoginInterceptor 类,并覆盖了 preHandle() 方法。在该方法中,我们首先获取 HttpSession 对象,并通过 session.getAttribute("user") 方法获取用户信息。如果用户信息不存在,我们就重定向到登录页面。

然后我们需要在 WebMvcConfigurerAdapter 中注册该拦截器:

@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/order", "/cart");
    }
}

在上面的代码中,我们使用 addInterceptor() 方法注册 LoginInterceptor,并使用 addPathPatterns() 方法指定拦截路径,这里我们拦截了 /order 和 /cart 请求。

最后我们编写一个简单的 Controller 类进行测试:

@RestController
public class OrderController {
    @GetMapping("/order")
    public String order() {
        return "Please login first.";
    }

    @GetMapping("/cart")
    public String cart() {
        return "Please login first.";
    }
}

如果用户已经登录,访问 /order 或 /cart 将会返回页面内容。如果用户没有登录,这些请求将会被重定向到登录页面。

示例二:实现IP地址限制拦截器

假设我们需要进行限制,使得仅特定IP地址能够访问我们的某些接口。我们可以编写一个拦截器来检查请求的 IP 地址是否合法,如果不合法,就返回一个错误信息或直接拒绝该请求。

public class IPInterceptor implements HandlerInterceptor {
    private List<String> allowedIPs;

    public IPInterceptor(List<String> allowedIPs) {
        this.allowedIPs = allowedIPs;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String ipAddress = request.getRemoteAddr();
        if (!allowedIPs.contains(ipAddress)) {
            response.getWriter().println("Your IP address is not allowed to access the website.");
            response.setStatus(HttpStatus.UNAUTHORIZED.value());
            return false;
        }
        return true;
    }
}

在上面的代码中,我们实现了 IPInterceptor 类,并覆盖了 preHandle() 方法。在该方法中,我们首先获取请求的 IP 地址,然后比对它是否在白名单之内,如果不在就直接拒绝该请求。

然后我们需要在 WebMvcConfigurerAdapter 中注册该拦截器:

@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {
    @Value("${ip.white.list}")
    private String[] allowedIPs;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new IPInterceptor(Arrays.asList(allowedIPs))).addPathPatterns("/admin/**");
    }
}

在上面的代码中,我们使用 addInterceptor() 方法注册 IPInterceptor,并使用 addPathPatterns() 方法指定需要拦截的路径,这里我们拦截了 /admin/ 目录下的所有请求。

最后我们编写一个简单的 Controller 类进行测试:

@RestController
@RequestMapping("/admin")
public class AdminController {
    @GetMapping("/users")
    public String users() {
        return "List of all users.";
    }

    @GetMapping("/orders")
    public String orders() {
        return "List of all orders.";
    }
}

如果用户的IP地址在白名单内,访问 /admin/users 或 /admin/orders 将会返回页面内容。如果用户的IP地址不在白名单内,将会返回一个错误信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springMVC拦截器HandlerInterceptor用法代码示例 - Python技术站

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

相关文章

  • Java数组队列概念与用法实例分析

    Java数组队列概念与用法实例分析 什么是队列 队列是一种特殊的线性数据结构,它的特殊之处在于它的插入和删除操作只能在队列的两端进行。从队列的一端插入元素可以称为“入队”,而从另一端删除元素则称为“出队”。 Java中的数组队列 Java中的数组队列是一种具体的队列实现方式。它内部使用数组作为底层数据结构,并支持动态扩容。在Java中可以使用Queue接口来…

    Java 2023年5月26日
    00
  • 最新springboot中必须要了解的自动装配原理

    Spring Boot是一个基于Spring框架的快速开发框架,它通过自动装配来简化了Spring应用程序的配置。在最新的Spring Boot中,自动装配原理是必须要了解的。以下是最新Spring Boot中必须要了解的自动装配原理的完整攻略: 自动装配原理概述 自动装配是Spring Boot的核心特性之一,它通过自动扫描和自动配置来简化Spring应用…

    Java 2023年5月15日
    00
  • 一分钟掌握Java Quartz定时任务

    一分钟掌握Java Quartz定时任务攻略 Java Quartz是一款轻量级的定时任务调度框架,它的使用非常简单,可以让开发者快速地实现定时任务调度。 Quartz的入门 在使用Quartz之前,需要先将Quartz的jar包导入到项目中。这里我们使用Maven进行依赖管理,只需要在pom.xml文件中增加如下依赖: <dependency>…

    Java 2023年5月20日
    00
  • 浅谈jsp文件和HTML互相引入的乱码问题

    来讲解一下如何解决jsp文件和HTML互相引入的乱码问题。 1. 问题背景 在jsp文件中,我们经常需要嵌入html页面,即在jsp文件中引入html文件。但是在引入的过程中,经常会出现乱码的情况。 比如,在一个jsp文件中引入一个html文件: <%@ page contentType="text/html;charset=UTF-8&qu…

    Java 2023年5月20日
    00
  • springboot返回前端中文乱码的解决

    下面是详细的“springboot返回前端中文乱码的解决”的攻略: 问题产生的原因 在SpringBoot中,我们通常使用@RestController注解来声明一个RESTful风格的控制器,同时还使用了@RequestParam来获取前端传入的中文参数。然而,当我们返回中文字符串给前端时,很容易遇到返回结果乱码的问题。这是因为SpringBoot默认使用…

    Java 2023年5月27日
    00
  • redis lua限流算法实现示例

    下面是“redis lua限流算法实现示例”的完整攻略。 1. 算法介绍 在互联网的系统设计中,经常需要对流量进行限制,以保证系统的稳定性。而Redis作为流行的内存数据库之一,通过其高性能的原子操作和丰富的数据结构,可以很好地支持限流算法的实现。本文将介绍一种常见的限流算法:令牌桶算法,并通过Redis中的lua脚本实现。 令牌桶算法是一种经典的流量控制算…

    Java 2023年5月19日
    00
  • JAVA读取文件流,设置浏览器下载或直接预览操作

    让我来详细讲解如何使用Java读取文件流并设置浏览器下载或直接预览操作。 1. 读取文件流 Java读取文件流可以使用java.io包中的FileInputStream类。该类提供了多种读取文件流的方式。 示例1:直接读取文件流 import java.io.File; import java.io.FileInputStream; import java.…

    Java 2023年5月19日
    00
  • Java Collection集合的三种遍历方式详解

    Java Collection集合的三种遍历方式详解 在Java中,集合(Collection)是一种常见的数据结构,常用于存储、操作一组对象的场景中。集合提供了多种遍历方式,本文将详细介绍三种常见的遍历方式及其区别。 遍历方式一:for循环 for循环是最常见的遍历方式,它适用于所有类型的集合。使用for循环遍历集合需要以下步骤: for (Iterato…

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