最近又拿起jsp+servlet来做项目,遇到了乱码的问题。解决方案很多,这次决定用过滤器来解决传值过程中的乱码问题。当然前提是tomcat没修改过connector配置项中的uriencoding,即使用tomcat默认的编码配置。
在表单中使用“method”这个属性来指定提交表单时使用的http请求方式。默认是get方式。
使用get方式,提交的参数放在请求的url后面,浏览器会对url进行转义。所以,在服务端要用以下代码取得正确的参数,“utf-8”是我使用的页面字符编码。
Java代码:
string str = new string(request.getparameter("str").getbytes("iso-8859-1"),"utf-8");
如果使用的是post方式,则提交的参数将放在请求的消息体中。这种情况下,只要指定字符串编码就可以了。
Java代码:
request.setcharacterencoding(encode); //encode参数,用来指定我们所使用的字符编码。
使用过滤器解决传值乱码的例子:
I.、写个继承httpservletrequestwrapper的类,扩展一下servlet提供的request的功能
Java代码
package Filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class Request extends HttpServletRequestWrapper
{
public Request(HttpServletRequest request)
{
super(request);
}
public String toChar(String para)
{
try
{
byte[] bytes = para.getBytes("ISO-8859-1");
return new String(bytes, "UTF-8");
}
catch(Exception ex)
{
}
return null;
}
private HttpServletRequest getHttpServletRequest()
{
return (HttpServletRequest)super.getRequest();
}
public String getParameter(String name)
{
return toChar(getHttpServletRequest().getParameter(name));
}
public String[] getParameterValues(String name)
{
String values[] = getHttpServletRequest().getParameterValues(name);
if(values != null)
{
for(int i=0; i<values.length; i++)
{
values[i] = toChar(values[i]);
}
}
return values;
}
}
在上面的类中,我们其实就完成了一件事。在我们使用getparameter(),getparametervalues()取得参数前,先对参数进行了我们之前所说到的第一个动作。
II、编写一个过滤器
Java代码
package Filter;
import java.io.IOException;
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.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
/**
* Servlet Filter implementation class SetCharacterEncoding
*/
@WebFilter("/SetCharacterEncoding")
public class SetCharacterEncoding implements Filter {
private String charset;//字符编码
public void destroy() {
//销毁编码过滤器
charset = null;
}
/**
* @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 设置请求响应字符编码
request.setCharacterEncoding(charset);
response.setCharacterEncoding(charset);
HttpServletRequest httpreq = (HttpServletRequest) request;
if ("get".equalsIgnoreCase(httpreq.getMethod()))
{
// 请求是get方式的,则使用我们进行了扩展的request代替原来的request
request = new Request(httpreq);
} else
{
// 如果请求是post方式的,则request.setCharacterEncoding(encode);
request.setCharacterEncoding(charset);
}
// 传递控制到下一个过滤器
chain.doFilter(request, response);
}
/**
* @see Filter#init(FilterConfig)
*/
public void init(FilterConfig config) throws ServletException {
//初始化编码过滤器
String charset = config.getInitParameter("charset");
if(charset != null && charset.trim().length() != 0)
{
this.charset = charset;
}
}
}
这里,我们使用过滤器完成了两个动作。首先,如果请求是post方式的,则request.setcharacterencoding(encode);如果请求是get方式的,则使用我们进行了扩展的request代替原来的request,这样就做到了对参数进行转码再取值。
III、在web.xml中要配置我们的这个过滤器
Java代码
<filter>
<!-- 过滤器名称 -->
<filter-name>SetCharacterEncoding</filter-name>
<!-- 过滤器类路径 -->
<filter-class>Filter.SetCharacterEncoding</filter-class>
<!-- 初始化参数 -->
<init-param>
<!-- 编码参数 -->
<param-name>charset</param-name>
<param-value>UTF-8</param-value>
</init-param>
<!-- 还可以配置其他更多的参数 -->
</filter>
<!-- 过滤器映射 -->
<filter-mapping>
<filter-name>SetCharacterEncoding</filter-name>
<!-- 过滤的URL(*表示所有请求都被拦截过滤) -->
<url-pattern>/*</url-pattern>
</filter-mapping>
原文出处:http://haouziwefe.iteye.com/blog/1164211