解决全站中文乱码(利用过滤器)

过滤器解决中文乱码的思想:
为什么get和post访问方式解决乱码的方法不一样?

过滤器拦截用户的请求访问,实现统一全站编码的功能。但是,由于请求方式post和get解决乱码方式不同,post方式的请求参数存放在消息体中,可以通过setCharacterEncoding()方法进行设置,而get方式的请求参数存放在消息头中,必须通过获取URI参数才能进行设置。

如果每次单独对get请求方式进行处理,势必会很麻烦,为此,可以通过HttpServletRequestWrapper类对HttpServletRequest进行包装,通过重写getParameter()的方式来设置get方式提交参数的编码。

代码如下:

package cn.com.test;

import java.io.IOException;
import java.io.UnsupportedEncodingException;

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;
public class CharacterFilter implements Filter {

	public void destroy() {
		// TODO Auto-generated method stub
	}

	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) req;
		HttpServletResponse response = (HttpServletResponse) resp;
		//拦截所有的请求,解决全站中文乱码
		//制定request和response的编码
		request.setCharacterEncoding("utf-8");	//这只对消息体有效,也就是只对post方式的请求参数有效,post方式的请求参数存放在消息体中
		response.setContentType("text/html;charset=utf-8");
		
		//在放行的时候应给给目标资源一个request对象,让目标资源调用getParameter时调用到我们写的getParameter
		//对这获取到的request进行包装
		CharacterRequest characterRequest = new CharacterRequest (request);
		
		 //这里放行的时候,携带的就是我们包装后的request → characterRequest
		chain.doFilter(characterRequest, response);
	}

	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}
	
	
	//这个内部类的作用就是对获取到的request对象(原生request对象)的进行包装
	class CharacterRequest extends HttpServletRequestWrapper{

		public CharacterRequest(HttpServletRequest request) {
			super(request);
			
		}
		
		//子类继承父类一定会覆写一些方法,此处用于重写getParameter()方法
		public String getParameter(String name) {
			//调用被包装对象的getParameter()方法,获得请求参数
			String value  =  super.getParameter(name);
			if (value == null) {
				return null;
			}
			
			//判断请求方式
			String method = super.getMethod();
			if ("get".equalsIgnoreCase(method)) {
				try {
				//iso-8859-1 根据具体情况确定是否是是这种编码
					value = new String(value.getBytes("iso-8859-1"),"utf-8");
				} catch (UnsupportedEncodingException e) {
					throw new RuntimeException(e);
				}
			}
			//解决乱码后,返回结果
			return value;
		}
		
	}

}

在web.xml文件中,配置CharacterFilter过滤器,由于要拦截用户访问资源的所有请求,因此将元素拦截的路径设置为“/*”,
代码如下:

<filter>
    <filter-name>CharacterFilter</filter-name>
    <filter-class>cn.com.test.CharacterFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>CharacterFilter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

名字和类需要根据具体的过滤器进行配置

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值