`

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

 
阅读更多

全站乱码案例:

     * 利用Servlet的doGet()和doPost()方法中,可以解决中文乱码:

  1.      * doGet()  
  2.        String value = request.getParameter("");  
  3. value = new String(value.getBytes("ISO8859-1"),"utf-8");  
  4.   
  5. response.setContentType("text/html;charset=utf-8");  
  6.      * doPost()  
  7.        request.setCharacterEncoding("utf-8");  
  8. response.setContentType("text/html;charset=utf-8");  
       * doGet()
         String value = request.getParameter("");
	 value = new String(value.getBytes("ISO8859-1"),"utf-8");

	 response.setContentType("text/html;charset=utf-8");
       * doPost()
         request.setCharacterEncoding("utf-8");
	 response.setContentType("text/html;charset=utf-8");


     * 以上问题:
       * 实际开发时,Web应用程序的逻辑比较复杂(多个Servlet).
       * 上述的解决方案,仅能解决当前Servlet的中文乱码问题.

       * 如果使用上述方案,解决中文乱码问题:代码重复性太多.

EncodingFilter:

 

  1. package app.java.filter.demo1;  
  2.   
  3. import java.io.IOException;  
  4.   
  5. import javax.servlet.Filter;  
  6. import javax.servlet.FilterChain;  
  7. import javax.servlet.FilterConfig;  
  8. import javax.servlet.ServletException;  
  9. import javax.servlet.ServletRequest;  
  10. import javax.servlet.ServletResponse;  
  11. import javax.servlet.http.HttpServletRequest;  
  12. import javax.servlet.http.HttpServletResponse;  
  13.   
  14. /** 
  15.  * 当前Filter用于解决全站中文乱码问题. 
  16.  * @author JYL 
  17.  */  
  18. public class EncodingFilter implements Filter {  
  19.   
  20.     public void destroy() {  
  21.           
  22.     }  
  23.   
  24.     public void doFilter(ServletRequest req, ServletResponse resp,  
  25.             FilterChain chain) throws IOException, ServletException {  
  26.           
  27.         //1 进行Request与Response对象的类型强转  
  28.         HttpServletRequest request = (HttpServletRequest)req;  
  29.         HttpServletResponse response = (HttpServletResponse)resp;  
  30.           
  31.         //2 解决中文乱码问题:1)请求的中文乱码(GET\POST);2)响应的中文乱码.  
  32.         request.setCharacterEncoding("utf-8");  
  33.         response.setContentType("text/html;charset=utf-8");  
  34.           
  35.         //3 创建自定义的Request对象  
  36.         MyRequest myRequest = new MyRequest(request);  
  37.           
  38.         //3 放行  
  39.         chain.doFilter(myRequest, response);  
  40.     }  
  41.   
  42.     public void init(FilterConfig arg0) throws ServletException {  
  43.     }  
  44.   
  45. }  
package app.java.filter.demo1;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 当前Filter用于解决全站中文乱码问题.
 * @author JYL
 */
public class EncodingFilter implements Filter {

	public void destroy() {
		
	}

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		
		//1 进行Request与Response对象的类型强转
		HttpServletRequest request = (HttpServletRequest)req;
		HttpServletResponse response = (HttpServletResponse)resp;
		
		//2 解决中文乱码问题:1)请求的中文乱码(GET\POST);2)响应的中文乱码.
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		
		//3 创建自定义的Request对象
		MyRequest myRequest = new MyRequest(request);
		
		//3 放行
		chain.doFilter(myRequest, response);
	}

	public void init(FilterConfig arg0) throws ServletException {
	}

}

 

MyRequest:

 

  1. package app.java.filter.demo1;  
  2.   
  3. import java.io.UnsupportedEncodingException;  
  4.   
  5. import javax.servlet.http.HttpServletRequest;  
  6. import javax.servlet.http.HttpServletRequestWrapper;  
  7. /** 
  8.  * 自定义的Request对象 
  9.  * @author JYL 
  10.  */  
  11. public class MyRequest extends HttpServletRequestWrapper {  
  12.   
  13.     public MyRequest(HttpServletRequest request) {  
  14.         super(request);  
  15.     }  
  16.       
  17.     @Override  
  18.     public String getParameter(String name) {  
  19.         String value = super.getParameter(name);  
  20.         if(super.getMethod().equalsIgnoreCase("GET")){  
  21.             try {  
  22.                 value = new String(value.getBytes("ISO-8859-1"),"utf-8");  
  23.             } catch (UnsupportedEncodingException e) {  
  24.                 e.printStackTrace();  
  25.             }  
  26.         }  
  27.         return value;  
  28.     }  
  29.   
  30. }  
package app.java.filter.demo1;

import java.io.UnsupportedEncodingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
/**
 * 自定义的Request对象
 * @author JYL
 */
public class MyRequest extends HttpServletRequestWrapper {

	public MyRequest(HttpServletRequest request) {
		super(request);
	}
	
	@Override
	public String getParameter(String name) {
		String value = super.getParameter(name);
		if(super.getMethod().equalsIgnoreCase("GET")){
			try {
				value = new String(value.getBytes("ISO-8859-1"),"utf-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
		}
		return value;
	}

}

 

TestServlet:

 

  1. package app.java.filter.demo1;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5.   
  6. import javax.servlet.ServletException;  
  7. import javax.servlet.http.HttpServlet;  
  8. import javax.servlet.http.HttpServletRequest;  
  9. import javax.servlet.http.HttpServletResponse;  
  10.   
  11. public class TestServlet extends HttpServlet {  
  12.   
  13.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  14.             throws ServletException, IOException {  
  15.   
  16.         String username = request.getParameter("username");  
  17.         String password = request.getParameter("password");  
  18.           
  19.         System.out.println(username+" : "+password);  
  20.           
  21.         response.getWriter().println("中文解决了,真好!!!!");  
  22.     }  
  23.   
  24.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  25.             throws ServletException, IOException {  
  26.   
  27.         String username = request.getParameter("username");  
  28.         String password = request.getParameter("password");  
  29.           
  30.         System.out.println(username+" : "+password);  
  31.           
  32.         response.getWriter().println("中文解决了,真好!!!!");  
  33.     }  
  34.   
  35. }  
package app.java.filter.demo1;

import java.io.IOException;
import java.io.PrintWriter;

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

public class TestServlet extends HttpServlet {

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

		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		System.out.println(username+" : "+password);
		
		response.getWriter().println("中文解决了,真好!!!!");
	}

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

		String username = request.getParameter("username");
		String password = request.getParameter("password");
		
		System.out.println(username+" : "+password);
		
		response.getWriter().println("中文解决了,真好!!!!");
	}

}

 

xml:

 

  1. <filter>  
  2.     <filter-name>EncodingFilter</filter-name>  
  3.     <filter-class>demo1.EncodingFilter</filter-class>  
  4.   </filter>  
  5.   <filter-mapping>  
  6.     <filter-name>EncodingFilter</filter-name>  
  7.     <url-pattern>/*</url-pattern>  
  8.   </filter-mapping>  
<filter>
  	<filter-name>EncodingFilter</filter-name>
  	<filter-class>demo1.EncodingFilter</filter-class>
  </filter>
  <filter-mapping>
  	<filter-name>EncodingFilter</filter-name>
  	<url-pattern>/*</url-pattern>
  </filter-mapping>

jsp:

 

 

  1. <form action="test" method="post">  
  2.         用户名:<input type="text" name="username"><br>  
  3.         密码:<input type="password" name="password"><br>  
  4.         <input type="submit" value="提交">  
  5.     </form>  
  6.     <a href="test?username=张无忌&password=123">GET方式发送的请求</a>  
<form action="test" method="post">
    	用户名:<input type="text" name="username"><br>
    	密码:<input type="password" name="password"><br>
    	<input type="submit" value="提交">
    </form>
    <a href="test?username=张无忌&password=123">GET方式发送的请求</a>

 

 

另一种:

 

  1. package com.itheima.filter;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.UnsupportedEncodingException;  
  5. import java.util.Map;  
  6.   
  7. import javax.servlet.Filter;  
  8. import javax.servlet.FilterChain;  
  9. import javax.servlet.FilterConfig;  
  10. import javax.servlet.ServletException;  
  11. import javax.servlet.ServletRequest;  
  12. import javax.servlet.ServletResponse;  
  13. import javax.servlet.http.HttpServletRequest;  
  14. import javax.servlet.http.HttpServletRequestWrapper;  
  15.   
  16. public class MyFilter implements Filter {  
  17.   
  18.     public void init(FilterConfig filterConfig) throws ServletException {  
  19.   
  20.     }  
  21.   
  22.     public void doFilter(ServletRequest request, ServletResponse response,  
  23.             FilterChain chain) throws IOException, ServletException {  
  24.         HttpServletRequest req = (HttpServletRequest) request;  
  25.         // 解决post方式  
  26.         // req.setCharacterEncoding("UTF-8");  
  27.         req = new MyRequest(req);  
  28.   
  29.         chain.doFilter(req, response);  
  30.     }  
  31.   
  32.     public void destroy() {  
  33.     }  
  34. }  
  35.   
  36. // 实现与被包装对象相同的接口  
  37. // 定义一个与被包装类相对象的引用  
  38. // 定义一个构造方法,把被包装对象传过来  
  39. // 对于不需要改写方法,直接调用  
  40. // 对于无需要改写方法,写自己的方法体  
  41. class MyRequest extends HttpServletRequestWrapper {  
  42.     HttpServletRequest request;  
  43.   
  44.     public MyRequest(HttpServletRequest request) {  
  45.         super(request);  
  46.         this.request = request;  
  47.     }  
  48.   
  49.     /* 
  50.      * @Override public String getParameter(String name) { name = 
  51.      * request.getParameter(name);//乱码 try { return new 
  52.      * String(name.getBytes("iso-8859-1"),"UTF-8"); } catch 
  53.      * (UnsupportedEncodingException e) { e.printStackTrace(); } return null; } 
  54.      */  
  55.   
  56.     @Override  
  57.     public String getParameter(String name) {  
  58.         Map<String, String[]> map = getParameterMap();  
  59.         return map.get(name)[0];  
  60.     }  
  61.   
  62.     @Override  
  63.     public String[] getParameterValues(String name) {  
  64.         Map<String, String[]> map = getParameterMap();  
  65.         return map.get(name);  
  66.     }  
  67.   
  68.     private boolean flag = true;  
  69.   
  70.     @Override  
  71.     public Map<String, String[]> getParameterMap() {  
  72.         Map<String, String[]> map = request.getParameterMap();// 乱码  
  73.         if (flag) {  
  74.             for (Map.Entry<String, String[]> m : map.entrySet()) {  
  75.                 String[] values = m.getValue();  
  76.                 for (int i = 0; i < values.length; i++) {  
  77.                     try {  
  78.                         values[i] = new String(  
  79.                                 values[i].getBytes("iso-8859-1"), "UTF-8");  
  80.                     } catch (UnsupportedEncodingException e) {  
  81.                         e.printStackTrace();  
  82.                     }  
  83.                 }  
  84.   
  85.             }  
  86.             flag = false;  
  87.         }  
  88.         return map;  
  89.   
  90.     }  
  91.   
  92. }  
package com.itheima.filter;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
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 MyFilter implements Filter {

	public void init(FilterConfig filterConfig) throws ServletException {

	}

	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		HttpServletRequest req = (HttpServletRequest) request;
		// 解决post方式
		// req.setCharacterEncoding("UTF-8");
		req = new MyRequest(req);

		chain.doFilter(req, response);
	}

	public void destroy() {
	}
}

// 实现与被包装对象相同的接口
// 定义一个与被包装类相对象的引用
// 定义一个构造方法,把被包装对象传过来
// 对于不需要改写方法,直接调用
// 对于无需要改写方法,写自己的方法体
class MyRequest extends HttpServletRequestWrapper {
	HttpServletRequest request;

	public MyRequest(HttpServletRequest request) {
		super(request);
		this.request = request;
	}

	/*
	 * @Override public String getParameter(String name) { name =
	 * request.getParameter(name);//乱码 try { return new
	 * String(name.getBytes("iso-8859-1"),"UTF-8"); } catch
	 * (UnsupportedEncodingException e) { e.printStackTrace(); } return null; }
	 */

	@Override
	public String getParameter(String name) {
		Map<String, String[]> map = getParameterMap();
		return map.get(name)[0];
	}

	@Override
	public String[] getParameterValues(String name) {
		Map<String, String[]> map = getParameterMap();
		return map.get(name);
	}

	private boolean flag = true;

	@Override
	public Map<String, String[]> getParameterMap() {
		Map<String, String[]> map = request.getParameterMap();// 乱码
		if (flag) {
			for (Map.Entry<String, String[]> m : map.entrySet()) {
				String[] values = m.getValue();
				for (int i = 0; i < values.length; i++) {
					try {
						values[i] = new String(
								values[i].getBytes("iso-8859-1"), "UTF-8");
					} catch (UnsupportedEncodingException e) {
						e.printStackTrace();
					}
				}

			}
			flag = false;
		}
		return map;

	}

}

 

转载:https://blog.csdn.net/CSDN_GIA/article/details/54094426

分享到:
评论

相关推荐

    JavaWeb中过滤器的三个小案例

    Javaweb中过滤器的三个小案例:案例1:分IP统计网站的访问次数;案例2 粗粒度权限控制(根据用户名登陆);案例4、解决全站字符乱码(POST和GET中文乱码问题)

    科汛(KesionCMS) 9.5.140102 UTF8.rar

    科汛(KesionCMS)产品由我司独立开发的一套万能建站产品,是CMS行业最流行的网站建设解决方案之一。软件制作权登记号为:2012SR058633。系统包括文章、图片、下载、问答、会员、论坛、微博、黄页、产品库、企业空间...

    永久网络电台 1.1 UTF-8全功能版.rar

    1.1版 修正1.0谷歌浏览器无法播放问题,全面支持IE浏览器,火狐浏览器,谷歌浏览器,遨游3 等主流浏览器 1.1版 优化了整体代码,修正了1.0版本多处Bug,缩小了体积 1.1版 程序加载速度加快,优化了代码更有利搜索引擎...

    关关采集器亲测可用,下载不亏

    2.生成全站静态 在生成静态HTML可见 把原来的动态首页地址改下名称,就是叫他的首页不要默认那个伪静态的,然后用物理路径指向默认首页,生成新首页就可以了。 带参数的是高级功能,可以调用{Page}替换参数,可以...

    文章管理系统

    11.解决后台编辑器之前空2格低于一个汉字的问题 12.完善几个细节问题 13.整合20121103~20121220补丁 2012年12月20日 ★更新方式:admin文件夹改成你后台目录名,然后补丁包里的所有文件覆盖进去。 1.富媒体...

    php商城系统 v3.0 rc6.rar

    废弃 原编辑器改为使用kindeditor(代码过滤稍比原编辑器弱) 废弃 自定义后台菜单功能 废弃 管理员后台登陆路径须手动调整 废弃 原商品规格处理模式,启用新模式 (若已有用户使用商品规格须手动处理) 废弃 原商品...

    动易6.8完整功能PowerEasy_SiteWeaver_ALL6.8_86995872

    ●作者列表页,取某个频道下作者列表不显示全站作者该频道下发表的文章的bug; ●在频道首页生成静态页面后,{$ShowPath}解析后,频道的链接没加样式的bug; ●系统自动添加{$InstallDir}出现地址解析错误的bug ...

    PHPvod视频点播系统 2.5 for php5.3.x gbk.rar

    真正做到一处登录,全站通行。 采集插件允许自定义采集规则,轻松实现网络资源的采集获取。并支持断点采集、同名影片自动追加播放组、自动下载海报、一键更新连载影片、html标签过滤、批量替换未知栏目与地区等...

    搜索引擎代码

    布隆过滤器的初始大小可以后台设置,避免某些站长想单次采集1万个以上页面导致以的问题;数据整理功能增加:转换日文片假名的功能;清空搜索日志的功能。 2010.07.30升级(0.9版本) 0.9版升级的主要内容如下: ...

    仿世纪佳缘婚介交友系统5.3 ASP+SQL

    (1)、更新系统统计,主要是系统表Ns_Setup表统计数据,比如全站所有用户数、日记数等。让其更准确一些,可以通过个入口进行更新统计。 (2)、更新缓存数据,上面有提到过更新缓存,这里有专门的入口更新缓存...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例112 解决用substr()函数对中文字符串截取时出现乱码的问题 143 实例113 字符串与HTML标记相互转换 144 实例114 运用PHP 5.0新型字符串输出XML数据 145 实例115 判断字符串中是否存在指定子串 146 2.9 正则表达式...

    追梦企业网站管理系统最新官方版

    追梦企业网站管理系统(zmcms)是 由追梦工作室基于asp+access/mssql 自主研发而成。...1.修复后台修改数据库 出现乱码的问题 2.修复后台某文字出错的问题 3.修复一些小小的错误 4.前台table 样式更换

Global site tag (gtag.js) - Google Analytics