zoukankan      html  css  js  c++  java
  • java filter过滤器及责任链设计模式

     什么是Filter?

      Filter属于sevlet规范,翻译为过滤器。

      Filter在web开发中有什么作用?

    案例一:一个web站点只有用户登录才能继续访问该站点的资源,那么需要用户每次访问都判断是否登陆,若在每个servlet中都写上登陆判断安全控制代码,代码冗余,复用性差,Filter可以很好的解决这个问题。

    案例二:一个web站点当中的所有post请求都有可能出现中文乱码问题,所有post请求我们都需要设置字符集,request.setCharacterEncoding("UTF-8");代码无法重复利用。

    上图:

    javaweb开发如何编写一个Filter?

     首先 编写一个类实现javax.servlet.Filter接口并实现其中的方法

    import java.io.IOException;
    import java.util.Enumeration;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    
    public class FirstFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            //System.out.println("FirstFilter init...");
            //Filter在服务器启动阶段被实例化。并且调用init方法,init方法只执行一次,因为Filter只被实例化一次(单例的)
            Enumeration<String> names = filterConfig.getInitParameterNames();    
            while(names.hasMoreElements()){
                String name = names.nextElement();
                String value = filterConfig.getInitParameter(name);
                System.out.println(name + " = " + value);
            }
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            
            System.out.println("FirstFilter doFilter begin...");
            //前端用户只要发送一次请求,则执行一次doFilter方法
            //顺着链条往下走,下一个目标是Filter则调用Filter的doFilter方法
            //顺着链条往下走,下一个目标是Servlet则调用Servlet的service方法
            chain.doFilter(request, response);
            
            System.out.println("FirstFilter doFilter end...");
        }
    
        @Override
        public void destroy() {
            /**当长时间没有用户访问,或者项目重新部署,或者服务器重新启动的时候,会销毁所有的Filter对象,
              *销毁之前会先调用Filter对象的destroy方法,完成销毁前的准备工作。也是只执行一次。*/
            System.out.println("FirstFilter destroy...");
        }
    }

    其次:在web.xml文件中对filter进行路径映射配置,确定filer;拦截过滤哪些路径   filter的优先级:在web.xml越靠上的优先级越高。

    <filter>
            <filter-name>firstFilter</filter-name>
            <filter-class>com.bjpowernode.javaweb.web.filter.FirstFilter</filter-class>
            <!-- 在初始化参数当中指定了字符集为UTF-8 -->
            <init-param>
                <param-name>encoding</param-name>
                <param-value>GBK</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>firstFilter</filter-name>
            <url-pattern>*.do</url-pattern>
        </filter-mapping>

    Filter优先级天生比servlet高,Filter通过filter.chain进入链条的下一个环节,在服务器启动阶段动态组合链条,符合责任链设计模式(动态调用,组合依赖于配置)。

    这样最简单的一个fiter过滤器就完成了,我们可以在执行servlet之前在filter里面添加我们需要的业务逻辑,过滤字符集,添加登陆安全控制等等...

                                                      如有不足,欢迎指正。

  • 相关阅读:
    如何在C#中获得input文本框中的值
    多控件时,自适应布局(dl dd td )
    jquery easyui DataGrid
    报表文本字段钻取使用超链接(URL)的用法 (转)
    rabbitMQ队列使用及常用命令
    java集合操作
    Java集合框架总结(4)——List接口的使用
    Java集合框架总结(3)——TreeSet类的排序问题
    Java HashMap 分析之二:Hash code
    Java HashMap 分析之四:查找和内存使用
  • 原文地址:https://www.cnblogs.com/zhaoletian/p/10576669.html
Copyright © 2011-2022 走看看