SpringBoot中实现拦截器和过滤器

打印 上一主题 下一主题

主题 1851|帖子 1851|积分 5553

【SpringBoot中实现过滤器和拦截器】

1.过滤器和拦截器简述
过滤器Filter和拦截器Interceptor,在功能方面很类似,但在详细实现方面差距还是比较大的。
2.过滤器的设置
2.1 自界说过滤器,实现Filter接口(SpringBoot 3.0 开始,jakarta.servlet.Filter,jdk需要升级到17)
2.2 重写doFilter,实现过滤逻辑,酌情放行
2.3 创建注解,实现过滤的范围设置
3.拦截器的设置
3.1 自界说拦截器,实现HandlerInterceptor接口
3.2 实现接口中的拦截方法(preHandle-请求实行前、postHandler-请求实行后、aftercompletion-视图渲染后)
3.3 创建设置类,实现WebMvcConfigurer接口,重写addInterceptors方法
4.总结
4.1 Filter依赖于Servlet容器,属于Servlet规范的一部门,而Interceptor依赖于SpringMVC框架;【所依赖框架】
4.2 Filter的生命周期由servlet容器管理,而Interceptor通过IOC容器来管理,可通过注入等方式来获取其Bean的实例;【管理的容器】
4.3 Filter可拦截所有web资源(包罗]sp,Servlet,静态资源),而Interceptor则只拦截controller。【拦截范围】
代码
1、过滤器:
  1. @RestController
  2. public class MyController {
  3.     @GetMapping("/filter")
  4.     public String filter() {
  5.         return "filter";
  6.     }
  7. }
复制代码
  1. package com.example.demos.web.filter;
  2. import org.springframework.stereotype.Component;
  3. import javax.servlet.*;
  4. import javax.servlet.annotation.WebFilter;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpSession;
  7. import java.io.IOException;
  8. import java.util.Objects;
  9. /**
  10. * @date 2025/1/5 18:06
  11. * @description ip 请求的次数
  12. */
  13. @Component
  14. //所有请求都会经过这个过滤器
  15. @WebFilter(urlPatterns = "/*")
  16. public class MyFilter implements Filter {
  17.     @Override
  18.     public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  19.         HttpServletRequest request = (HttpServletRequest) servletRequest;
  20.         // 获取请求的ip
  21.         String ip = request.getRemoteAddr();
  22.         HttpSession session = request.getSession();
  23.         Integer count = (Integer) session.getAttribute("count");
  24.         count=Objects.isNull(count)?1:++count;
  25.         System.out.println("ip:"+ip+" count:"+count);
  26.         session.setAttribute("count", count);
  27.         //放行
  28.         filterChain.doFilter(servletRequest, servletResponse);
  29.     }
  30. }
复制代码
结果:


2、拦截器
  1. @RestController
  2. public class MyController {
  3.     @GetMapping("/interceptor")
  4.     public String filter() {
  5.         return "interceptor";
  6.     }
  7. }
复制代码
举行拦截处理惩罚
  1. public class MyHandlerInterceptor  implements HandlerInterceptor {
  2.     @Override
  3.     public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
  4.         // 获取请求的ip
  5.         String ip = request.getRemoteAddr();
  6.         HttpSession session = request.getSession();
  7.         Integer count = (Integer) session.getAttribute("count");
  8.         count= Objects.isNull(count)?1:++count;
  9.         System.out.println("ip:"+ip+" count:"+count);
  10.         session.setAttribute("count", count);
  11.         //放行
  12.         return true;
  13.     }
  14. }
复制代码
设置文件需要将自界说拦截器举行注册
  1. @Configuration
  2. public class InterceptorConfiguration implements WebMvcConfigurer {
  3.     @Override
  4.     public void addInterceptors(InterceptorRegistry registry) {
  5.         MyHandlerInterceptor interceptor = new MyHandlerInterceptor();
  6.         //拦截所有请求
  7.         registry.addInterceptor(interceptor).addPathPatterns("/**");
  8.     }
  9. }
复制代码
结果:



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表