您现在的位置是:知识 >>正文
java拦截器怎么实现
知识3382人已围观
简介Java里实现拦截器,最直接的办法是实现 `HandlerInterceptor` 接口。别被“拦截器”这个名字吓住,它本质就是三个回调方法,Spring MVC 在请求处理的不同阶段帮你调用。你只需 ...
Java里实现拦截器,拦截最直接的器实办法是实现 `HandlerInterceptor` 接口。别被“拦截器”这个名字吓住,拦截它本质就是器实三个回调方法,Spring MVC 在请求处理的拦截不同阶段帮你调用。你只需要往里面塞自己的器实逻辑。
先看最核心的拦截代码骨架。你写一个类,器实实现 `HandlerInterceptor`,拦截重写 `preHandle`、器实`postHandle`、拦截`afterCompletion` 这三个方法。器实`preHandle` 在 Controller 方法执行前跑,拦截返回 `false` 就掐断请求,器实后面的拦截代码不执行了。`postHandle` 在 Controller 跑完、视图渲染前执行。`afterCompletion` 是整个请求结束后的收尾,比如记日志、清理资源。就这么简单。
光有类不行,得注册。Spring Boot 里用 `WebMvcConfigurer`,重写 `addInterceptors` 方法,把自定义拦截器加进去,顺便指定拦截哪些路径、排除哪些路径。比如你只拦 `/api/**`,不拦 `/login` 和 `/register`。这里有个细节容易踩坑——静态资源也会被拦,记得排除 `/static/**`、`/css/**` 这类路径,否则页面样式全挂。
我见过不少新手把拦截器和过滤器搞混。过滤器是 Servlet 层面的,拦截器是 Spring MVC 层面的。过滤器在拦截器之前执行,而且过滤器拿不到 Handler 对象,只能拿到原始的 `HttpServletRequest`。拦截器能拿到 `HandlerMethod`,这意味着你能反射读取 Controller 方法上的注解。这个能力很实用——比如你自定义一个 `@NoAuth` 注解标在某个方法上,拦截器里判断一下,有这个注解就直接放行,不用走 token 校验。过滤器可做不到这么精细。
实际项目里,拦截器最常用的场景就是登录校验。写一个 `AuthInterceptor`,`preHandle` 里从请求头取 token,解析失败就返回 401 JSON,成功就放行。但别把业务逻辑全塞进去。我见过有人把权限判断、参数校验、日志埋点全写在一个拦截器里,一个类几百行,改起来想死。拆成多个拦截器,每个只干一件事,排好顺序就行。
还有个容易忽略的点——拦截器是单例的,多个请求会并发使用同一个实例。所以拦截器里别定义可变的成员变量,否则会有线程安全问题。局部变量随便用,全局状态别碰。这个坑我当年踩过一次,线上偶发数据错乱,查了两天才定位到是拦截器里一个 HashMap 成员变量被并发写坏了。
另外,`preHandle` 返回 `false` 之后,`postHandle` 和 `afterCompletion` 都不会执行。但注意,如果前面已经通过了几个拦截器,后面某个拦截器返回了 `false`,前面那些拦截器的 `afterCompletion` 还是会执行。所以 `afterCompletion` 里的资源清理逻辑要写健壮点,别假设请求一定完整走完了。
最后说个实用技巧。拦截器里想往 Controller 传数据,别用 `request.setAttribute` 存,虽然能用,但类型不安全。更好的做法是把用户信息塞进 `request` 的 attribute 里,然后在 Controller 方法参数上加 `@RequestAttribute` 取出来。或者用 ThreadLocal 存当前请求的用户上下文,但记得在 `afterCompletion` 里 remove 掉,不然线程池复用会串数据。
拦截器这东西,看着简单,用好了能省大量重复代码。核心就一句话:在请求到达 Controller 之前、之后,插入你的逻辑。别过度设计,一个项目两三个拦截器足够,多了反而难排查问题。
Tags:
下一篇:网站存在
相关文章
黑帽渗透
知识黑帽渗透 凌晨三点,某个电商平台的数据库日志里多了一条查询记录。它来自一个看似正常的后台账号,但那条SQL语句的缩进方式——每个关键词前都藏着一个看不见的空格——暴露了入侵者的指纹。这不是脚本小子的 ...
【知识】
阅读更多web前端开发岗位要求
知识web前端开发岗位要求 一个下午,我盯着招聘后台的简历列表,三百多份投递里,能直接约面试的不到二十个。不是候选人不够优秀,是很多人压根没搞明白这个岗位在要什么。 前端开发早就不止是“写网页”了。五年前 ...
【知识】
阅读更多web安全测试基础知识
知识一次真实的教训比任何理论都管用。2017年,某知名电商平台被曝出用户数据泄露,黑客利用的正是web应用层一个不起眼的越权漏洞——他们只是修改了URL中的订单号参数,就拿到了其他用户的收货地址和手机号。 ...
【知识】
阅读更多