get方式的特殊性:
对应GET方式来说,乱码首先取决与服务器的设置。tomcat中的设置就是这样的
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
useBodyEncodingForURI="true" />
红色部分的设置是说与用户页面编码一致,或者如果你所有的请求都是一个编码,那么你可以设置为URIEncoding="gbk"或uRIEncoding="UTF-8"等。因为我们的项目,不同的请求要做不同的编码,所以统一设置为useBodyEncodingForURI="true。
接下来就是GET与POST相同的地方,就是进入到过滤器以后,进行编码设置。
默认情况下如果没有设置struts.properties的话,dispatcher的默认编码为UTF-8,所以同样的道理,如果你的系统统一编码的话,可以增加struts.properties文件,设置为统一的UTF-8或gbk就可以解决,但是我们的系统又不一样,根据不同的请求,编码又不一样,所以就需要在过滤之前,将dispatcher的变化修改为指定的编码。代码编程了如下:
package com.hispeed.exchange.pgwpage.filter; import java.io.IOException; 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 org.apache.struts2.dispatcher.Dispatcher; import org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter; public class ExchangeFilter extends StrutsPrepareAndExecuteFilter{ FilterConfig filterConfig = null; Dispatcher dispatcher = null; public void doFilter(ServletRequest request, ServletResponse res, FilterChain chain) throws IOException, ServletException { String uri = ((HttpServletRequest)request).getRequestURI(); if(uri.indexOf("/qq/")!=-1){ dispatcher.setDefaultEncoding("gbk") }else{ dispatcher.setDefaultEncoding("utf-8") } super.doFilter(request, res, chain); } /** * 前提 */ protected void postInit(Dispatcher dispatcher,FilterConfig filterConfig){ this.dispatcher = dispatcher; this.filterConfig = filterConfig; } }