JavaWeb应用设置全站乱码过滤器

       Tomcat服务器接收请求时采用的是iso8859-1格式对请求中的参数进行编码,而该编码格式无法识别中文,因此在解码时会产生乱码问题。我们可以为整个web应用设置一个过滤器,让所有的访问请求首先经过过滤器,进行手动编解码,从而避免乱码问题的出现。下面是一段过滤器代码:
package com.sun.day18;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;

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;
import javax.servlet.http.HttpServletResponse;
/**
 * 处理整个web应用全站乱码
 * 1)处理请求参数乱码
 * 2)处理响应正文乱码
 * @author RoySun
 *
 */
public class MixCodeFilter implements Filter{
	@Override
	public void destroy() {}
	

	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		HttpServletResponse res = (HttpServletResponse) response;
		//针对post提交方式,这一句即可处理接收请求中的乱码
		request.setCharacterEncoding("utf-8");
		/*
		 *过滤器中处理响应正文乱码,
		 *所有拦截到的资源的乱码问题都可以解决 
		 */
		response.setContentType("text/html;charset=utf-8");
		/*
		 * 采用装饰者模式,将request对象进行包装,
		 * 在装饰类中重写getParameter等获取参数的方法
		 */
		MyHttpServletRequest myRequest = new MyHttpServletRequest(req);
		chain.doFilter(myRequest, response);
	}

	@Override
	public void init(FilterConfig onfig) throws ServletException {}

}
//装饰类,对HttpServletRequest类进行装饰,重写获取请求参数的方法
class MyHttpServletRequest extends HttpServletRequestWrapper{
	private HttpServletRequest request;
	//构造方法
	public MyHttpServletRequest(HttpServletRequest request) {
		super(request);
		this.request = request;
	}
	@Override
	public String getParameter(String name) {
		return this.getParameterValues(name)==null? null:this.getParameterValues(name)[0];
	}
	
	@Override
	public String[] getParameterValues(String name) {
		return this.getParameterMap().get(name);
	}
	private boolean isEncode=true;
	@Override
	public Map<String, String[]> getParameterMap() {
		if("GET".equalsIgnoreCase(request.getMethod())){//针对get提交方式进行手动编解码
			Map<String, String[]> map = request.getParameterMap();
			if(isEncode){
				for (Entry<String, String[]> entry : map.entrySet()) {
					String[] params = entry.getValue();
					for(int i=0;i<params.length;i++){
						try {
							params[i]=new String(params[i].getBytes("iso8859-1"), "utf-8");
						} catch (UnsupportedEncodingException e) {
							e.printStackTrace();
						}
					}
				}
				isEncode = false;
			}
			return map; 
		}else{//其余6种提交方式
			return request.getParameterMap();
		}
	}
	
}

       这个过滤器中重点针对了我们平时常用的get和post请求模式。post模式的请求参数在响应实体中,采用request.setCharacterEncoding("utf-8")即可处理请求乱码。get请求模式因为它的请求参数是附在请求行中的,因此在获取请求参数的时候,需要先采用iso8859-1格式进行编码,再进行手动采用utf-8格式解码,这样一来我们在过滤器之后的访问中,数据格式都统一为utf-8编码格式。

       这里采用了装饰者模式,对HttpServletRequest进行装饰,重写其中获取请求参数的三种方法,在其中进行手动编解码,统一为utf-8格式编码,经过过滤器之后的请求对象request就是被装饰过得myRequest对象,再调用获取请求参数的方法时,就不会出现乱码问题。

      在写好过滤器之后,我们需要在web应用的配置文件web.xml文件中配置过滤器,配置如下:

<filter>
	<filter-name>MixCodeFilter</filter-name>
	<filter-class>com.sun.day18.MixCodeFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>MixCodeFilter</filter-name>
	<url-pattern>/*</url-pattern>
</filter-mapping>
filter-class表示完整类名,url-pattern表示拦截的访问路径,/*表示拦截过滤所有访问。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值