乱码问题---HttpServletRequest对象增强

针对网站出现乱码问题,其原因是request和response对象有关,我们知道对于post提交方法解决,可以通过调用request对象的setCharacterEncoding方法来设置其编码方式,而对于response对象,也可以通过调用response的setCharacterEncoding方法设置编码方式,及通过调用response的setContentType方法来指定text/html;charset的编码方式。即:

request.setCharacterEncoding(charset);
		response.setCharacterEncoding(charset);
		response.setContentType("text/html;charset="+charset);

这样可以解决关于request和response的乱码问题,但是只对post提交的方法有效,对get提交的方法无效。考虑到此问题,可以对request对象和response对象的方法进行增强,来解决request引起的的乱码问题。下面的MyRequest是对HttpServletRequest的类的包装类,而HttpServletRequestWrapper是默认实现了HttpServletRequest的包装类,其中争强的方法仅仅是调用了HttpServletRequest对象方法的方法。在实现对HttpServletRequest对象的包装类时,可以继承此类,这样可以不需要对需要进行增强的方法进行重写。仅仅重写需要增强的方法即可。

针对get或者post提交的方法,其携带的信息将以参数的形式带到服务器端,这个时候在服务器端获取时,可能要获取到正确的参数值时,需要采用于提交时对这些值一致的编码方式进行解码。get方法与post不太一样,不管对request指定什么编码方式,服务器端获取到的数据始终是以ISO8859-1解码;因此上述方式通过设置request的字符编码方式,只能对post提交的有效,对get方法无效,因此下面的MyRequest是对request进行增强,由于服务器都是通过request.getParamter(String name)来获取客户端提交过来的数据,因此对其进行增强即可。增强后的MyRequest,将能解决由post和get提交方法产生的乱码问题。

MyRequest为增强后的request类

public class MyRequest extends HttpServletRequestWrapper {
	private HttpServletRequest request;
	private String charset;
	//构造一个构造函数,申请此类时,将需要增强的request对象传入,同时指定解码方式
	public MyRequest(HttpServletRequest request, String charset) {
		super(request);
		// TODO Auto-generated constructor stub
		this.request = request;
		this.charset = charset;
	}

	/* (non-Javadoc)
	 * @see javax.servlet.ServletRequestWrapper#getParameter(java.lang.String)
	 */
	@Override
	public String getParameter(String name) {
		// TODO Auto-generated method stub
		String value = this.request.getParameter(name);
		if(value ==null){
			return null;
		}
		if(!request.getMethod().equalsIgnoreCase("get")){  //对get方法提交过来的数据进行特殊处理
			return value;
		}
		
		try {
			value= new String(value.getBytes("ISO8859-1"), this.charset);
			System.out.println(value);
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		return value;
	}
}
过滤 器配置

<filter>
		<filter-name>EncodingFilter</filter-name>
		<filter-class>cn.itcast.filters.EncodingFilter</filter-class>
		<init-param>
			<param-name>charset</param-name>
			<param-value>UTF-8</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>EncodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
		<dispatcher>REQUEST</dispatcher>
		<dispatcher>FORWARD</dispatcher>
	</filter-mapping>

过滤器

public class EncodingFilter implements Filter{
	private FilterConfig config;
	private String defaultCharset = "UTF-8";
	
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		String charset = null;
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse)resp;
		
		charset = config.getInitParameter("charset");
		System.out.println(charset);
		if(charset == null || charset.equals("")){
			charset = defaultCharset;
		}
		
		MyRequest myReq = new MyRequest(request, charset);  //申请一个增强后的request对象
		myReq.setCharacterEncoding(charset);
		response.setCharacterEncoding(charset);
		response.setContentType("text/html;charset="+charset);
		
		chain.doFilter(myReq, response); //放行后,servlet获取的到request对象将是MyRequest对象,调用其getParamter是被增强后的
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
		// TODO Auto-generated method stub
		this.config = config;
	}

}
测试 jsp页面

表单数据一般都是以post方法提交,而对于超链接,都是以Get方法提交,get方法提交,对中文需要先进行URL编码后,在提交。

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://java.sun.com/jstl/core_rt" prefix="c" %>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>My JSP 'charsetTest.jsp' starting page</title>

  </head>
  
  <body>
    <c:url value="/servlet/CharsetTestServlet" scope="page" var="CharsetTestServlet">
    	<c:param name="username" value="中国"></c:param>
    </c:url>
    <a href="${CharsetTestServlet }">点击</a>
    <form action="${pageContext.request.contextPath }/servlet/CharsetTestServlet" method="post">
    	用户名<input type="text" name="username" /><br>
    	<input type="submit" value="提交" />
    </form>
  </body>
</html>
测试servlet

public class CharsetTestServlet extends HttpServlet {

	
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		System.out.println(request.getParameter("username"));
	}

	
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		System.out.println(request.getParameter("username"));
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值