SpringBoot 过滤器 Filter使用实例详解
作者:后端Q 时间:2021-11-08 13:46:00
简介
过滤器是AOP(面向切面编程)思想的具体实现。可以过滤浏览器发出的请求,并且决定放行请求还是中断请求。
在浏览器对服务器发起请求或者服务器对浏览器响应,都会经过过滤器。
基于过滤器的机制,我们可以在过滤器中对请求和响应做一些处理,可以在过滤器中决定是否放行,例如:校验请求中有没有敏感字符串,校验有没有Session,实现URL级别的权限控制、压缩响应信息、编码格式等。
用法
在spring的应用中我们存在两种过滤的用法,一种是 * 、另外一种当然是过滤器。我们这里介绍过滤器在springboot的用法,在springmvc中的用法基本上一样,只是配置上面有点区别。
功能
filter功能,它使用户可以改变一个 request和修改一个response. Filter 不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response.换种说法,filter其实是一个”servlet chaining”(servlet 链).
Filter接口中有一个doFilter方法,当开发人员编写好Filter类实现doFilter方法,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前(服务器内部对资源的访问机制决定的),都会先调用一下filter的doFilter方法。
实现
Filter的执行由Servlet容器回调完成,因此我们不需要再额外引包。
新建MyFilter类
@Slf4j
@Order(1)
@WebFilter(filterName = "myFilter", urlPatterns = {"/user/*"})
public class MyFilter implements Filter {
@Autowired
private SysUserService sysUserService;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
log.info("过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
log.info("请求处理");
HttpServletResponse response = (HttpServletResponse) servletResponse;
HttpServletRequest request = (HttpServletRequest) servletRequest;
log.info("MyFilter, URL:{}", request.getRequestURI());
if (request.getRequestURI().contains("login")) {
filterChain.doFilter(servletRequest, servletResponse);
} else {
log.info("非法URL:{}", request.getRequestURI());
response.setStatus(HttpServletResponse.SC_METHOD_NOT_ALLOWED);
PrintWriter writer = response.getWriter();
writer.print("no access");
}
}
@Override
public void destroy() {
log.info("过滤器销毁");
}
}
用@WebFilter注解,指定拦截路径以及一些参数,同时需要在启动类使用@ServletComponentScan扫描带@WebFilter、@WebServlet、@WebListener并将帮我们注入bean
@ServletComponentScan
@SpringBootApplication
public class DevRootApplication {
public static void main(String[] args) {
SpringApplication.run(DevRootApplication.class, args);
}
}
当有多个过滤器之后,就需要规定各个过滤器的指定顺序了。
使用@Order()注解
来源:https://juejin.cn/post/7151454048959332388
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
Redis 订阅发布_Jedis实现方法
JAVA JDK8 List分组的实现和用法
java创建线程的两种方法区别
java微信公众号开发(搭建本地测试环境)
![](https://img.aspxhome.com/file/2023/6/63076_0s.png)
详解Java中HashSet和TreeSet的区别
JPA如何设置表名和实体名,表字段与实体字段的对应
java web返回中文乱码问题及解决
![](https://img.aspxhome.com/file/2023/8/58328_0s.png)
Java技能点之SimpleDateFormat进行日期格式化问题
![](https://img.aspxhome.com/file/2023/9/58339_0s.jpg)
Mybatis中 mapper-locations和@MapperScan的作用
![](https://img.aspxhome.com/file/2023/0/57700_0s.png)
Springboot与vue实现数据导出方法具体介绍
浅谈Spring-cloud 之 sleuth 服务链路跟踪
![](https://img.aspxhome.com/file/2023/7/68577_0s.png)
Mybatis工具类JdbcTypeInterceptor运行时自动添加jdbcType属性
最常用的1000个Java类(附代码示例)
Java基于Runtime调用外部程序出现阻塞的解决方法
Java SpringSecurity+JWT实现登录认证
SpringBoot路径映射实现过程图解
![](https://img.aspxhome.com/file/2023/6/59376_0s.png)
java 如何计算同比增长工具类
Java Comparable及Comparator接口区别详解
![](https://img.aspxhome.com/file/2023/5/57425_0s.png)
C#多线程学习之(三)生产者和消费者用法分析
Spring Security中使用authorizeRequests遇到的问题小结
![](https://img.aspxhome.com/file/2023/2/64952_0s.png)