1、过滤器使用场景
做业务的时候我们经常要使用过滤器或者拦截器(听这口音就是从Java过来的)。常见的场景如一个HTTP请求,需要经过鉴权过滤器、白名单校验过滤、参数验证过滤器等重重关卡最终拿到数据。
Java使用过滤器很简单。XML时代,只要添加一个过滤器配置再新建一个实现了Filter接口的xxxFilter实现类;Java Configuration时代,只要在xxxConfiguration配置类中声明一个Filter注解,如果想设置Filter的执行顺序,加上Order注解就行了。
Java的过滤器实在太方便也太好用了。
以至于在Java有关过滤器的面试题中,只有类似于“过滤器的使用场景有哪些?”,“过滤器和拦截器有什么区别?“,几乎很少听到”你知道过滤器是怎么实现的吗?“,”如果让你实现一个过滤器,你会怎么做?“这样的题目。
2、使用过滤器的场景特征
如同上面过滤器的例子,我们发现过滤器有一些特征:
1、入参一样,比如HTTP请求的过滤器的入参就是ServletRequest对象
2、返回值类型相同,比如都是true或者false,或者是链接到下一个过滤器或者return。
如下是Java实现的CORS过滤器
import org.springframework.http.HttpStatus; import org.springframework.util.StringUtils; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class CORSFilter implements Filter { @Override public void doFilter(ServletRequest reserRealmq, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) reserRealmq; HttpServletResponse response = (HttpServletResponse) res; String currentOrigin= request.getHeader("Origin"); if (!StringUtils.isEmpty(currentOrigin)) { response.setHeader("Access-Control-Allow-Origin", currentOrigin); response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT"); response.setHeader("Access-Control-Allow-Credentials", "true"); response.setHeader("Access-Control-Allow-Headers", "Origin, No-Cache, X-Requested-With, If-Modified-Since, Cache-Control, Expires, Content-Type, X-E4M-With, Index-Url"); } // return http status 204 if OPTIONS requst if ("OPTIONS".equals(request.getMethod())){ response.setStatus(HttpStatus.NO_CONTENT.value()); }else { chain.doFilter(reserRealmq, res); } } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } }