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 2023年5月18日
    00
  • javaweb之web入门基础

    JavaWeb 之 Web 入门基础 简介 Java Web 是一种通过 Java 开发的应用程序,可通过互联网或局域网访问,具有可靠、安全和跨平台的特点,在互联网应用开发中具有广泛的应用。JavaWeb 主要分为三层:表现层、业务层、持久化层。其中,表现层主要负责用户交互和界面展示。 HTML 基础 HTML (Hypertext Markup Langu…

    Java 2023年5月19日
    00
  • java使用RandomAccessFile类基于指针读写文件实例代码

    下面是完整的“java使用RandomAccessFile类基于指针读写文件实例代码”的攻略: 1. RandomAccessFile类 RandomAccessFile类可以让我们在文件中进行读写操作,它支持在文件任意位置进行数据读写,因此它非常适用于对文件进行随机访问(Random Access)操作。RandomAccessFile类有两个构造方法: …

    Java 2023年6月1日
    00
  • 解决问题:Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources

    解决问题: Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources 这个问题通常出现在使用Maven构建项目时,执行了clean install命令,Maven在构建过程中提示如下错误: Failed to execute goal org.…

    Java 2023年6月2日
    00
  • Struts2的配置 struts.xml Action详解

    当我们用Struts2来开发Web应用程序时,需要进行相关的配置,其中最主要的配置文件就是struts.xml。在这个文件中,我们需要配置Action以及对应的Result、Interceptor等等。 下面是struts.xml的一个简单示例: <?xml version="1.0" encoding="UTF-8&qu…

    Java 2023年5月20日
    00
  • Spring MVC策略模式之MethodArgumentResolver源码解析

    Spring MVC 策略模式之 MethodArgumentResolver 源码解析 在 Spring MVC 中,MethodArgumentResolver 是一个非常重要的组件,它用于将请求参数转换为控制器方法的参数。MethodArgumentResolver 是 Spring MVC 策略模式的一部分,它通过实现 resolveArgument…

    Java 2023年5月18日
    00
  • 读取spring配置文件的方法(spring读取资源文件)

    读取Spring配置文件是开发Spring应用程序的基本操作之一。以下是一些读取Spring配置文件的方法: 1. 使用 ClassPathXmlApplicationContext 通过 ClassPathXmlApplicationContext 读取 Spring 配置文件是最常见的方法之一。ClassPathXmlApplicationContext…

    Java 2023年5月20日
    00
  • java分布式面试CAP分别代表含义分析

    下面是详细的讲解: 简介 CAP理论是分布式系统设计理论中重要的一个理论,其英文全称是Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性)。所谓的分区容错性指的是分布式系统中节点之间由于网络传输原因或其他意外情况,造成节点之间无法相互通信时,整个系统仍能正常运行。 三个含义 一致性(Con…

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