springboot 拦截器

该文章详细介绍了如何在SpringBoot项目中创建并使用拦截器。首先,自定义了LoginInterceptor,检查session中的uid来判断是否需要重定向到登录页面。其次,通过@Configuration注解的LoginInterceptorConfigurer类注册拦截器,并设置拦截所有请求。最后,排除静态资源和特定URL,避免它们被拦截。测试显示未登录用户访问受保护页面会被重定向至登录页面。

在 Spring Boot 项目中,使用拦截器功能通常需要以下 3 步:

  1. 定义拦截器;

  1. 注册拦截器;

  1. 指定拦截规则(如果是拦截所有,静态资源也会被拦截)。

第一步:自定义拦截器

package com.cy.store.interceptor;

import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

public class LoginInterceptor implements HandlerInterceptor {

/**

* 检测全局session对象中是否有uid数据,如果有则放行,如果没有重定向到登录页面

* @param request 请求对象

* @param response 响应对象

* @param handler 处理器(url+controllor:映射)

* @return 如果返回值true 放行 如果是false则表示拦截,重定向到登录页面

* @throws Exception

*/

@Override

public boolean preHandle(HttpServletRequest request,

HttpServletResponse response,

Object handler) throws Exception {

// HttpServletRequest对象获取session对象

Object obj = request.getSession().getAttribute("uid");

if(obj == null){

//说明用户没有登录过系统,则重定向到login.html页面

response.sendRedirect("/web/login.html");

//结束后续的调用

return false;

}

// 请求放行

return true;

}

}

第二步:注册拦截器(需要@Configuration注解,自动注入,否则不生效

package com.cy.store.config;

import com.cy.store.interceptor.LoginInterceptor;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;

import java.util.List;

@Configuration

public class LoginInterceptorConfigurer implements WebMvcConfigurer {

// 将自定义拦截器注册

@Override

public void addInterceptors(InterceptorRegistry registry) {

HandlerInterceptor interceptor = new LoginInterceptor();

registry.addInterceptor(interceptor) .addPathPatterns("/**")

}

}

第三步:指定拦截规则

package com.cy.store.config;

import com.cy.store.interceptor.LoginInterceptor;

import org.springframework.context.annotation.Configuration;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.config.annotation.InterceptorRegistry;

import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.ArrayList;

import java.util.List;

@Configuration

public class LoginInterceptorConfigurer implements WebMvcConfigurer {

// 将自定义拦截器注册

@Override

public void addInterceptors(InterceptorRegistry registry) {

HandlerInterceptor interceptor = new LoginInterceptor();

//配置白名单,存到一个集合中

List<String> patterns = new ArrayList<>();

patterns.add("/bootstrap3/**");

patterns.add("/css/**");

patterns.add("/images/**");

patterns.add("/js/**");

patterns.add("/web/register.html");

patterns.add("/web/login.html");

patterns.add("/web/index.html");

patterns.add("/web/product.html");

patterns.add("/users/reg");

patterns.add("/users/login");

registry.addInterceptor(interceptor)

.addPathPatterns("/**") // 拦击所有

.excludePathPatterns(patterns); //排除参数外的都拦截

}

}

项目目录

测试:登入http://localhost:***/web/password.html,会跳转到登入页面http://localhost:***/web/login.html

Spring Boot 中创建和配置拦截器是一个相对简单的过程,可以通过以下步骤实现: ### 创建自定义拦截器 1. **创建拦截器类** 自定义拦截器可以通过实现 `HandlerInterceptor` 接口或继承 `HandlerInterceptorAdapter` 类来完成。拦截器的主要方法包括: - `preHandle()`:在 Controller 方法执行之前调用,返回值为 `true` 表示继续执行后续流程,`false` 表示中断请求。 - `postHandle()`:在 Controller 方法执行之后、视图渲染之前调用。 - `afterCompletion()`:在整个请求完成之后(视图渲染结束)调用,可用于资源清理等操作。 示例代码如下: ```java import org.springframework.web.servlet.HandlerInterceptor; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 在 Controller 方法执行前执行 System.out.println("preHandle 方法执行"); return true; // 返回 true 表示继续后续流程 } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 在 Controller 方法执行后、视图渲染前执行 System.out.println("postHandle 方法执行"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 在整个请求完成之后执行 System.out.println("afterCompletion 方法执行"); } } ``` 2. **配置拦截器** 需要创建一个 Java 配置类,实现 `WebMvcConfigurer` 接口,并重写 `addInterceptors` 方法,将自定义拦截器注册Spring Boot拦截器链中。 示例代码如下: ```java import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.InterceptorRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { // 添加自定义拦截器,并指定拦截路径 registry.addInterceptor(new MyInterceptor()) .addPathPatterns("/**") // 拦截所有请求 .excludePathPatterns("/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**"); // 排除特定路径 } } ``` 3. **拦截器的作用范围** - `addPathPatterns("/**")` 表示拦截所有请求路径。 - `excludePathPatterns(...)` 可以指定一些不需要拦截的路径,例如登录页面、静态资源等。 - 通过这种方式,可以灵活地控制拦截器的作用范围,避免对某些特定请求造成干扰。 4. **注意事项** - 在较新的 Spring Boot 版本中,建议直接实现 `WebMvcConfigurer` 接口,而不是继承 `WebMvcConfigurerAdapter` 类,因为后者在 Spring Boot 5 中已被标记为过时。 - 拦截器类可以放在 `config` 包下,或者与主应用类在同一目录下,以确保 Spring Boot 能够正确扫描到该类。 ### 拦截器的工作流程 拦截器的执行顺序如下: 1. `preHandle()`:在 Controller 方法执行之前执行。 2. Controller 方法执行。 3. `postHandle()`:在 Controller 方法执行之后、视图渲染之前执行。 4. `afterCompletion()`:在整个请求完成之后执行,通常用于清理资源。 通过拦截器,可以实现对请求的统一处理,例如权限校验、日志记录、请求时间统计等功能。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值