当前位置: 首页 > news >正文

Spring Boot拦截器

我们对拦截器并不陌生,无论是 Struts 2 还是 Spring MVC 中都提供了拦截器功能,它可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能上。Spring Boot 同样提供了拦截器功能。 

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

  1. 定义拦截器;
  2. 注册拦截器;
  3. 指定拦截规则(如果是拦截所有,静态资源也会被拦截)。

定义拦截器

在 Spring Boot 中定义拦截器十分的简单,只需要创建一个拦截器类,并实现 HandlerInterceptor 接口即可。

HandlerInterceptor  接口中定义以下 3 个方法,如下表。

返回值类型方法声明描述
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作,返回 true 表示继续向下执行,返回 false 表示中断后续操作。
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 该方法在控制器处理请求方法调用之后、解析视图之前执行,可以通过此方法对请求域中的模型和视图做进一步修改。
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) 该方法在视图渲染结束后执行,可以通过此方法实现资源清理、记录日志信息等工作。
示例1
 在项目的包net.biancheng.www.componet 下创建一个名为 LoginInterceptor 的拦截器类,对登陆进行拦截,代码如下。
 
package net.biancheng.www.componet;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Slf4j
public class LoginInterceptor implements HandlerInterceptor {
/** * 目标方法执行前 * * @param request * @param response * @param handler * @return * @throws Exception */
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser == null) {
//未登录,返回登陆页
request.setAttribute("msg", "您没有权限进行此操作,请先登陆!");
request.setAttribute("myinfo", "我们在研究拦截器!");
request.getRequestDispatcher("/index.html").forward(request, response);
return false;
} else {
//放行 return true;
}
}
/** * 目标方法执行后
* * @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle执行{}", modelAndView);
}
/** * 页面渲染后
* * @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion执行异常{}", ex);
}
}
 

注册拦截器

创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),重写 addInterceptors() 方法,并在该方法中调用 registry.addInterceptor() 方法将自定义的拦截器注册到容器中。

示例 2

在配置类 MyMvcConfig 中,添加以下方法注册拦截器,代码如下。

@Configuration

public class MyMvcConfig implements WebMvcConfigurer {

@Override

public void addInterceptors(InterceptorRegistry registry) {

registry.addInterceptor(new LoginInterceptor());

}

}

指定拦截规则

修改 MyMvcConfig 配置类中 addInterceptors() 方法的代码,继续指定拦截器的拦截规则,代码如下。

@Override
public void addViewControllers(ViewControllerRegistry registry) {
//当访问 “/” 或 “/index.html” 时,都直接跳转到登陆页面
registry.addViewController("/").setViewName("login");
registry.addViewController("/index.html").setViewName("login");
//添加视图映射 main.html 指向  dashboard.html
registry.addViewController("/main.html").setViewName("main");
}

在指定拦截器拦截规则时,调用了两个方法,这两个方法的说明如下:

  • addPathPatterns:该方法用于指定拦截路径,例如拦截路径为“/**”,表示拦截所有请求,包括对静态资源的请求。
  • excludePathPatterns:该方法用于排除拦截路径,即指定不需要被拦截器拦截的请求。

 

配置类 MyMvcConfig 完整代码如下:

package net.biancheng.www.componet;
import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Slf4j
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
log.info("注册拦截器");
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**") //拦截所有请求,包括静态资源文件
.excludePathPatterns("/", "/login", "/index.html", "/user/login", "/css/**", "/images/**", "/js/**", "/fonts/**"); //放行登录页,登陆操作,静态资源
}
@Override
public void addViewControllers(ViewControllerRegistry registry) {
//当访问 “/” 或 “/index.html” 时,都直接跳转到登陆页面
registry.addViewController("/").setViewName("login");
registry.addViewController("/index.html").setViewName("login");
//添加视图映射 main.html 指向  dashboard.html
registry.addViewController("/main.html").setViewName("main");
}
}


至此,拦截器的基本功能已经完成,接下来,我们先实现项目的登陆功能,为验证登陆拦截做准备。

 
http://www.gsyq.cn/news/59262.html

相关文章:

  • 2025 年 11 月战略与供应链管理咨询公司权威推荐:深度解析行业顶尖服务优势与数字化转型实战价值
  • 2025年11月云南小程序开发服务商推荐榜,聚焦昆明app开发/小程序定制开发/定制开发小程序服务商服务口碑!
  • 使用 keepalived 实现 tendis 高可用
  • 2025水泥电线杆厂家推荐榜:8米/10米/12米/15米/水泥电线杆源头制造商,山东着力杆塔领衔,硬核品质撑起基建“筋骨”
  • 论温度降额曲线对DC/DC电源模块可靠性的影响与设计指导
  • 2025年11月24日
  • 2025公寓管理系统排名与推荐:数字化时代如何选择最合适的公寓系统
  • 2025 年 11 月上料机厂家权威推荐榜:单工位/双工位/四工位圆盘上料机,工业机器人自动化设备精准供料解决方案
  • 2025 年 11 月防腐板厂家权威推荐榜:A级防腐板,B级防腐板,通用防腐板,胶衣防腐板,精选耐候抗蚀优质品牌深度解析
  • 2025 年 11 月气体检测仪厂家实力推荐榜:臭氧/甲醛/氢气/VOC/氮氧化物/二氧化硫/硫化氢检测仪及氧气分析仪专业品牌精选
  • 2025 年 11 月净化板厂家权威推荐榜:手工/机制/硫氧镁/玻镁/彩钢/抗菌/硅岩/铝蜂窝/聚氨酯净化板,医院/食品厂/电子厂净化工程专用板材精选!
  • 2025 年 11 月超声设备厂家权威推荐榜:覆盖河北、山西、辽宁、江苏、浙江、山东、广东等区域,精准成像与高效诊断口碑之选
  • 高口碑医疗器械检测机构清单:合规认证 + 精准检测双保障!
  • 2025 年 11 月甲醛检测仪厂家权威推荐榜:在线式/固定式/便携式/手持式/工业甲醛检测仪,精准监测与高效防护的科技之选
  • 8招让接口性能提升100倍
  • 2025年天津金蝶软件代理服务商实力观察:金蝶云星空、金蝶云星晨、金蝶云星翰、金蝶云系列产品四家企业以专业能力与服务获认可
  • Pandas --DataFrame 文件处理
  • 2025年四川头部GEO优化品牌哪家好,GEO优化/网络推广/SEO优化/网站建设/小红书代运营/新闻发布/百度推广GEO优化公司推荐排行
  • 个人开源项目防护实测:3款免费WAF对比后,这款成了我的首选
  • 赛后总结-Codeforces Round 1066 (Div. 1 + Div. 2)
  • 2025 年 11 月中国水泵厂家权威推荐榜:消防/多级/自吸/磁力/排污/真空/离心水泵,匠心制造与高效节能技术深度解析
  • LUATOS - GPIO
  • 认证攻击
  • 深耕 17 载 赋能万企!广州天呈网络技术有限公司以短视频运营 / 代运营 / 矩阵 / 拍摄 / 获客 / 推广,领跑全域营销
  • 2025 年 11 月苏州短视频运营团队权威推荐榜:专业拍摄制作、矩阵代运营与高效拓客服务口碑之选
  • 岳阳透明PC板厂家推荐,聚焦资质、案例与售后
  • 量化交易破局点:Tick 数据如何填补回测与实盘的鸿沟
  • 17 年深耕互联网服务!广州天呈网络技术以营销网站建设、品牌网站建设、网站建设推广赋能企业增长
  • 2025 年 11 月镀膜材料厂家权威推荐榜:真空镀膜材料,光学镀膜材料,装饰镀膜材料,高性能镀膜材料源头企业精选
  • 想做一款健康app