拦截器、过滤器
拦截器
概念:反射(动态代理)实现,对每个接口的请求进行拦截,比如校验接口请求的token是否有效。
springboot自定义拦截器,继承HandlerInterceptorAdapter
@Component public class AuthorityInterceptor extends HandlerInterceptorAdapter { private static final Logger logger = LoggerFactory.getLogger(AuthorityInterceptor.class); @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { logger.info("进入到拦截器中:preHandle() 方法"); System.out.println(request.getServletPath()); return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info("进入到拦截器中:postHandle() 方法中"); System.out.println(request.getRequestURI()); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { logger.info("进入到拦截器中:afterCompletion() 方法中"); System.out.println(request.getServletPath()); } }
注册拦截器,可以继承WebMvcConfigurerAdapter或实现 WebMvcConfigurer
@Configuration public class InterceptorAdapterConfig extends WebMvcConfigurerAdapter { @Autowired private AuthorityInterceptor authorityInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //注册自己的拦截器并设置拦截的请求路径 registry.addInterceptor(authorityInterceptor).addPathPatterns("/**"); super.addInterceptors(registry); }
自定义注解处理方法请求
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface VerifyType { boolean isTrue() default true; }
preHandle中设置成false将抛出异常
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { log.info("HelloInterceptor preHandle "); HandlerMethod handlerMethod = (HandlerMethod) handler; VerifyType verifyType = handlerMethod.getMethodAnnotation(VerifyType.class); if (verifyType.isTrue()) { log.info("对的方法"); return true; } log.info("错的方法"); throw new Exception("错了--------"); }
过滤器
概念:函数回调实现,过滤请求,容器初始化时候使用。
在SpringBootApplication上使用@ServletComponentScan注解后,
Servlet、Filter、Listener可以直接通过@WebServlet、@WebFilter、@WebListener注解自动注册,无需其他代码。
拦截器和过滤器区别:
1. 拦截器执行前的方法是preHandler是boolean类型,如果校验失败流程将会终止。 过滤器只有异常才会终止。(所以拦截器适合对接口合法性校验,校验不通过则不执行相应接口)
2. 过滤器 监听器 serverlet配置在web.xml ,是系统级的配置。拦截器配置在指定的配置文件,如spring的拦截器配置在spring.xml struts配置在struts.xml ,拦截器不是系统级的配置。
3. 过滤器在容器初始化和接口调用时候都会被调用,拦截器每个接口调用的时候才会使用。
4. 过滤器依赖servlet容器 , 拦截器不依赖servlet。
5. 过滤器需要每次filter.doFilter方法去调用,拦截器是方法执行前 中 后调用。
拦截器和过滤器执行顺序:
过滤前->拦截前->Action处理->拦截后->过滤后
参考文章:https://blog.csdn.net/reggergdsg/article/details/52962774
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
2021-02-09 Linux防火墙---Firewall