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 2023年5月26日
    00
  • java常见log日志的使用方法解析

    Java常见log日志的使用方法解析 在Java中,使用log日志来记录系统运行时产生的事件和错误信息十分重要。它可以帮助开发者快速定位问题并解决,提高开发效率。本文将介绍Java常见log日志的使用方法,希望对Java开发者有所帮助。 一、Java常见Log日志框架 Java常见的Log日志框架有java.util.logging、log4j、logbac…

    Java 2023年5月26日
    00
  • JDBC连接Access数据库的几种方式介绍

    下面我将为您详细介绍JDBC连接Access数据库的几种方式。 一、JDBC-ODBC桥连接 JDBC-ODBC桥连接是最常见的连接Access数据库的方式,它通过将Java程序中的JDBC调用转换为ODBC调用来实现与Access数据库的连接。 步骤: 在Windows中打开ODBC数据源管理器,添加一个Access数据库数据源。 在Java代码中使用JD…

    Java 2023年6月16日
    00
  • Java CompletableFuture 异步超时实现深入研究

    《Java CompletableFuture 异步超时实现深入研究》介绍了如何通过 CompletableFuture 类实现异步操作的超时控制,通过本文可以深入了解 CompletableFuture 的超时机制,并实现项目开发中常用的异步超时场景。 本文包含以下内容: 1. CompletableFuture 简介 在Java 8中,引入了 Compl…

    Java 2023年5月27日
    00
  • 详解Spring与Mybatis的整合方法(基于Eclipse的搭建)

    下面是详细讲解“详解Spring与Mybatis的整合方法(基于Eclipse的搭建)”的完整攻略。 准备工作 首先要确保Eclipse中已经安装好Spring和Mybatis的插件(可以在“Marketplace”中搜索安装)。然后需要准备好数据库和相关的配置文件。 整合步骤 新建Maven项目,选择需要的包和依赖。 新建数据库,在Mybatis的配置文件…

    Java 2023年5月19日
    00
  • JDBC常用接口总结

    对于JDBC常用接口总结的完整攻略,首先我们需要了解下JDBC的基本概念和使用的流程。JDBC即Java Database Connectivity,它是一种用于处理Java与数据库之间连接通讯的API。在Java中,我们可以使用JDBC与各种数据库进行交互,常见的包括MySQL、Oracle、SQL Server等。 在使用JDBC时,我们需要依次完成以下…

    Java 2023年5月20日
    00
  • Java servlet执行流程代码实例

    Java Servlet是Java编写的服务器端程序,它可以接收来自客户端(如浏览器、Android等)的请求并生成响应,通常用于开发Web应用程序。本篇攻略将详细讲解Java Servlet执行流程,并提供两个示例代码来说明。 Servlet执行流程 任何一个Servlet处理一个客户端请求的完整处理过程,都可以分为6个步骤: 客户端向服务器发送请求。 服…

    Java 2023年6月15日
    00
  • gateway、webflux、reactor-netty请求日志输出方式

    为了让大家更好地了解 “gateway、webflux、reactor-netty请求日志输出方式”,我将分别讲解这三个主题,并提供相应的示例代码,在此之前,请确保已经安装好了Java环境,并了解基本的Spring Boot框架。 Gateway请求日志输出方式 Gateway是Spring Cloud的组件之一,可以将多个微服务组合起来作为一个整体对外提供…

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