get 请求乱码解决方案



get 请求乱码解决方案

package filter;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import wrapper.GetHttpServletRequestWrapper;

public class ContentTypeFilter implements Filter {

private String charset = “UTF-8″;
private FilterConfig config;

public void destroy() {
System.out.println(config.getFilterName()+”被销毁”);
charset = null;
config = null;
}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//设置请求响应字符编码
request.setCharacterEncoding(charset);
response.setCharacterEncoding(charset);

HttpServletRequest req = (HttpServletRequest)request;

System.out.println(“—-请求被”+config.getFilterName()+”过滤”);
//执行下一个过滤器(如果有的话,否则执行目标servlet)
chain.doFilter(req, response);

System.out.println(“—-响应被”+config.getFilterName()+”过滤”);

}

public void init(FilterConfig config) throws ServletException {
this.config = config;
String charset = config.getServletContext().getInitParameter(“charset”);
if( charset != null && charset.trim().length() != 0)
{
this.charset = charset;
}
}

}


web.xml中过滤器配置:
Xml代码

charset
UTF-8

ContentTypeFilter
filter.ContentTypeFilter

ContentTypeFilter

public GetHttpServletRequestWrapper(HttpServletRequest request,
String charset) {
super(request);
this.charset = charset;
}

public String getParameter(String name) {
String value = super.getParameter(name);
value = value == null ? null : convert(value);
return value;
}

public String convert(String target) {
System.out.println(“编码转换之前:” + target);
try {
return new String(target.trim().getBytes(“ISO-8859-1″), charset);
} catch (UnsupportedEncodingException e) {
return target;
}
}

}
修改过滤器的doFilter方法 代码如下:
Java代码
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//设置请求响应字符编码
request.setCharacterEncoding(charset);
response.setCharacterEncoding(charset);
//新增加的代码
HttpServletRequest req = (HttpServletRequest)request;

if(req.getMethod().equalsIgnoreCase(“get”))
{
req = new GetHttpServletRequestWrapper(req,charset);
}

System.out.println(“—-请求被”+config.getFilterName()+”过滤”);
//传递给目标servlet或jsp的实际上时包装器对象的引用,而不是原始的HttpServletRequest对象
chain.doFilter(req, response);

System.out.println(“—-响应被”+config.getFilterName()+”过滤”);

}
这样一来,在servlet中调用包装器的getParameters方法来获取参数,就已经完成了字符编码的转换过程,我们就不需要在每次获取参数时来进行字符编码转换了