解决get方法传递URL参数中文乱码问题

转载 2016年01月23日 17:19:07

一、解决tomcat下中文乱码问题(先来个简单的)

1.1.过滤器代码:

package filter;  

import java.io.*;  
import javax.servlet.*;  
import javax.servlet.http.*;  
import wrapper.GetHttpServletRequestWrapper;  

public class ContentTypeFilter implements Filter {  

    private String charset = "UTF-8";  
    private FilterConfig config;  

    public void destroy() {  
        System.out.println(config.getFilterName()+"被销毁");  
        charset = null;  
        config = null;  
    }  

    public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain chain) throws IOException, ServletException {  
        //设置请求响应字符编码  
        request.setCharacterEncoding(charset);  
        response.setCharacterEncoding(charset);  

        HttpServletRequest req = (HttpServletRequest)request;  


        System.out.println("----请求被"+config.getFilterName()+"过滤");  
        //执行下一个过滤器(如果有的话,否则执行目标servlet)  
        chain.doFilter(req, response);  

        System.out.println("----响应被"+config.getFilterName()+"过滤");  

    }  

    public void init(FilterConfig config) throws ServletException {  
            this.config = config;  
            String charset = config.getServletContext().getInitParameter("charset");    
            if( charset != null && charset.trim().length() != 0)  
            {  
                this.charset = charset;  
            }  
    }  

}  

1.2.web.xml中过滤器配置:

<!--将采用的字符编码配置成应用初始化参数而不是过滤器私有的初始化参数是因为在JSP和其他地方也可能需要使用-->  
    <context-param>  
            <param-name>charset</param-name>  
            <param-value>UTF-8</param-value>  
    </context-param>  

    <filter>  
        <filter-name>ContentTypeFilter</filter-name>  
        <filter-class>filter.ContentTypeFilter</filter-class>  
    </filter>  

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

二、代码中设置编码
2.1. request、response 中设置
2.1.1. request.setCharacterEncoding(charset); 必须写在第一次使用request.getParameter()之前,这样才能保证参数是按照已经设置的字符编码来获取。
2.1.2. response.setCharacterEncoding(charset);必须写在PrintWriter out = request.getWriter()之前,这样才能保证out按照已经设置的字符编码来进行字符输出。

问题:通过过滤器,我们可以保证在Servlet或JSP执行之前就设置好了请求和响应的字符编码,但是这样并不能完全解决中文乱码问题,对于post请求,无论是“获取参数环节”还是“输出环节”都是没问题的。对于get请求,”输出环节”没有问题,但是”获取参数环节”依然出现中文乱码,所以在输出时直接将乱码输出了。原因是post请求和get请求存放参数位置是不同的

post方式参数存放在请求数据包的消息体中get方式参数存放在请求数据包的请求行的URI字段中,以?开始以param=value&parame2=value2的形式附加在URI字段之后。而request.setCharacterEncoding(charset); 只对消息体中的数据起作用,对于URI字段中的参数不起作用,我们通常通过下面的代码来完成编码转换:

String paramValue = request.getParameter("paramName");  
paramValue = new String(paramValue.trim().getBytes("ISO-8859-1"), charset);  

但是每次进行这样的转换实在是很麻烦,有没有统一的解决方案呢?
三、统一的解决方案
3.1. 在tomcat_home\conf\server.xml 中的Connector元素中设置URIEncoding属性为合适的字符编码

Connector port="8080" protocol="HTTP/1.1"   
           connectionTimeout="20000"   
           redirectPort="8443"   
           URIEncoding="UTF-8"  
 />  

这样做的缺点是,同一个tomcat下的其他应用也将受到影响。而其每次部署时都需要修改配置也很麻烦。

3.2. 自定义请求包装器包装请求,将字符编码转换的工作添加到getParameter()方法中

package wrapper;  

import java.io.UnsupportedEncodingException;  
import java.net.URLDecoder;  

import javax.servlet.http.HttpServletRequest;  
import javax.servlet.http.HttpServletRequestWrapper;  

public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {  

    private String charset = "UTF-8";  

    public GetHttpServletRequestWrapper(HttpServletRequest request) {  
        super(request);  
    }  

    /** 
     * 获得被装饰对象的引用和采用的字符编码 
     * @param request 
     * @param charset 
     */  
    public GetHttpServletRequestWrapper(HttpServletRequest request,  
            String charset) {  
        super(request);  
        this.charset = charset;  
    }  

    /** 
     * 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换 
     */  
    public String getParameter(String name) {  
        String value = super.getParameter(name);  
        value = value == null ? null : convert(value);  
        return value;  
    }  

    public String convert(String target) {  
        System.out.println("编码转换之前:" + target);  
        try {  
            return new String(target.trim().getBytes("ISO-8859-1"), charset);  
        } catch (UnsupportedEncodingException e) {  
            return target;  
        }  
    }  

}  

修改过滤器的doFilter方法 代码如下:

public void doFilter(ServletRequest request, ServletResponse response,  
            FilterChain chain) throws IOException, ServletException {  
        //设置请求响应字符编码  
        request.setCharacterEncoding(charset);  
        response.setCharacterEncoding(charset);  
        //新增加的代码          
        HttpServletRequest req = (HttpServletRequest)request;  

        if(req.getMethod().equalsIgnoreCase("get"))  
        {  
            req = new GetHttpServletRequestWrapper(req,charset);  
        }  

        System.out.println("----请求被"+config.getFilterName()+"过滤");  
        //传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象  
        chain.doFilter(req, response);  

        System.out.println("----响应被"+config.getFilterName()+"过滤");  

    }  

URL中特殊符号的转义/400 bad request错误

django+nginx+uwsgi部署的站点访问某个URL时发生了400 bad request的错误,而使用django自带的开发版的web server时没有遇到此问题。初步判断是nginx或u...

nginx设置目录浏览及中文乱码问题解决

在Nginx下默认是不允许列出整个目录的。如需此功能, 先打开nginx.conf文件,在location server 或 http段中加入 autoindex on; 另外两个参数最好也...

HttpClient数据传输的编码方式

约定 1. HttpClient版本:HttpClient4.1 2. 服务端中间件:tomcat7 HttpGet请求的URI编码设置 1. 问题及原因 使用HttpClient的H...

页面get请求 中文参数方法乱码问题

地址栏中出现汉字的情况有两种,一种是汉字出现在URL的路径部分,一种是汉字出现在URL的传参的部分,第二种情况的时候必须采用编码后传参,接受时解码的方式完成传参。   js中编码有escape(),e...

get请求,中文乱码解决 之 百度如何正确获取中文请求参数(我猜测)

url查询串不直接支持中文等非ASCII码表符号的传输,需要经过浏览器采取一种编码方案将中文字符编码为可用于url传输的符号(也就是ASCII码的符号)。除这种类似中文查询串的情况外,url中有特殊用...

android客户端通过Get方式提交参数给服务器,使用URL和HttpURLConnection实现,以及乱码问题解决

服务器端的设置服务器端采用Struts2来接收android端的请求,android版本为2.2.3配置如下:1:web.xml的配置为 Struts Blank ...
  • woshisap
  • woshisap
  • 2011年07月21日 16:45
  • 20881

解决HttpURLConnection请求时传中文参数乱码问题

解决HttpURLConnection请求时传中文参数乱码前提: 项目的编码是utf-8, 即要保证项目下所有文件的编码都是utf-8 示例代码如下:/** * @see HttpServlet#...

解决get请求方式乱码的方法

应用一:解决tomcat下中文乱码问题(先来个简单的)  在tomcat下,我们通常这样来解决中文乱码问题: 过滤器代码: package filter;      im...

解决:JS代码URL传中文参数乱码

如题:解决JS代码URL传中文参数乱码 方法和步骤: 传参数之前对中文的url参数进行 window.location = encodeURI(encodeURI("xxx.html?...
  • kepoon
  • kepoon
  • 2016年11月11日 20:25
  • 2202

微信开发中文乱码问题总结

1.servlet中设置request和response编码 request.setCharacterEncoding("UTF-8"); response.setCharacterEncoding...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:解决get方法传递URL参数中文乱码问题
举报原因:
原因补充:

(最多只允许输入30个字)