zoukankan      html  css  js  c++  java
  • Filter 知识总结

    Filter对web服务器管理的所有web资源:例如Jsp, Servlet, 静态图片文件或静态 html 文件等进行拦截,从而实现一些特殊的功能。例如实现URL级别的权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

    1  生命周期:服务器启动执行init 方法,当调用拦截到的时候执行doFilter方法,服务器关闭执行destroy方法。

    2  实例

        1)批量设置请求编码

       public class EncodingFilter implements Filter {


        private String encoding = null;

        public void destroy() {
            encoding = null;
        }

        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            String encoding = getEncoding();
            if (encoding == null){
                encoding = "gb2312";
            }
            request.setCharacterEncoding(encoding);// 在请求里设置上指定的编码
            chain.doFilter(request, response);
        }

        public void init(FilterConfig filterConfig) throws ServletException {
            this.encoding = filterConfig.getInitParameter("encoding");
        }

        private String getEncoding() {
            return this.encoding;
        }

    }

    Xml代码

    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>com.logcd.filter.EncodingFilter</filter-class>
        <init-param>
           <param-name>encoding</param-name>
           <param-value>gb2312</param-value>
        </init-param>
    </filter>

    <filter-mapping>
       <filter-name>EncodingFilter</filter-name>
       <url-pattern>/*</url-pattern>

    </filter-mapping>

       2)用filter控制用户访问权限 

    public void doFilter(ServletRequest request,

            ServletResponse response,
            FilterChain chain)
            throws IOException, ServletException {

        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        HttpSession session = req.getSession();
        if (session.getAttribute("username") != null) {//登录后才能访问
            chain.doFilter(request, response);
        } else {
            res.sendRedirect("../failure.jsp");
        }

    }

     XML 代码

    <filter>
        <filter-name>SecurityFilter</filter-name>
        <filter-class>com.logcd.filter.SecurityFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>SecurityFilter</filter-name>
        <url-pattern>/admin/*</url-pattern>

    </filter-mapping>

    3 Filter 执行顺序 

          当有多个Filter 的时候执行顺序是采用过滤链的方法,一次执行多个Filter的doFilter()方法.按照web.xml中过滤器定义的先后循序组装成一条链。先执行chain.doFilter()前面的方法一次然后从后到前执行chain.doFilter()后面的方法。

        如上执行顺序为:

  • 执行EncodingFilter.doFilter()中chain.doFilter()之前的部分:request.setCharacterEncoding("gb2312");
  • 执行SecurityFilter.doFilter()中chain.doFilter()之前的部分:判断用户是否已登录。
  • 如果用户已登录,则访问请求的资源:/admin/index.jsp。
  • 如果用户未登录,则页面重定向到:/failure.jsp。
  • 执行SecurityFilter.doFilter()中chain.doFilter()之后的部分:这里没有代码。
  • 执行EncodingFilter.doFilter()中chain.doFilter()之后的部分:这里也没有代码。

  • 参考资料:http://log-cd.iteye.com/blog/423179
  •  
查看全文
  • 相关阅读:
    Windows 8/8.1/10 加载动画WPF实现
    WPF
    NAT类型判断
    Visual Studio插件: SlowCheetah
    EF6连接MySQL若干问题汇总
    javascript 继承
    docker安装宝塔
    协同推荐算法-php实现
    大文件传输解决方案:分片上传 / 下载限速
    WEB 防止CSRF攻击
  • 原文地址:https://www.cnblogs.com/brucetie/p/3993030.html
  • Copyright © 2011-2022 走看看