struts2更改默认编码格式,解决前台传后台的中文乱码问题
虽然可以页面用url编码器编码 ,后台用url解码器解码,但是更改量太大,本文不做细说,大概实现为:
//前端js用encodeURI函数转换
例:var a = encodeURI(encodeURI(name));
//后端用URLDecoder类转换
例:String name = request.getParameter("a");
System.out.println("前台传入参数:" + name);
name = URLDecoder.decode(name,"UTF-8");
本文主要解决的是基于struts2-core-2.3.35.jar的版本,更改jar包中的默认编码格式,根据系统调整。解决思路就是重写StrutsPrepareAndExecuteFilter类。
首先看web.xml中的配置
<filter>
<filter-name>struts2</filter-name>
<filter-class>
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
更改后
<filter>
<filter-name>struts2</filter-name>
<filter-class>
com.sinosig.rsa.encodingFilter.StrutsPrepareAndExecuteFilter
</filter-class>
</filter>
重写的类:重点是request.setCharacterEncoding(“GBK”); 这里将编码改为系统的编码即可。
package com.sinosig.rsa.encodingFilter;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;
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.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.StrutsStatics;
import org.apache.struts2.dispatcher.Dispatcher;
import org.apache.struts2.dispatcher.mapper.ActionMapping;
import org.apache.struts2.dispatcher.ng.ExecuteOperations;
import org.apache.struts2.dispatcher.ng.InitOperations;
import org.apache.struts2.dispatcher.ng.PrepareOperations;
import org.apache.struts2.dispatcher.ng.filter.FilterHostConfig;
import com.opensymphony.xwork2.inject.Inject;
import com.opensymphony.xwork2.util.LocalizedTextUtil;
public class StrutsPrepareAndExecuteFilter
implements StrutsStatics, Filter
{
protected PrepareOperations prepare;
protected ExecuteOperations execute;
protected List<Pattern> excludedPatterns;
public StrutsPrepareAndExecuteFilter()
{
this.excludedPatterns = null;
}
public void init(FilterConfig filterConfig) throws ServletException {
InitOperations init = new InitOperations();
Dispatcher dispatcher = null;
try {
FilterHostConfig config = new FilterHostConfig(filterConfig);
init.initLogging(config);
dispatcher = init.initDispatcher(config);
init.initStaticContentLoader(config, dispatcher);
this.prepare = new PrepareOperations(dispatcher);
this.execute = new ExecuteOperations(dispatcher);
this.excludedPatterns = init.buildExcludedPatternsList(dispatcher);
postInit(dispatcher, filterConfig);
} finally {
if (dispatcher != null) {
dispatcher.cleanUpAfterInit();
}
init.cleanup();
}
}
protected void postInit(Dispatcher dispatcher, FilterConfig filterConfig)
{
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest)req;
HttpServletResponse response = (HttpServletResponse)res;
try
{
if ((this.excludedPatterns != null) && (this.prepare.isUrlExcluded(request, this.excludedPatterns))) {
chain.doFilter(request, response);
} else {
this.prepare.setEncodingAndLocale(request, response);
//add by 更改struts2的默认编码格式 begin
request.setCharacterEncoding("GBK");
//add by 更改struts2的默认编码格式 end
this.prepare.createActionContext(request, response);
this.prepare.assignDispatcherToThread();
request = this.prepare.wrapRequest(request);
ActionMapping mapping = this.prepare.findActionMapping(request, response, true);
if (mapping == null) {
boolean handled = this.execute.executeStaticResourceRequest(request, response);
if (!handled)
chain.doFilter(request, response);
}
else {
this.execute.executeAction(request, response, mapping);
}
}
} finally {
this.prepare.cleanupRequest(request);
}
}
public void destroy() {
this.prepare.cleanupDispatcher();
}
}
这样即可。
对于低版本的 可以在dispatcher过滤器中 加上初始参数:
<init-param>
<param-name>struts.i18n.encoding</param-name>
<param-value>utf-8</param-value>//这里面的内容可供用户自己填写(必须是编码格式)
</init-param>