关闭

黑马day14 过滤器之解决所有乱码

标签: 过滤器
664人阅读 评论(0) 收藏 举报
分类:

关于乱码的产生以及如何解决乱码请看我的博客字节乱码字符乱码,表单提交get&post乱码

这里主要使用一个过滤器可以解决上述的所有乱码:

1.过滤乱码的过滤器:

package cn.itheima.filter;
import java.io.IOException;
import java.util.Map;
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;

public class EncodingFilter implements Filter {
	private FilterConfig config = null;
	private String encode = null;
	public void destroy() {
		
	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		response.setContentType("text/html;charset="+encode); //--解决响应乱码
		chain.doFilter(new MyHttpServletRequest((HttpServletRequest) request), response);//--包装改造request中和获取请求参数相关的方法解决请求参数乱码
	}
	
	public void init(FilterConfig filterConfig) throws ServletException {
		this.config = filterConfig;
		encode = config.getInitParameter("encode") == null
							?"utf-8"
									:config.getInitParameter("encode");
	}
	class MyHttpServletRequest extends HttpServletRequestWrapper{
		private HttpServletRequest request = null;
		private boolean isNotEncode = true;
		public MyHttpServletRequest(HttpServletRequest request) {
			super(request);
			this.request = request;
		}
		
		@Override
		public Map getParameterMap() {
			try{
				if(request.getMethod().equalsIgnoreCase("POST")){//--如果是post提交,一行代码解决post提交请求参数乱码
					request.setCharacterEncoding(encode);
					return request.getParameterMap();
				}else if(request.getMethod().equalsIgnoreCase("GET")){//--如果是get提交,则应该手动编解码解决乱码
					Map<String,String[]> map = request.getParameterMap();//获取有乱码的map
					if(isNotEncode){//只能在第一次解决乱码
						for(Map.Entry<String, String[]> entry : map.entrySet()){//遍历map,解决所有值的乱码
							String [] vs = entry.getValue();
							for(int i=0;i<vs.length;i++){
								vs[i] = new String(vs[i].getBytes("iso8859-1"),encode);
							}
						}
						isNotEncode = false;//设置为false,第二次就不会再进这个代码块了
					}
					return map;
				}else{
					return request.getParameterMap();
				}
			}catch (Exception e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		}
		
		@Override
		public String[] getParameterValues(String name) {
			return (String[]) getParameterMap().get(name);
		}
		
		@Override
		public String getParameter(String name) {
			return getParameterValues(name) == null ? null : getParameterValues(name)[0];
		}
		
		
	}
}
2.web.xml的配置:

<filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>cn.itheima.filter.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>EncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>
3.jsp测试乱码:分别包括get和post提交

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <title></title>
	<meta http-equiv=" pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
  </head>
  <body>
  <h1>post提交</h1>
    <form action="${pageContext.request.contextPath }/servlet/FilterDemo1" method="post">
    	姓名:<input type="text"  name="name"/><br>
    	地址:<input type="text"  name="addr"/><br>
    	<input type="submit" value="提交"/><br>
    </form>
    <h1>get提交</h1>
    <form action="${pageContext.request.contextPath }/servlet/FilterDemo1" method="get">
    	姓名:<input type="text"  name="name"/><br>
    	地址:<input type="text"  name="addr"/><br>
    	<input type="submit" value="提交"/><br>
    </form>
  </body>
</html>
4.jsp提交后转向的页面:

package cn.itheima.servlet;

import java.io.IOException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class FilterDemo1 extends HttpServlet {

	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.getWriter().write("你好!过滤器!我没有乱码!");
		String name = request.getParameter("name");
		String addr = request.getParameter("addr");
		System.out.println(name);
		System.out.println(addr);
	}

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

}
结果分析:







0
0
查看评论

黑马day03 字节输出流的乱码原理分析

//编码和解码一致就不会造成乱码,浏览器默认的是当前系统的默认字符编码,因此解码的时候会查gbk 一.字节输出流乱码解决 1.字节输出流getOutputStream().write(); package com.itheima; import java.io.IOException; i...
  • u014010769
  • u014010769
  • 2015-06-17 11:22
  • 722

黑马总结 jsp乱码问题

     原本乱码问题,并不是能说是一个程序问题。可以说是一个运行环境的问题。想要确保程序在运行期间,不出现问题。有很多常用的方法。最为常用的方法就是使用filter的方法,十分简单且使用。但是,这样的方法有的时候却不能真正的确保在程序运行中不出现乱码问题。特...
  • tianzhw
  • tianzhw
  • 2011-03-22 19:41
  • 343

过滤器案例----解决全站中文乱码问题

全站乱码案例:      * 利用Servlet的doGet()和doPost()方法中,可以解决中文乱码: * doGet() String value = request.getParameter(""); v...
  • CSDN_GIA
  • CSDN_GIA
  • 2017-01-05 18:27
  • 1214

编写过滤器解决中文乱码

import java.io.IOException;  import javax.servlet.Filter;  import javax.servlet.FilterChain;  import ...
  • xiaocai9999
  • xiaocai9999
  • 2017-06-21 22:22
  • 324

过滤器之中文乱码解决

在我们做项目时,总会遇到一些乱码问题 ,为了解决中文乱码的问题 我们通常会在Servlet控制器中增加这么一句话 :request.setCharacterEncoding("utf-8"); 使得我们在加载项目的时候不至于会感到由于该死的外国人设计的程序语言 总有那么多弊端,会...
  • javaxiaochouyu
  • javaxiaochouyu
  • 2011-04-26 22:03
  • 9167

JSP用过滤器解决request中文乱码问题

(1)客户端的数据一般是通过HTTP  GET/POST方式提交给服务器,在服务器端用request.getParameter() 读取参数时,很容易出现中文乱码现象。 (2)用过滤器解决request中文乱码问题。 (3)代码如下: package my; import jav...
  • u010870518
  • u010870518
  • 2014-09-10 14:01
  • 2134

黑马day14 过滤器之自动登录小案例

自动登录分析: 如果是第一次登陆就把user放到session域中,同时建立一个cookie把用户名和密码保存到cookie中,然后写一个过滤器, 如果是未登录的状态就把cookie中把用户名和密码拿出来和数据库中查询的作比较,如果一致就把user设置到session域中。 1.登陆页面log...
  • u014010769
  • u014010769
  • 2015-07-07 18:40
  • 677

解决post提交乱码过滤器

CharacterEncodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 CharacterEncodingFilter /*
  • tanglei89
  • tanglei89
  • 2017-05-31 19:50
  • 286

get与post乱码过滤器

import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Map; import javax.servlet.Filter; import javax.servlet.Filt...
  • qq_30641447
  • qq_30641447
  • 2016-07-10 20:19
  • 508

过滤器和动态代理解决乱码

主要是解决get乱码问题
  • chuibuqideniub
  • chuibuqideniub
  • 2016-09-06 19:07
  • 395
    个人资料
    • 访问:208281次
    • 积分:4426
    • 等级:
    • 排名:第8032名
    • 原创:242篇
    • 转载:4篇
    • 译文:0篇
    • 评论:39条
    友情链接