我们在使用jeesite进行开发的时候,在CMS中的评论管理中后发现乱码问题,这个乱码是由于GET请求传递中文造成的,我们的解决方案是自定义编码过滤器解决。
相应的代码如下:
package com.thinkgem.jeesite.common.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
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.HttpServletRequestWrapper;
public class GetAndPostEncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//处理请求乱码
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletRequest myRequest = new MyRequest(httpServletRequest);
//处理响应乱码
response.setContentType("text/html;charset=utf-8");
chain.doFilter(myRequest, response);
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
}
//自定义request对象
class MyRequest extends HttpServletRequestWrapper{
private HttpServletRequest request;
private boolean hasEncode;
public MyRequest(HttpServletRequest request) {
super(request);
this.request=request;
}
//对需要增强的方法 进行覆盖
@Override
@SuppressWarnings("unchecked")
public Map<String,String[]> getParameterMap() {
//先获得请求方式
String method = request.getMethod();
if(method.equalsIgnoreCase("post")){ //post方式请求
try {
request.setCharacterEncoding("utf-8");
return request.getParameterMap();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}else if(method.equalsIgnoreCase("get")){ //get方式请求
Map<String,String[]> parameterMap = request.getParameterMap();
if(!hasEncode){
for(String parameterName:parameterMap.keySet()){
String[] values = parameterMap.get(parameterName);
if(values!=null){
for (int i = 0; i < values.length; i++) {
try {
values[i] = new String(values[i].getBytes("ISO-8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
hasEncode = true;
}
return parameterMap;
}
return super.getParameterMap();
}
@Override
public String getParameter(String name) {
Map<String,String[]> parameterMap = getParameterMap();
String[] values = parameterMap.get(name);
if(values==null){
return null;
}
return values[0];
}
@Override
public String[] getParameterValues(String name) {
Map<String,String[]> parameterMap = getParameterMap();
String[] values=parameterMap.get(name);
return values;
}
}
相应的web.xml配置如下:
<!-- 自定义编码过滤器解决POST请求与GET请求乱码问题 -->
<filter>
<filter-name>getAndPostEncodingFilter</filter-name>
<filter-class>com.thinkgem.jeesite.common.filter.GetAndPostEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>getAndPostEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>