过滤器
javax.servlet.Filter
并非spring的专属,早期的web.xml中经常会看到过滤器的身影,大多数基于servlet的框架都可以使用过滤器(依赖于servlet容器,基于函数回调)。
举例
@Component
public class TokenSignFilter implements Filter {
@Override
public void doFilter(
ServletRequest req,
ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
// path like '/hello'
final String path = request.getServletPath();
// ...
}
}
Spring Boot中自定义了很多过滤器,来统一处理servlet的操作。比如CharacterEncodingFilter来处理字符编码问题。
在自定义过滤器时,需要注意以下的原则:
- 单一职责;
@Ordered注意类的执行顺序,有时候很重要;request的body(InputStream)如果被读取了,那么在controller中会获取不到;- 如果出现错误,不要直接抛出异常,而是
response设置后返回,@ExceptionHandler是无法捕获到Filter中抛出的异常的。
场景
可以对几乎所有请求进行过滤,但是一个过滤器实例只能在容器初始化时调用一次。
- 对传入的request、response提前过滤掉一些信息;
- 提前设置一些参数;
- 统一的一些操作,比如签名、XSS、字符编码等;