转载

过滤器

过滤器

实质:

实现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. 权限验证(登录权限、资源访问权限...)

    • 自动登录
  5. 禁止浏览器缓存数据
  6. 在服务器端内存中缓存客户端经常访问的数据(提高访问速度,不用每次都去硬盘读)

借鉴:

https://www.cnblogs.com/ygj09...

https://mp.weixin.qq.com/s?__... (Java3y)

Filter高级应用

https://mp.weixin.qq.com/s?__...
原文  https://segmentfault.com/a/1190000018557897
正文到此结束
Loading...