zoukankan      html  css  js  c++  java
  • javaweb回顾第十一篇过滤器(附实现中文乱码问题)

     1:过滤器概念

    过滤器就是一种在请求目标资源的中间组件,比喻把污水转换成纯净水中间需要一个污水净化设备,那么这个设备就好比一个过滤器。那么我用图来表示过滤器(可以有多个过滤器)运行的过程

    2:Filter(过滤器)接口

    Filter接口包含三个方法分别是init、doFilter、 destroy下面先逐个介绍。

    2.1:public void init(FilterConfig filterConfig)

    这个方法主要来完成初始化过滤器,容器调用这个方法的时候,向过滤器传递FilterConfig对象,FilterConfig的用法和ServletConfig相似,利用FilterConfig对象可以得到ServletContext对象,以及可以得到部署描述符中过滤器初始化的参数。

    2.2:public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

    该方法和Servlet中的service相似,当客户端请求目标资源的时候,容器就会调用与这个目标资源相关联的过滤器的doFilter方法,在这个方法中可以对请求和响应进行处理,实现过滤器的特定功能,在处理完成之后调用chain.doFilter把请求传给下一个过滤器(目标资源)

    2.3:public void destroy()

    当过滤器生命结束的时候,容器就会调用该方法来释放过滤器的资源

    3:过滤器的配置

    过滤器是通过<filter>和<filter-mapping>元素来完成的。

    3.1:<filter>元素

    <filter>元素的属性,<filter-name>来为过滤器指定一个名字,<filter-class>元素用于指定过滤器完整的限定类名,<init-param>用来为过滤器指定初始化参数,他下面有2个属性,一个是<param-name>参数名称,另一个是<param-value>参数值。

    3.2:<filter-mapping>元素

    <filter-mapping>下面有3个主要的属性,<filter-name>用来指定过滤已经在容器声明的过滤器名称,<url-pattren>和<servlet-name>这两个任选其中一个,<url-pattren>表示当请求这样的url时候过滤器被调用,<servlet-name>表示当这个Servlet被调用时候过滤器被调用(可以有多个Servlet)。

    基本知识准备完毕了,现在我们一起开始进行实践。

    4:过滤器时间应用

    4.1:过滤器解决中文乱码问题

    由于Web容器默认的编码方式是ISO-8859-1,在Servlet/Jsp程序中,通过请求的对象的getParameter()方法得到的字符串是以ISO-8859-1转换而来(有人说我在jsp程序已经设置了UTF-8为什么还出现这种情况呢,那是由于web容器再次对请求的数据进行一次转换,所以后来得到字符串就是ISO-8859-1编码的),这就是导致乱码的原因。如下图

    那么找到根源以后问题就比较好解决了,核心代码如下

    public class EncodingFilter implements Filter {
    
        protected String encoding=null; 
        class myRequestWrapper extends HttpServletRequestWrapper{
    
            public myRequestWrapper(HttpServletRequest request) {
                super(request);
            }
            public String getParameter(String param)
            {
                String value=null;
                try{
                    //post提交
                    super.setCharacterEncoding(encoding);
                    value=super.getParameter(param);
                    if(super.getMethod().equalsIgnoreCase("GET"))//get提交
                    {
                        if(value!=null)
                        {
                            value=new String(value.getBytes("iso8859-1"), encoding);
                        }
                    }        
                }
                catch(UnsupportedEncodingException e){
                    e.printStackTrace();
                }        
                return value;
            }
        }
    
        public void init(FilterConfig filterConfig) throws ServletException {
            this.encoding=filterConfig.getInitParameter("encoding");//从web容器来获取过滤器初始化参数
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            //避免响应出现乱码情况
            response.setCharacterEncoding("text/html;charset="+this.encoding);
            //把过滤器给下一个过滤器或者资源处理器
            chain.doFilter(new myRequestWrapper((HttpServletRequest)request), response);
        }
    
        public void destroy() {
            this.encoding=null;
        }
    }

    对过滤器进行配置

    <filter>
            <filter-name>encoding</filter-name>
            <filter-class>com.lp.filters.EncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <servlet-name>LoginServlet</servlet-name>
            <!-- <url-pattern>/LoginServlet</url-pattern> -->
        </filter-mapping>

    5:过滤器使用场景

    5.1:对用户进行统一验证

    5.2:对用户的访问要求进行记录或者审核

    5.3:对用户请求发送的数据进行过滤或替换

    5.4:转换图像格式

    5.5:对响应的内容进行压缩,减少传输量

    5.6:对请求和响应进行加解密处理

    5.7:触发资源访问事件

  • 相关阅读:
    coredata相关文章,还不错
    Predicates
    iOS5新开发的API总述
    免费Excel教程及模板 微软自带 无木马
    历史的商业行为
    销售激励管理流程和Sales Force Mgmt流程
    亚马逊,应用网关 AWS API GATEWAY
    EXCEL 常用函数公式
    华尔街之狼 原型
    FW:Docker与CI持续集成/CD
  • 原文地址:https://www.cnblogs.com/LipeiNet/p/5778276.html
Copyright © 2011-2022 走看看