过滤全网乱码

filter类里写代码

包装类思想


 1 package cn.itcast.filter;
2
3 import java.io.IOException;
4 import java.io.UnsupportedEncodingException;
5
6 import javax.servlet.Filter;
7 import javax.servlet.FilterChain;
8 import javax.servlet.FilterConfig;
9 import javax.servlet.ServletException;
10 import javax.servlet.ServletRequest;
11 import javax.servlet.ServletResponse;
12 import javax.servlet.http.HttpServletRequest;
13 import javax.servlet.http.HttpServletRequestWrapper;
14 import javax.servlet.http.HttpServletResponse;
15
16 public class AllCharacterEncodingFilter implements Filter {
17 private FilterConfig filterConfig;
18
19 public void init(FilterConfig filterConfig) throws ServletException {
20 this.filterConfig = filterConfig;
21 }
22 public void doFilter(ServletRequest req, ServletResponse resp,
23 FilterChain chain) throws IOException, ServletException {
24 HttpServletRequest request = (HttpServletRequest)req;
25 HttpServletResponse response = (HttpServletResponse)resp;
26 //获取配置的过滤器参数encoding的值:如果没有,给定一个默认值
27 String encoding = filterConfig.getInitParameter("encoding");
28 if(encoding==null)
29 encoding = "UTF-8";
30 //设置POST请求方式的中文请求参数的编码
31 request.setCharacterEncoding(encoding);
32 //设置响应输出时的编码:字符流和字节流
33 response.setCharacterEncoding(encoding);//字节流输出时通知客户端的解码码表
34 response.setContentType("text/html;charset="+encoding);//字节流输出时通知客户端的解码码表;字符流:字符流输出时使用的码表及通知客户端解码用的码表
35
36 MyHttpServletRequest mrequest = new MyHttpServletRequest(request);
37 //放行
38 chain.doFilter(mrequest, response);
39 }
40
41
42 public void destroy() {
43
44 }
45 }
46
47 //HttpServletRequestWrapper内部的代码与连接池原理中那个默认适配器一样
48 class MyHttpServletRequest extends HttpServletRequestWrapper{
49 public MyHttpServletRequest(HttpServletRequest request){
50 super(request);
51 }
52 //只对get请求方式进行改写
53 public String getParameter(String name) {
54 String value = super.getParameter(name);
55 if(value==null)
56 return value;
57 //得到请求方式
58 String method = super.getMethod();
59 if("get".equalsIgnoreCase(method)){
60 try {
61 value = new String(value.getBytes("ISO-8859-1"),super.getCharacterEncoding());
62 } catch (UnsupportedEncodingException e) {
63 e.printStackTrace();
64 }
65 }
66 return value;
67 }
68
69 }
70 class MyHttpServletRequest1 extends HttpServletRequestWrapper{
71 private HttpServletRequest request;
72 public MyHttpServletRequest1(HttpServletRequest request){
73 super(request);
74 this.request = request;
75 }
76 //只对get请求方式进行改写
77 public String getParameter(String name) {
78 String value = request.getParameter(name);
79 if(value==null)
80 return value;
81 //得到请求方式
82 String method = request.getMethod();
83 if("get".equalsIgnoreCase(method)){
84 try {
85 value = new String(value.getBytes("ISO-8859-1"),"UTF-8");
86 } catch (UnsupportedEncodingException e) {
87 e.printStackTrace();
88 }
89 }
90 return value;
91 }
92
93 }

动态代理类思想


 1 package cn.itcast.web.bbs.mvc.filter;
2
3 import java.io.IOException;
4 import java.lang.reflect.InvocationHandler;
5 import java.lang.reflect.Method;
6 import java.lang.reflect.Proxy;
7
8 import javax.servlet.Filter;
9 import javax.servlet.FilterChain;
10 import javax.servlet.FilterConfig;
11 import javax.servlet.ServletException;
12 import javax.servlet.ServletRequest;
13 import javax.servlet.ServletResponse;
14 import javax.servlet.annotation.WebFilter;
15 import javax.servlet.http.HttpServletRequest;
16 import javax.servlet.http.HttpServletResponse;
17
18 public class EncodingFilter implements Filter {
19
20 public EncodingFilter() {
21 }
22
23 public void destroy() {
24 }
25
26 /**
27 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
28 */
29 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
30
31 HttpServletRequest req=(HttpServletRequest) request;
32 HttpServletResponse res=(HttpServletResponse) response;
33 RequestProxy requestProxy=new RequestProxy(req);
34 HttpServletRequest xx=requestProxy.getRequestProxy();
35 chain.doFilter(xx, response);
36 }
37
38 public void init(FilterConfig fConfig) throws ServletException {
39 }
40 }
41 class RequestProxy
42 {
43 private HttpServletRequest request;
44 public RequestProxy(HttpServletRequest request) {
45 super();
46 this.request = request;
47 }
48 //产生动态代理对象
49 public HttpServletRequest getRequestProxy()
50 {
51 return (HttpServletRequest) Proxy.newProxyInstance(RequestProxy.class
52 .getClassLoader(), request.getClass().getInterfaces(),
53 new InvocationHandler() {
54 @Override
55 public Object invoke(Object proxy, Method method,
56 Object[] args) throws Throwable {
57 Object returnValue="";
58 String methodName=method.getName();
59 if(methodName.equals("getParameter"))
60 {
61 String methodType=request.getMethod();
62 if("GET".equalsIgnoreCase((methodType)))
63 {//乱码
64 String temp = (String) method.invoke(request,args);
65 //还原
66 byte[] buf = temp.getBytes("ISO8859-1");
67 //正码
68 returnValue = new String(buf,"UTF-8");
69 }
70 else if("POST".equalsIgnoreCase(methodType))
71 {
72 request.setCharacterEncoding("UTF-8");
73 returnValue = method.invoke(request,args);
74 }
75 }
76 else
77 {
78 returnValue=method.invoke(request, args);
79 }
80 return returnValue;
81 }
82 });
83 }
84
85 }

时间: 2024-10-22 19:58:42

过滤全网乱码的相关文章

扯淡过滤器之乱码篇

在JavaWeb开发中,Servlet过滤器可以很方便地帮助开发者做很多重复的事情,比如说这里要和大家分享的乱码问题.其实说起乱码自己也没有什么经验可谈,只是东拼西凑来出来的一些代码,这里说过滤器是一方面,另一方面还有其中用到的一些思想上的东西. 乱码产生的原因说来说去就一句话,编码和解码用的码表不同造成.但是要弄清楚这其中的原理,怕是自己也不清楚,只好扬长避短.Web开发中的乱码就发生在服务器和浏览器之间,这样根据乱码的作用者可以分为请求参数乱码和响应内容乱码,响应乱码容易解决,只要respo

如何自学 Java 开发

如何自学 Java 开发? 568赞同反对,不会显示你的姓名 李艾米IT路上学习 568 人赞同 Java Web前端技术 HTML 入门视频课程 1 HTML 简介 2 HTML基本结构[ 3 HTML的BODY标签以及颜色的设定 4 HTML之br标签 5 HTML之p标签 6 HTML之pre标签. 7 HTML之center 8 HTML之引文标签 9 HTML之hr 10 HTML之address 11 HTML之meta 标签 12 HTML之特殊字符 13 HTML之注释 14 H

SSM整合(spring、springMVC、mybatis)

需要用的包: 包括:spring的包.springMVC的包.mybatis的包.数据库驱动包.json相关的包 配置如下,首先是mybatis的配置 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/myba

spring mvc + mybatis 整合框架

首先放几个该放的包(注意:后面两个mybatis-spring-1.1.1.jar mybatis-3.1.1.jar是因为不导入这两个包sql就不会在控制台打印,感觉调试的时候有点不方便,不需要的话就没什么) 下面还有几个包是用来使用json的,就可以直接返回字符串在网页上,如果不导入直接访问方法的话,会返回一个字符串名的jsp 文件目录如下: 接下来就是几个配置文件 applicationContext-dao.xml <beans xmlns="http://www.springfr

JSP-Servlet实现网上BBS项目小案例

项目功能:实现一般bbs论坛项目的功能,发表说说 其他好友可以评论 一.数据库的创建: sql语句如下: create table `bbs`.`user`( `userid` INT not null auto_increment, `username` CHAR(20) not null, `userpassword` CHAR(20) not null, primary key (`userid`) ); create unique index `PRIMARY` on `bbs`.`us

springboot整合mybatis+oracle

第一步 认识springboot :springboot是为了解决配置文件多,各个组件不统一的问题,它省去了很多配置文件,同时实现了spring产品的整合. 创建springboot项目:通过选择springinit初始化springboot,我们发现它的pom.xml拥有绝大部分的spring所需要的包. 第二步 打开项目的结构,发现有了有趣的部分 在原有的java结构上,公司名称下多了一级叫做自己的项目名的一个目录,这个目录下才是相应的Controlller等层,而且在此目录下面有了一个文件

[转]Filter实现处理中文乱码,转义html标签,过滤敏感词

原文地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的

Asp 使用 Microsoft.XMLHTTP 抓取网页内容(没用乱码),并过滤需要的内容

Asp 使用 Microsoft.XMLHTTP 抓取网页内容,并过滤需要的内容 Asp 使用 Microsoft.XMLHTTP 抓取网页内容无乱码处理,并过滤需要的内容 示例源码: <% Dim xmlUrl,http,strHTML,strBody xmlUrl = Request.QueryString("u") REM 异步读取XML源 Set http = server.CreateObject("Microsoft.XMLHTTP") http.

java web过滤器实际应用(解决中文乱码 html标签转义功能 敏感字符过滤功能)

转载地址:http://www.cnblogs.com/xdp-gacl/p/3952405.html 在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求. 一.Decorator设计模式 1.1.Decorator设计模式介绍 当某个对象的方法不适应业务需求时,通常有2种方式可以对方法进行增强: 编写子类,覆盖需增强的