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传中文,过滤器是解决不了的
Global site tag (gtag.js) - Google Analytics