Springboot 拦截器

1.什么是拦截器?

拦截器可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能。

2.定义拦截器步骤

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

  • 1.定义拦截器;
  • 2.注册拦截器;

定义拦截器

在 Spring Boot中定义拦截器十分的简单,只需要创建一个拦截器类,并实现 HandlerInterceptor 接口,重写以下三个方法。

@Slf4j
@Component
public class LoginInterceptor implements HandlerInterceptor { private static final Pattern SHOULD_NOT_FILTER_URL_PATTERN; static {
List<String> urlList = new ArrayList<>();
// 将不走拦截器的请求存放到Pattern
urlList.add("(socket/.*)");
urlList.add("(user/*)");
StringBuilder sb = new StringBuilder();
for (String url : urlList) {
sb.append(url);
sb.append("|");
}
sb.setLength(sb.length() - 1);
SHOULD_NOT_FILTER_URL_PATTERN = Pattern.compile(sb.toString());
} /**
* 目标方法执行前 (Controller方法调用之前)
* 该方法在控制器处理请求方法前执行,其返回值表示是否中断后续操作
* 返回 true 表示继续向下执行,返回 false 表示中断后续操作
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
// 获取访问的url
String servletPath = request.getServletPath();
// 排除特定请求
if (SHOULD_NOT_FILTER_URL_PATTERN.matcher(servletPath).find()) {
return true;
}
if (session.getAttribute("user") != null) {
// 可能有的项目在校验完session,还会校验token
String token = request.getHeader("access_token");
// 此处业务省略。。。
return true;
}
return false;
}
/**
* 目标方法执行后
* 该方法在控制器处理请求方法调用之后、解析视图之前执行
* 可以通过此方法对请求域中的模型和视图做进一步修改
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle执行{}", modelAndView);
}
/**
* 页面渲染后
* 该方法在视图渲染结束后执行
* 可以通过此方法实现资源清理、记录日志信息等工作
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
log.info("afterCompletion执行异常{}", ex);
}
}

注册拦截器

创建一个实现了 WebMvcConfigurer 接口的配置类(使用了 @Configuration 注解的类),重写 addInterceptors() 方法,

并在该方法中调用 registry.addInterceptor() 方法将自定义的拦截器注册到容器中。

@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Resource
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//可以多个拦截器
//InterceptorRegistration interceptorDemoRegistration = registry.addInterceptor(new InterceptorDemo());
//interceptorDemoRegistration.addPathPatterns("/..");
//interceptorDemoRegistration.addPathPatterns("/.."); //注册自己的拦截器,并设置拦截的请求路径
//addPathPatterns为拦截此请求路径的请求
//excludePathPatterns为不拦截此路径的请求
registry.addInterceptor(loginInterceptor)
//可以设置多个路径拦截
.addPathPatterns("/admin/*")
.excludePathPatterns("/admin/oldLogin");
}
}

【Springboot】拦截器的更多相关文章

  1. Java结合SpringBoot拦截器实现简单的登录认证模块

    Java结合SpringBoot拦截器实现简单的登录认证模块 之前在做项目时需要实现一个简单的登录认证的功能,就寻思着使用Spring Boot的拦截器来实现,在此记录一下我的整个实现过程,源码见文章 ...

  2. SpringBoot拦截器中Bean无法注入(转)

    问题 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于其他bean在service,controller层注入一点问题也没有,开始根本没意识到Be ...

  3. 【SpringBoot】SpringBoot拦截器实战和 Servlet3.0自定义Filter、Listener

    =================6.SpringBoot拦截器实战和 Servlet3.0自定义Filter.Listener ============ 1.深入SpringBoot2.x过滤器Fi ...

  4. SpringBoot拦截器中无法注入bean的解决方法

    SpringBoot拦截器中无法注入bean的解决方法 在使用springboot的拦截器时,有时候希望在拦截器中注入bean方便使用 但是如果直接注入会发现无法注入而报空指针异常 解决方法: 在注册 ...

  5. Springboot拦截器未起作用

    之前遇到要使用springboot拦截器却始终未生效的状况,查了网上的博客,大抵都是@Component,@Configuration注解未加,或是使用@ComponentScan增加包扫描,但是尝试 ...

  6. SpringBoot拦截器中service或者redis注入为空的问题

    原文:https://my.oschina.net/u/1790105/blog/1490098 这两天遇到SpringBoot拦截器中Bean无法注入问题.下面介绍我的思考过程和解决过程: 1.由于 ...

  7. springboot + 拦截器 + 注解 实现自定义权限验证

    springboot + 拦截器 + 注解 实现自定义权限验证最近用到一种前端模板技术:jtwig,在权限控制上没有用springSecurity.因此用拦截器和注解结合实现了权限控制. 1.1 定义 ...

  8. Springboot 拦截器配置(登录拦截)

    Springboot 拦截器配置(登录拦截) 注意这里环境为springboot为2.1版本 1.编写拦截器实现类,实现接口   HandlerInterceptor, 重写里面需要的三个比较常用的方 ...

  9. Springboot拦截器实现IP黑名单

    Springboot拦截器实现IP黑名单 一·业务场景和需要实现的功能 以redis作为IP存储地址实现. 业务场景:针对秒杀活动或者常规电商业务场景等,防止恶意脚本不停的刷接口. 实现功能:写一个拦 ...

  10. SpringBoot 拦截器获取http请求参数

    SpringBoot 拦截器获取http请求参数-- 所有骚操作基础 目录 SpringBoot 拦截器获取http请求参数-- 所有骚操作基础 获取http请求参数是一种刚需 定义拦截器获取请求 为 ...

随机推荐

  1. Java Stream常见用法汇总,开发效率大幅提升

    本文已经收录到Github仓库,该仓库包含计算机基础.Java基础.多线程.JVM.数据库.Redis.Spring.Mybatis.SpringMVC.SpringBoot.分布式.微服务.设计模式 ...

  2. jquery实现一个网页同时调用多个倒计时

    <div class="time countdown_1" data-time="1449429731"> <span class=" ...

  3. 一个可用于生产项目 基于 .NET 6 自研ORM

    Fast Framework 作者 Mr-zhong 代码改变世界.... 一.前言 Fast Framework 基于NET6.0 封装的轻量级 ORM 框架 支持多种数据库 SqlServer O ...

  4. vue前端路由的两种模式,hash与history的区别

    1.直观区别: hash模式url带#号,history模式不带#号. 2.深层区别: hash模式url里面永远带着#号,我们在开发当中默认使用这个模式. 如果用户考虑url的规范那么就需要使用hi ...

  5. 牛客网:华为机试题(python版本)

    输入一行:input() 输入的一行有多个信息:input().split() 有多组测试用例(多组同时输入): while true try except... 1.计算字符串最后一个单词的长度,单 ...

  6. 自创简易CSS Tab 选项卡

    前段时间我注册了 w3c.run域名,打算做一个W3C相关技术在线试验工具.没错,就是在线编写html.css.js代码然后在线运行,查看效果. 在设计首页时,我打算首页提供三个代码编辑器,介于界面大 ...

  7. 这个字段我明明传了呀,为什么收不到 - Spring 中首字母小写,第二个字母大写造成的参数问题

    问题现象 vSwitchId.uShape.iPhone... 这类字段名,有什么特点?很容易看出来吧,首字母小写,第二个字母大写.它们看起来确实是符合 Java 中对字段所推崇的"小驼峰命 ...

  8. DVWA文件上传

    Low安全级别: <?php @eval($_POST['cmd']);?> 文本编辑器写入一句话木马,保存并改为php文件. 上传 成功上传,并返回路径 打开菜刀客户端连接 成功连接 反 ...

  9. STL------sort三种比较算子定义

    sort的三种比较算子的定义方式 例:一道细碎的细节模拟题: http://newoj.acmclub.cn/contests/1258/problem/3 1932: 2018蓝桥杯培训-STL应用 ...

  10. 文心一言 VS 讯飞星火 VS chatgpt (26)-- 算法导论5.1 1题

    一.证明:假设在过程 HIRE-ASSISTANT 的第 4 行中,我们总能决定哪一个应聘者最佳.则意味着我们知道应聘者排名的全部次序. 文心一言: 证明: 假设在过程 HIRE-ASSISTANT ...