赞
踩
拦截器通常用于处理业务逻辑相关的拦截,如权限检查、日志记录、事务管理等,更适合需要访问Spring容器中Bean的场景。
目录
创建springboot项目,最终项目结构如下:
pom文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.softeem</groupId>
- <artifactId>springboot</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <name>springboot</name>
- <description>Demo project for Spring Boot</description>
- <properties>
- <java.version>1.8</java.version>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <spring-boot.version>2.6.13</spring-boot.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
-
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <dependencyManagement>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-dependencies</artifactId>
- <version>${spring-boot.version}</version>
- <type>pom</type>
- <scope>import</scope>
- </dependency>
- </dependencies>
- </dependencyManagement>
-
- <build>
- <plugins>
- <plugin>
- <groupId>org.apache.maven.plugins</groupId>
- <artifactId>maven-compiler-plugin</artifactId>
- <version>3.8.1</version>
- <configuration>
- <source>1.8</source>
- <target>1.8</target>
- <encoding>UTF-8</encoding>
- </configuration>
- </plugin>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- <version>${spring-boot.version}</version>
- <configuration>
- <mainClass>com.softeem.springboot.SpringbootApplication</mainClass>
- <skip>true</skip>
- </configuration>
- <executions>
- <execution>
- <id>repackage</id>
- <goals>
- <goal>repackage</goal>
- </goals>
- </execution>
- </executions>
- </plugin>
- </plugins>
- </build>
-
- </project>
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
实现Spring MVC框架中的HandlerInterceptor接口。这个接口是用来定义请求处理过程中的拦截器,可以在请求被处理之前、之后以及完成后执行一些自定义的操作。
- public class UserInterceptor implements HandlerInterceptor {
-
- @Override
- public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
- System.out.println("进入拦截器---------------------------");
- //编写业务拦截的规则
- User user = (User) request.getSession().getAttribute("user");
-
- if (user == null){
- response.sendRedirect(request.getContextPath() + "/user/error");
- 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 {
-
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
设置拦截器(Interceptor)以实现特定的请求处理逻辑。
- @Configuration //定义此类为配置文件(即相当于之前的xml配置文件)
- public class InterceptorConfig implements WebMvcConfigurer {
-
- //mvc:interceptors
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- //要拦截user下的所有访问请求,必须用户登录后才可访问,
- // 但是这样拦截的路径中有一些是不需要用户登录也可访问的
- String[] addPathPatterns = {
- "/user/**"
- };
- //要排除的路径,排除的路径说明不需要用户登录也可访问
- String[] excludePathPatterns = {
- "/user/out", "/user/error","/user/login"
- };
- //mvc:interceptor bean class=""
- registry.addInterceptor(new UserInterceptor()).
- addPathPatterns(addPathPatterns).
- excludePathPatterns(excludePathPatterns);
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
详解:
类定义与注解
方法重写:addInterceptors
拦截规则定义
注册拦截器
- @RestController
- @RequestMapping("/user")
- public class UserController {
-
- @RequestMapping("/login")
- public String login(){
- return "login success";
- }
-
- @RequestMapping("/center")
- public String center() {
- return "我被拦截了...不能显示";
- }
-
- @RequestMapping("/out")
- public String out(HttpSession session) {
- session.invalidate();
- return "我被排除拦截...可以显示 user/out";
- }
-
- //如果用户未登录访问了需要登录才可访问的请求,之后会跳转至该请求路径
- //该请求路径不需要用户登录也可访问
- @RequestMapping("/error")
- public String error() {
- return "被拦截:error";
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
上述配置类中将"/user/out", "/user/error","/user/login"排除掉了
首先尝试访问/user/out
访问user/center
被拦截且跳转user/error
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。