解决Servlet中处理GET请求乱码问题

来源:互联网 发布:js通过标签名获取元素 编辑:程序博客网 时间:2024/05/02 01:16

一、乱码原因

①传输方和接收方采用的编码不一致。传输方对参数采用的是UTF-8编码而接收方却用GBK进行解析,当然是乱码。
②Tomcat服务器默认采用的ISO8859-1编码得到参数值。虽然①中采用了同样的编码方式,但经过tomcat一处理,也会出现乱码(GET方式)

二、解决办法

方法一 每次传输都手动设置编码(GET方式传输数据) 传输方

String name = URLEncoder.encode("张三","UTF-8"); String path = "http://localhost:8008/xyWeb/xyServlet?name=" + name;

接收方

String name = new String(request.getParameter("name").getBytes("ISO8859-1"),"UTF-8");

若传输方默认采用UTF-8编码就没有必要每次写,但接收方每次都写太烦,可考虑过滤器。

方法二(过滤器)

/**  - 编码过滤器  -   - @author xy  -   */  public class EncodingFilter implements Filter  {      private String encoding;      public void init(FilterConfig fConfig) throws ServletException      {          encoding = fConfig.getInitParameter("encoding");      }      public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws Exception      {          HttpServletRequest httprequest = (HttpServletRequest) request;          if ("GET".equals(httprequest.getMethod()))          {              // 将httpRequest进行包装              EncodingHttpServletRequest wrapper = new EncodingHttpServletRequest(httprequest, encoding);               chain.doFilter(wrapper, response);          }          else          {              request.setCharacterEncoding(encoding);              response.setContentType("text/html;charset=" + encoding);              chain.doFilter(request, response);          }      }      public void destroy()      {      }  }  /**  - httpRequest进行包装类  -   - @author xy  -   */  public class EncodingHttpServletRequest extends HttpServletRequestWrapper  {      private HttpServletRequest request;      private String encoding;      public EncodingHttpServletRequest(HttpServletRequest request)      {          super(request);          this.request = request;      }      public EncodingHttpServletRequest(HttpServletRequest request,String encoding)      {          super(request);          this.request = request;          this.encoding = encoding;      }      @Override      public String getParameter(String name)      {          String value = request.getParameter(name);          if (null != value)          {              try              {                  // tomcat默认以ISO8859-1处理GET传来的参数。把tomcat上的值用ISO8859-1获取字节流,再转换成UTF-8字符串                  value = new String(value.getBytes("ISO8859-1"), encoding);              }              catch (UnsupportedEncodingException e)              {                  e.printStackTrace();              }          }          return value;      }  }  
<filter>    <display-name>EncodingFilter</display-name>    <filter-name>EncodingFilter</filter-name>    <filter-class>cn.xy.filter.EncodingFilter</filter-class>    <init-param>      <description></description>      <param-name>encoding</param-name>      <param-value>UTF-8</param-value>    </init-param>  </filter>  <filter-mapping>    <filter-name>EncodingFilter</filter-name>    <url-pattern>/*</url-pattern>  </filter-mapping> 

方法三:修改Tomcat容器的编码

默认情况下,tomcat使用的的编码方式:iso8859-1 修改tomcat下的conf/server.xml文件 找到如下代码:<
Connector port=”8080” protocol=”HTTP/1.1” connectionTimeout=”20000”
redirectPort=”8443” /> 这段代码规定了Tomcat监听HTTP请求的端口号等信息。
可以在这里添加一个属性:URIEncoding,将该属性值设置为UTF-8,即可让Tomcat(默认ISO-8859-1编码)以UTF-8的编码处理get请求。
修改完成后:< Connector port=”8080” protocol=”HTTP/1.1”
connectionTimeout=”20000” redirectPort=”8443” URIEncoding=”UTF-8” />

0 0