软件编程
位置:首页>> 软件编程>> java编程>> SpringBoot 过滤器 Filter使用实例详解

SpringBoot 过滤器 Filter使用实例详解

作者:后端Q  发布时间:2021-11-08 13:46:00 

标签:SpringBoot,Filter,过滤器

简介

过滤器是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

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com