zoukankan      html  css  js  c++  java
  • 过滤器Filter

    Filter就像一个一个哨卡,用户的请求需要经过Filter,
    并且可以有多个过滤器

    利用过滤器我们可以实现例如自动登录、解决中文乱码问题等。

    1.编写Filter:实现Filter接口,重写方法

    public class MyFilter implements Filter {
    
        public void destroy() {
            System.out.println("过滤器销毁");
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest hrequest = (HttpServletRequest)request;
            HttpServletResponse hresponse = (HttpServletResponse)response;
            hrequest.setCharacterEncoding("utf-8");
            hresponse.setContentType("text/html;charset=utf-8");
            System.out.println("过滤器执行");
            //放行
            chain.doFilter(request, response);
            //filter执行按照配置顺序来进行
        }
    
        public void init(FilterConfig fConfig) throws ServletException {
            // TODO Auto-generated method stub
        }
    
    }

    这里要注意chain.doFilter,执行后即意味着当前过滤器放行,执行下一个过滤器

    2.XML配置:

      <filter>
        <display-name>MyFilter</display-name>
        <filter-name>MyFilter</filter-name>
        <filter-class>web.filter.MyFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>MyFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>

    配置方式和Servlet类似,不同的是过滤器的执行顺序是按照配置文件的先后执行,即在配置文件上方的先被执行。

    3.应用

    解决中文乱码问题

    /**
     * 装饰者:
     * 1.增强类与被增强类实现统一接口
     * 2.增强类中传入被增强类
     * 3.重写需要增强的方法
     * */
    class EnhancedRequest extends HttpServletRequestWrapper{
        private HttpServletRequest request;
        public EnhancedRequest(HttpServletRequest request) {
            super(request);
            this.request = request;
        }
        //getParameter重写
        @Override
        public String getParameter(String name) {
            String parameter = request.getParameter(name);
            try {
                parameter=new String(parameter.getBytes("iso8859-1"),"utf-8");//转码
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return parameter;
        }
        
    }
    public class CNFilter implements Filter {
    
        public void destroy() {
            // TODO Auto-generated method stub
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse rep = (HttpServletResponse) response;
            //增强类对象
            EnhancedRequest enhancedRequest = new EnhancedRequest(req);
            rep.setContentType("text/html;charset=utf-8");//设置响应编码
            chain.doFilter(enhancedRequest, rep);
        }
    
        public void init(FilterConfig fConfig) throws ServletException {
            // TODO Auto-generated method stub
        }
    
    }
  • 相关阅读:
    ASP.NET C# 邮件发送全解
    .NET应用框架架构设计实践 概述
    给大家推荐几个国外IT技术论坛
    IIS 内部运行机制
    大型网站后台架构的Web Server与缓存
    CMD 获得当前目录命令
    html之marquee详解
    sharepoint 富文本编辑器
    C# 将数据导出到Execl汇总(C/S和B/S)
    更改应用程序池的密码 (Windows SharePoint Services)
  • 原文地址:https://www.cnblogs.com/whwjava/p/9067955.html
Copyright © 2011-2022 走看看