过滤器
# 过滤器
## 实质:
**实现Filter接口的Java类**
**API:**
init() //启动服务器时执行
doFilter(ServletRequest ,ServletResponse , FilterChain)//当可以拦截的请求到达时,新建一个线程去执行。同Servlet一样,
destory()//关闭服务器时执行
```
public class FilterDemo1 implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//拦截时执行语句
//执行这一句,说明放行(让下一个过滤器执行,如果没有过滤器了,就执行执行目标资源)
chain.doFilter(req, resp);
//从后一个过滤器返回,或从目标资源返回时,执行语句。
}
public void init(FilterConfig config) throws ServletException {
}
}
```
## 功能:

1. 拦截访问Servlet的请求,在执行Servlet前执行自定义代码
2. 通过chain.doFilter(req, resp);的有无决定是否放行,放行的话会执行到过滤器链下一个过滤器,如果还有的话;如果没有则会执行请求的目标Servlet
3. 在Servlet执行后,返回到Filter时,执行一些自定义代码
## 实现方法:
1. 新建Filter类,实现doFilter方法
2. 部署,即配置Filter所拦截的url、参数等等
实现方式一、在web.xml中配置
```
//filter用于注册过滤器
<filter>
<filter-name>FilterDemo1</filter-name>
<filter-class>FilterDemo1</filter-class>
<init-param>
<param-name>word_file</param-name>
<param-value>/WEB-INF/word.txt</param-value>
</init-param>
</filter>
//<filter-mapping>元素用于设置一个Filter 所负责拦截的资源
//一个Filter拦截的资源可通过两种方式来指定:Servlet 名称和资源访问的请求路径
<filter-mapping>
<filter-name>FilterDemo1</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
```
实现方式二、在Filter类上直接写注解
```
@WebFilter(filterName = "FilterDemo1",urlPatterns = "/*")
```
## 使用场景
1. 编码问题,解决中文乱码
2. 过滤敏感词汇(用户输入的敏感词汇)
3. 对所有输出进行压缩(包括文本流和字节流的)
4. 权限验证(登录权限、资源访问权限...)
- [自动登录](https://github.com/Jylx/blog/tree/master/Javaweb/%E8%BF%87%E6%BB%A4%E5%99%A8/%E8%87%AA%E5%8A%A8%E7%99%BB%E5%BD%95/nftc-Filter)
5. 禁止浏览器缓存数据
6. 在服务器端内存中缓存客户端经常访问的数据(提高访问速度,不用每次都去硬盘读)
## 借鉴:
https://www.cnblogs.com/ygj0930/p/6374212.html
https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247483718&idx=3&sn=d63a56a3bdafa2df90178503e4d16d9d&chksm=ebd74047dca0c951eb72b5eb85553e513bd005318ee8c6ff9777d382581f0b352b2acdecf6fe#rd(Java3y)
Filter高级应用
https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247483718&idx=3&sn=d63a56a3bdafa2df90178503e4d16d9d&chksm=ebd74047dca0c951eb72b5eb85553e513bd005318ee8c6ff9777d382581f0b352b2acdecf6fe#rd

浙公网安备 33010602011771号