struts2中文乱码问题
scorpionqxq
2009-06-24
// get请求时,重新编码
if ("GET".equals(req.getMethod())) { Enumeration names = request.getParameterNames(); while (names.hasMoreElements()) { String name = (String) names.nextElement(); String[] values = request.getParameterValues(name); for (int i = 0; i < values.length; i++) { values[i] = new String(values[i].getBytes("ISO-8859-1"), encoding); } } } |
|
leton2008
2009-06-24
先修改过滤器为以前的org.apache.struts2.dispatcher.FilterDispatcher
先不用折腾了,等新版出来就更新就ok... |
|
afeifqh
2009-06-24
Struts2.0的乱码并不是使用过滤器进行处理的,而是要在struts.properties文件中加入以下配置:
struts.i18n.encoding=GBK struts.properties要放在src目录下,这样可以解决参数传递中出现的乱码问题,这里的乱码处理是由Struts2.0的拦截器处理的,自己编写的过滤器处理时不会生效。 |
|
Fly_m
2009-06-26
页面参数在get上直接传中文参数,这是有问题的。问题根据浏览器的不同,会有不同的结果。
这个问题不包括在表单内填中文,这样在传递时浏览器会自动encode,action是会正常访问的。 在浏览器上写中文参数,比如一个链接为xxx.action?param1=中文 这样的例子,这是不规范的,一般这样,在jsp页面上,则中文的参数进行编码,用URIEncoder.encode(str,encoding)这个方法,第二个参数必须和服务器端的编码一致(如gbk或utf8,取决于项目的编码),这样action会自动进行decode操作(在某个方法里面, 我忘了是哪个方法的,struts2解析参数时会decode一次),从而得到正确的值。 |
|
leton2008
2009-06-26
afeifqh 写道 Struts2.0的乱码并不是使用过滤器进行处理的,而是要在struts.properties文件中加入以下配置:
struts.i18n.encoding=GBK struts.properties要放在src目录下,这样可以解决参数传递中出现的乱码问题,这里的乱码处理是由Struts2.0的拦截器处理的,自己编写的过滤器处理时不会生效。 请仔细看下 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; try { prepare.createActionContext(request, response); prepare.assignDispatcherToThread(); prepare.setEncodingAndLocale(request, response); request = prepare.wrapRequest(request); ActionMapping mapping = prepare.findActionMapping(request, response); if (mapping == null) { boolean handled = execute.executeStaticResourceRequest(request, response); if (!handled) { chain.doFilter(request, response); } } else { execute.executeAction(request, response, mapping); } } finally { prepare.cleanupRequest(request); } } 这里 prepare.setEncodingAndLocale(request, response); 和prepare.createActionContext(request, response); 的顺序。 setEncodingAndLocale这个方法就是用来进行字符集编码的。 其中会使用到struts.i18n.encoding指定的这个常量. 但是由于现有版本2.1.6中的PrepareAndExecuteFilter使用了以上代码块的内容,于是出现了先将内容放入Action中,然后再进行字符编码转换。。。 如下所示: prepare.createActionContext(request, response); prepare.assignDispatcherToThread(); prepare.setEncodingAndLocale(request, response); 自然编码转换当然无用了。。。 |
|
luying84
2009-06-26
Fly_m 写道 页面参数在get上直接传中文参数,这是有问题的。问题根据浏览器的不同,会有不同的结果。
这个问题不包括在表单内填中文,这样在传递时浏览器会自动encode,action是会正常访问的。 在浏览器上写中文参数,比如一个链接为xxx.action?param1=中文 这样的例子,这是不规范的,一般这样,在jsp页面上,则中文的参数进行编码,用URIEncoder.encode(str,encoding)这个方法,第二个参数必须和服务器端的编码一致(如gbk或utf8,取决于项目的编码),这样action会自动进行decode操作(在某个方法里面, 我忘了是哪个方法的,struts2解析参数时会decode一次),从而得到正确的值。 我同意你的观点! |
|
luying84
2009-06-26
leton2008 写道 afeifqh 写道 Struts2.0的乱码并不是使用过滤器进行处理的,而是要在struts.properties文件中加入以下配置:
struts.i18n.encoding=GBK struts.properties要放在src目录下,这样可以解决参数传递中出现的乱码问题,这里的乱码处理是由Struts2.0的拦截器处理的,自己编写的过滤器处理时不会生效。 请仔细看下 public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; try { prepare.createActionContext(request, response); prepare.assignDispatcherToThread(); prepare.setEncodingAndLocale(request, response); request = prepare.wrapRequest(request); ActionMapping mapping = prepare.findActionMapping(request, response); if (mapping == null) { boolean handled = execute.executeStaticResourceRequest(request, response); if (!handled) { chain.doFilter(request, response); } } else { execute.executeAction(request, response, mapping); } } finally { prepare.cleanupRequest(request); } } 这里 prepare.setEncodingAndLocale(request, response); 和prepare.createActionContext(request, response); 的顺序。 setEncodingAndLocale这个方法就是用来进行字符集编码的。 其中会使用到struts.i18n.encoding指定的这个常量. 但是由于现有版本2.1.6中的PrepareAndExecuteFilter使用了以上代码块的内容,于是出现了先将内容放入Action中,然后再进行字符编码转换。。。 如下所示: prepare.createActionContext(request, response); prepare.assignDispatcherToThread(); prepare.setEncodingAndLocale(request, response); 自然编码转换当然无用了。。。 希望以后的版本能解决这问题,就不用这么麻烦了! |
|
lgl669
2009-06-29
乱码问题一直是困扰很多人。有很多人在server.xml改了没有作用,用.getBytes("ISO-8859-1"), "UTF-8")也没有用,其实这是strut自身对中文支持的问题,要想彻底的解决问题直接的方法就是用隐藏表单提交,绝对没有问题的。<input type=hidden name=user value="我是好人">;把你要传的汉字放入value中,通过form提交就ok了。
|
|
dengjianli
2009-06-29
解决这个问题需要添加一个过滤类。
首先:web.xml文件中配置过滤。 过滤类如下: import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CharacterEncodingFilter extends HttpServlet implements Filter { private FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) { try { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; req.setCharacterEncoding("UTF-8");// 与页面保持一致,一般情况下用UTF-8 res.setContentType("text/html; charset=UTF-8");// 与页面保持一致,一般情况下用UTF-8 filterChain.doFilter(request, response); } catch (ServletException sx) { filterConfig.getServletContext().log(sx.getMessage()); } catch (IOException iox) { filterConfig.getServletContext().log(iox.getMessage()); } } public void destroy() { } } |
|
lgl669
2009-06-29
url传中文,过滤器是解决不了的
|