zoukankan      html  css  js  c++  java
  • Filter



    1. Filter 过滤器


    过滤器是实现了Filter接口的一个java类,是Servlet的高级应用,可以处理request和response,该接口有下面三种方法

    public void destroy() {
    }
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    }
    
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    

    工作区间



    2. 操作流程


    2.1 实现Filter接口

    // 注解配置(@WebFilter(filterName="FilterTest",urlPatterns="/*"))
    // 但我这里用xml配置
    public class FilterTest implements Filter {
    
    public void destroy() {
    }
    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    		throws IOException, ServletException {
    	
    	//需要执行的逻辑代码在这里
    	System.out.println("我是首个Filter");
    	
    	//表示放行
    	chain.doFilter(request, response);
    
        // 表示处理Response
        System.out.println("处理响应的地方");
    }
    
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    

    2.2 web.xml配置

    <filter>
    	<filter-name>FilterTest</filter-name>
    	<filter-class>filter.FilterTest</filter-class>
    </filter>
    <filter-mapping>
    	<filter-name>FilterTest</filter-name>
    	<url-pattern>/*</url-pattern>
    </filter-mapping>
    
    • xml配置的顺序就是Filter的执行顺序,而注解方式是通过匹配地址的自然顺序执行的,这是注解的一个遗憾**

    • 其中chain.doFilter表示放行,配置多个过滤器时会把这些过滤器放到FilterChain里,调用它就会带上request,和response,自动执行下一个过滤器**

    • 这样的调用属于链式调用,类似于递归,调用完后还会回到该函数继续执行下面的代码**

    • chain.doFilter如果没有下一个过滤器就访问资源**

    使用了责任链模式,具体请看这里 责任链模式(使用Filter来举例)



    3. 作用


    3.1 过滤POST乱码

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
    		throws IOException, ServletException {
    	
    	//ServletRequest功能不够强大,需要强转成HttpSerlvet
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
    	
        //设置编码
        httpServletRequest.setCharacterEncoding("UTF-8");
        httpServletResponse.setContentType("text/html;charset=UTF-8");
    	
    	//表示放行
    	chain.doFilter(request, response);
    }
    

    3.2 过滤Get乱码(使用到了 装饰者模式)


    装饰类

    class MyRequest extends HttpServletRequestWrapper {
    
        private HttpServletRequest request;
    
        public MyRequest(HttpServletRequest request) {
            this.request = request;
        }
    
        public String getParameter(String name) {
            String value = this.request.getParameter(name);
    
            if (value == null) {
                return null;
            }
    
            //如果不是get方法的,直接返回就行了
            if (!this.request.getMethod().equalsIgnoreCase("get")) {
                return null;
            }
    
            try {
    
                //进来了就说明是get方法,把乱码的数据
                value = new String(value.getBytes("ISO8859-1"), this.request.getCharacterEncoding());
                return value ;
    
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
    
                throw new RuntimeException("不支持该编码");
            }
        }
    }
    

    实现

    MyRequest myRequest = new MyRequest(httpServletRequest);
    //装饰增加新功能
    

    3.3 还有敏感字过滤,权限验证等



    4. FilterConfig

    Filter也有FilterConfig这个对象,来获取里面的初始化参数,至此我们可以知道,获取xml配置初始化参数有Config这个对象



    参考Java3y



  • 相关阅读:
    浅谈生成全排列的4种方法
    UVA
    UVA
    UVA
    UVA
    MySQL索引篇
    MySQL事务篇
    MySQL架构篇
    Redis性能调优
    Redis分布式锁
  • 原文地址:https://www.cnblogs.com/Howlet/p/12042026.html
Copyright © 2011-2022 走看看