在java web 开发中,常常遇到的问题,就是中文乱码问题;而解决中文乱码的方法有很多种,但本人认为写一个拦截器,并将该l拦截器加入struts2中的默认拦截器中,这样针对没过action请求,我们都可以拦截请求并进行处理,这也可以实现代码的重用性,这就简化了代码的编写量,和出错率了。
主要的代码:
package cn.itcast.oa.utils;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class EncodingInterceptor extends AbstractInterceptor {
@Override
public String intercept(ActionInvocation arg0) throws Exception {
ActionContext actionContext = arg0.getInvocationContext();
HttpServletRequest request = (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);
if(request.getMethod().compareToIgnoreCase("post")>=0){//为post请求,对字符编码的转换,设置为UTF-8编码
try {
request.setCharacterEncoding("UTF-8");
} catch (Exception e) {
e.printStackTrace();
}
}else{//为get请求
Iterator iter = request.getParameterMap().values().iterator();
while(iter.hasNext()){
String[] parames = (String[])iter.next();
for(int i=0;i<parames.length;i++){
try {
//方法一:
parames[i] = new String(parames[i].getBytes("ISO-8859-1"),"UTF-8");
/*方法二:要做jsp页面中的请求做一次URLEncoder.encode(“”)编码
parames[i] = URLEncoder.encode(parames[i]);
parames[i] = URLDecoder.decode(parames[i], "UTF-8");
*/
} catch (Exception e) {e.printStackTrace();
}
}
}
}
return arg0.invoke();
}
}
2:配置struts.xml文件,将改过编码过滤器,加入默认的过滤器中,
<interceptor name="Encoding" class="cn.itcast.oa.utils.EncodingInterceptor"></interceptor>
<interceptor-stack name="mydefault">
<interceptor-ref name="CheckPrivilege"></interceptor-ref>
<interceptor-ref name="Encoding"></interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
<!--
<interceptor-ref name="token"></interceptor-ref>
-->
</interceptor-stack>
</interceptors>
<!-- 修改默认的拦截器 -->
<default-interceptor-ref name="mydefault"></default-interceptor-ref>