使用过滤器Filter解决JSP+Servlet页面编码乱码

    最近又拿起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

你可能感兴趣的:(使用过滤器Filter解决JSP+Servlet页面编码乱码)