【Spring学习】过滤器和拦截器
@Override public void doFilter(ServletRequest var1, ServletResponse var2, FilterChain var3) throws IOException, ServletException{ //请求(request)处理逻辑 //请求(request)封装逻辑 //chain重新写回request和response }
@RestController @Slf4j @RequestMapping("/api/filter") public class FilterUserController { @GetMapping("/getUserList") public List<String> getUser() { log.info("开始业务逻辑处理。"); List<String> list = new ArrayList<>(); list.add("张三"); list.add("李四"); list.add("王五"); log.info("业务逻辑处理结束。"); return list; } }
@ServletComponentScan(basePackages = "com.binlog.study.filter")
@Slf4j @Order(1) //如果有多个Filter,则序号越小,越早被执行 //@Component//无需添加此注解,在启动类添加@ServletComponentScan注解后,会自动将带有@WebFilter的注解进行注入! //这里的urlPatterns为接口里的路径过滤条件 @WebFilter(filterName = "timeFilter", urlPatterns = "/api/filter/*") public class TimeFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("初始化过滤器:{}", filterConfig.getFilterName()); } @Override public void destroy() { log.info("销毁过滤器"); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { log.info("开始执行"); long startTime = System.currentTimeMillis(); filterChain.doFilter(servletRequest, servletResponse); long endTime = System.currentTimeMillis(); log.info("请求:{},耗时:{}ms", getUrlFrom(servletRequest), (endTime - startTime)); log.info("结束执行"); } private String getUrlFrom(ServletRequest servletRequest) { if (servletRequest instanceof HttpServletRequest) { return ((HttpServletRequest) servletRequest).getRequestURL().toString(); } return ""; } }
- preHandle()
- postHandle()
- afterCompletion()
@Data public class InterceptorUserEntity { private Integer id; private String name; }
@RestController @Slf4j @RequestMapping("/api/interceptor") public class InterceptorUserController { @GetMapping("/setSession") @ResponseBody public Object setSession(HttpServletRequest request) { //将用户信息存放到session中 InterceptorUserEntity user = new InterceptorUserEntity(); user.setId(001); user.setName("张三"); request.getSession().setAttribute("user", user); return "已进行登录!"; } /** * 用户登录后跳转到首页 * * @return */ @GetMapping("/index") public Object index() { return "这里是首页!"; } /** * 登录页面 * * @return */ @GetMapping("/login") public Object login() { return "请进行登录!"; } }
@Component @Slf4j public class UserInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //业务拦截相关规则 //从session中获取用户的信息 InterceptorUserEntity user = (InterceptorUserEntity) request.getSession().getAttribute("user"); //判断用户是否登录 if (null == user) { response.sendRedirect(request.getContextPath() + "/api/interceptor/login"); return false; } //需要返回true,否则请求不会被控制器处理 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { log.info("请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后),如果异常发生,则该方法不会被调用"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { log.info("在整个请求结束之后被调用,也就是在DispatcherServlet渲染了对应的视图之后执行(主要是用于进行资源清理工作)"); } }
@Configuration public class InterceptorConfig implements WebMvcConfigurer { @Autowired private UserInterceptor userInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(userInterceptor).addPathPatterns("/api/interceptor/**").excludePathPatterns("/**/login", "/**/setSession"); } }
相同点:
不同点:
触发机制不同
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)