来自:http://www.javaeye.com/topic/483158

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

在tomcat下,我们通常这样来解决中文乱码问题:

过滤器代码:

  1. package filter;
  2. import java.io.*;
  3. import javax.servlet.*;
  4. import javax.servlet.http.*;
  5. import wrapper.GetHttpServletRequestWrapper;
  6. public class ContentTypeFilter implements Filter {
  7. private String charset = "UTF-8";
  8. private FilterConfig config;
  9. public void destroy() {
  10. System.out.println(config.getFilterName()+"被销毁");
  11. charset = null;
  12. config = null;
  13. }
  14. public void doFilter(ServletRequest request, ServletResponse response,
  15. FilterChain chain) throws IOException, ServletException {
  16. //设置请求响应字符编码
  17. request.setCharacterEncoding(charset);
  18. response.setCharacterEncoding(charset);
  19. HttpServletRequest req = (HttpServletRequest)request;
  20. System.out.println("----请求被"+config.getFilterName()+"过滤");
  21. //执行下一个过滤器(如果有的话,否则执行目标servlet)
  22. chain.doFilter(req, response);
  23. System.out.println("----响应被"+config.getFilterName()+"过滤");
  24. }
  25. public void init(FilterConfig config) throws ServletException {
  26. this.config = config;
  27. String charset = config.getServletContext().getInitParameter("charset");
  28. if( charset != null && charset.trim().length() != 0)
  29. {
  30. this.charset = charset;
  31. }
  32. }
  33. }

web.xml中过滤器配置:

  1. <!--将采用的字符编码配置成应用初始化参数而不是过滤器私有的初始化参数是因为在JSP和其他地方也可能需要使用-->
  2. <context-param>
  3. <param-name>charset</param-name>
  4. <param-value>UTF-8</param-value>
  5. </context-param>
  6. <filter>
  7. <filter-name>ContentTypeFilter</filter-name>
  8. <filter-class>filter.ContentTypeFilter</filter-class>
  9. </filter>
  10. <filter-mapping>
  11. <filter-name>ContentTypeFilter</filter-name>
  12. <url-pattern>/*</url-pattern>
  13. </filter-mapping>

request.setCharacterEncoding(charset); 必须写在第一次使用request.getParameter()之前,这样才能保证参数是按照已经设置的字符编码来获取。
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字段中的参数不起作用,我们通常通过下面的代码来完成编码转换:

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

但是每次进行这样的转换实在是很麻烦,有没有统一的解决方案呢?

解决方案1: 在tomcat_home\conf\server.xml 中的Connector元素中设置URIEncoding属性为合适的字符编码

  1. <Connector port="8080" protocol="HTTP/1.1"
  2. connectionTimeout="20000"
  3. redirectPort="8443"
  4. URIEncoding="UTF-8"
  5. />

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

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

  1. package wrapper;
  2. import java.io.UnsupportedEncodingException;
  3. import java.net.URLDecoder;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletRequestWrapper;
  6. public class GetHttpServletRequestWrapper extends HttpServletRequestWrapper {
  7. private String charset = "UTF-8";
  8. public GetHttpServletRequestWrapper(HttpServletRequest request) {
  9. super(request);
  10. }
  11. /**
  12. * 获得被装饰对象的引用和采用的字符编码
  13. * @param request
  14. * @param charset
  15. */
  16. public GetHttpServletRequestWrapper(HttpServletRequest request,
  17. String charset) {
  18. super(request);
  19. this.charset = charset;
  20. }
  21. /**
  22. * 实际上就是调用被包装的请求对象的getParameter方法获得参数,然后再进行编码转换
  23. */
  24. public String getParameter(String name) {
  25. String value = super.getParameter(name);
  26. value = value == null ? null : convert(value);
  27. return value;
  28. }
  29. public String convert(String target) {
  30. System.out.println("编码转换之前:" + target);
  31. try {
  32. return new String(target.trim().getBytes("ISO-8859-1"), charset);
  33. } catch (UnsupportedEncodingException e) {
  34. return target;
  35. }
  36. }
  37. }

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

  1. public void doFilter(ServletRequest request, ServletResponse response,
  2. FilterChain chain) throws IOException, ServletException {
  3. //设置请求响应字符编码
  4. request.setCharacterEncoding(charset);
  5. response.setCharacterEncoding(charset);
  6. //新增加的代码
  7. HttpServletRequest req = (HttpServletRequest)request;
  8. if(req.getMethod().equalsIgnoreCase("get"))
  9. {
  10. req = new GetHttpServletRequestWrapper(req,charset);
  11. }
  12. System.out.println("----请求被"+config.getFilterName()+"过滤");
  13. //传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象
  14. chain.doFilter(req, response);
  15. System.out.println("----响应被"+config.getFilterName()+"过滤");
  16. }

这样一来,在servlet中调用包装器的getParameters方法来获取参数,就已经完成了字符编码的转换过程,我们就不需要在每次获取参数时来进行字符编码转换了。

 
http://825635381.iteye.com/blog/2178986

[转]解决get方法传递URL参数中文乱码问题的更多相关文章

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

    [转]解决get方法传递URL参数中文乱码问题 来自:http://www.javaeye.com/topic/483158 应用一:解决tomcat下中文乱码问题(先来个简单的) 在tomcat下, ...

  2. ajax url参数中文乱码解决方法

    较好的处理办法,对js的url中的中文参数值使用两次encodeURI(),即encodeURI(encodeURI("url的中文参数值")) JS代码: var name=&q ...

  3. ajax url参数中文乱码解决

    1.较好的处理办法,对js的url中的中文参数值使用两次encodeURI(),即 encodeURI(encodeURI("url的中文参数值")), java代码中使用URLD ...

  4. JS获取URL参数中文乱码解决

    var param = window.location.search; var paramArray = parseParams(param); var selectV = decodeURI(par ...

  5. 解决URL参数中文乱码

    string key = HttpUtility.UrlDecode(Request["key"], Encoding.UTF8);

  6. ASIHTTPRequest 中url参数中文乱码

    ASIHTTPReques确实是在开发过程中,数据的传输,获取方面给我们很大的帮助.然而在一些方面也是需要一些的注意. 在我们使用ASIHTTPReques 进行get方式获取数据时,如果需要传入中文 ...

  7. 解决get方法提交参数中文乱码问题:

    解决get方法提交参数中文乱码问题: 1找到你们的tomcat的目录 2在这个目录下面\tomcat61-32\tomcat61\conf 3找到server.xml ,用notepad打开(没有就下 ...

  8. URL传值中文乱码的解决

    使用 tomcat 时,相信大家都回遇到中文乱码的问题,具体表现为通过表单取得的中文数据为乱码. 一.初级解决方法 通过一番检索后,许多人采用了如下办法,首先对取得字符串按照 iso8859-1 进行 ...

  9. js url传值中文乱码完美解决(JAVA)

    js url传值中文乱码完美解决(JAVA) 首先在你的jsp页面这样更改: var url="你要传入的Action的位置&ipid="+ipid+"& ...

随机推荐

  1. 基于visual Studio2013解决C语言竞赛题之1048打印矩阵

      题目 解决代码及点评 /* 48. 找规律填写N×N方阵.如N=8时, 其方阵为: */ #include <stdio.h> #include <stdlib.h& ...

  2. STL容器总结

    一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...

  3. 关于wxFileSystemWatcher输出文件名的解决方法

    本文针对的wxWidgets版本: 2.9.4, 2.9.5,其他版本未作测试. 如果要使用 wxFileSystemWatcher 并且让其产生的wxFileSystemWatcherEvent 事 ...

  4. 最简单的基于FFMPEG+SDL的视频播放器 ver2 (採用SDL2.0)

    ===================================================== 最简单的基于FFmpeg的视频播放器系列文章列表: 100行代码实现最简单的基于FFMPEG ...

  5. (转载)QT中PRO文件写法的详细介绍,很有用,很重要!

    版权声明:本文为博主原创文章,未经博主允许不得转载. 在QT中,有一个工具qmake可以生成一个makefile文件,它是由.pro文件生成而来的,.pro文件的写法如下: 1. 注释从“#”开始,到 ...

  6. 多屏广告技术调研 & 广告基础介绍

    之前做的多屏广告产品调研,并简单介绍了一些基础广告知识.见ppt:多屏广告技术调研

  7. Swift - 做一个简单的无线U盘(手机端Http服务器搭建)

    由于iOS系统的封闭性,在数据传输方面十分不方便.不像安卓设备,直接连接电脑就能当U盘使用.所以一般我们如果用iPhone临时存取个东西,要么使用数据线连接iTunes,要么手机电脑都登上QQ,使用Q ...

  8. wift - 使用UIScreen类获取屏幕大小尺寸

    UISreen类代表了屏幕,开发中一般用来获取屏幕相关的属性,例如获取屏幕的大小. 1 2 3 4 5 6 7 //获取屏幕大小 var screenBounds:CGRect = UIScreen. ...

  9. JSP的学习(6)——九大隐式对象及其out对象

    本篇将介绍JSP中的九大隐式对象,并重点介绍其中的out对象. 我们在之前的博客<JSP的学习(1)——基础知识与底层原理>一文中已经知道,JSP最终要被翻译和转换成Servlet,在转换 ...

  10. UVA - 12119 The Bells are Ringing (枚举)

    Perhaps you all have heard the mythical story about Tower of Hanoi (The details of this story is not ...