zoukankan      html  css  js  c++  java
  • 过虑器应用之1-设置request编码

    一:设置Post编码

    post请求接收中文,需要在Servlet里写上 request.setCharacterEncoding("UTF-8"); 否则默认以iso-8859-1编码,中文显示乱码:web考题.doc,在每个Servlet里都写这句话,有点麻烦。

    通过过滤器,统一设置post编码:

      写一个过虑器,对所有url全部过虑,/*.在doFilter方法中,设置request的编码为utf-8。

      一般情况下,这个过虑器永远是第一个要执行的过虑器。

      最好是通过配置设置编码。这样修改方便<filter><init-param>…

    第一步:实现Filter接口,在doFIlter中接收初始化参数,设置编码

    java代码

    public class CharFilter implements Filter {
        //声明编码的成员变量
        private String encoding;
        public void init(FilterConfig config) throws ServletException {
            encoding = config.getInitParameter("bm"); 
        }
        public void doFilter(ServletRequest request, ServletResponse response,
                FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding(encoding); 

        //设置响应编码,否则,默认为iso-8859-1,jsp展示中文乱码
        response.setContentType("text/html;charset=" + encoding);

    //放行,必须要放行。
            chain.doFilter(request, response);
        }
        public void destroy() {
        }
    }

    第二步:将上面的类配置到web.xml

    <!-- 编码过滤器 -->
      <filter>
          <filter-name>char</filter-name>
          <filter-class>com.lhy.filter.CharFilter</filter-class>
          <init-param>
          <!-- 设置编码 -->
              <param-name>bm</param-name>
              <param-value>UTF-8</param-value>
          </init-param>
      </filter>
      <filter-mapping>
          <filter-name>char</filter-name>
          <!-- 对所有url过滤 -->
          <url-pattern>/*</url-pattern>
      </filter-mapping>
      

    测试:request接收参数:  web考题.doc ,中文正常显示。

    二:Get设置编码

    在CharFilter中对reuqest进行包装。

    目的:修改增强getParameter方法,如果是get转码。

    第一步:声明包装类:

    /**
     * 对get可以处理中文
     * 声明包装类
     * 在CharFilter中对reuqest进行包装。
     * 目的:修改增强getParameter方法,如果是get转码。
     */
    public class MyRequest extends HttpServletRequestWrapper {
    
      public MyRequest(HttpServletRequest request) {
        super(request);
      }
      //增强getParamter
      @Override
      public String getParameter(String name) {
        String val = super.getParameter(name);
        if(super.getMethod().equals("GET")){
          try {
            val = new String(val.getBytes("ISO-8859-1"),super.getCharacterEncoding());
          } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
          }
        }
        return val;
      }
    }

    第二步:在doFilter方法中,声明包装类的实例

    public class CharFilter implements Filter{
    
      //声明编码的成员变量
      private String encoding;
    
      @Override
      public void init(FilterConfig filterConfig) throws ServletException {
        encoding = filterConfig.getInitParameter("bm"); 
      }
      
      @Override
      public void destroy() {
      }
    
      @Override
      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
          throws IOException, ServletException {
        request.setCharacterEncoding(encoding);
        //设置响应编码,否则,默认为iso-8859-1,jsp展示中文乱码
        response.setContentType("text/html;charset=" + encoding);
        // 判断是否需要包装
        HttpServletRequest req = (HttpServletRequest)request;
        if(req.getMethod().equals("GET")){
          request = new MyRequest(req);//实例化包装类。
        }
        //放行,必须要放行。
        chain.doFilter(request, response);
      }
    
    }

    test:

    <a href="CharServlet?pwd=阿斯达">get</a>   req.getParameter("pwd");--阿斯达

  • 相关阅读:
    select接收后台返回值的解决方案
    junit 使用
    jsoup解析HTML及简单实例
    面向接口编程及适配器模式
    数据库 SQL语句小结(更新中)
    最近关于虚拟机的学习
    AQS源码解析
    ReentrantLock源码阅读记录(二)之ReentrantReadWriteLock
    Semaphore 源码解读
    Httpclient学习多一点儿
  • 原文地址:https://www.cnblogs.com/lihaoyang/p/7374310.html
Copyright © 2011-2022 走看看