8Filter高级开发1--解决post和get乱码的问题

一、

1.由于开发人员在filter中可以得到代表用户请求和响应的request、response对象,因此在编程中可以使用Decorator(装饰器)模式对request、response对象进行包装,再把包装对象传给目标资源,从而实现一些特殊需求。

2.在java中增强一个类的功能有三种方式:继承、包装类、动态代理

二、.Decorator设计模式
Decorator设计模式的实现
1.首先看需要被增强对象继承了什么接口或父类,编写一个类也去继承这些接口或父类。
2.在类中定义一个变量,变量类型即需增强对象的类型。
3.在类中定义一个构造函数,接收需增强的对象。
4.覆盖需增强的方法,编写增强的代码。
举例:使用Decorator设计模式为BufferedReader类的readLine方法添加行号的功能。


三、request对象的增强

Servlet API 中提供了一个request对象的Decorator设计模式的默认实现类HttpServletRequestWrapper , (HttpServletRequestWrapper 类实现了request 接口中的所有方法,但这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法)以避免用户在对request对象进行增强时需要实现request接口中的所有方法。


四、使用Decorator模式包装request对象,完全解决getpost请求方式下的乱码问题。

//真正解决全站乱码问题的filter   敏感词汇过滤器
public class CharacterEncodingFilter2 implements Filter {

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

	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {
		
		HttpServletResponse response = (HttpServletResponse) resp;
		HttpServletRequest request = (HttpServletRequest) req;
		
		//post
		request.setCharacterEncoding("UTF-8");
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		//get
		/*
		 * 1.写一个子类
		 * 2.写一个包装类
		 * 3.用动态代理
		 * 
		 */
		MyRequest my  = new MyRequest(request);
		chain.doFilter(my, response);  //servlet    myrequest.getParameter("username");--->&^^
	}
	
	/*
	 * 1.编写一个类,实现与被增强对象相同的接口
	 * 2.在类中定义一个变量,记住被增强对象
	 * 3.在类中定义一个构造方法,接收被增强对象
	 * 4.覆写想增强的方法
	 * 5.对于不想增强的方法,直接调用被增强对象(目标对象)的方法
	 */
	class MyRequest extends HttpServletRequestWrapper{  //request

		private HttpServletRequest request;
		public MyRequest(HttpServletRequest request) {
			super(request);
			this.request = request;
		}
		@Override
		public String getParameter(String name) {  //name = username
			
			//1.先判断客户请求方式是什么
			if(request.getMethod().equalsIgnoreCase("post")){
				return this.request.getParameter(name);  //username
			}
			
			//2.客户机的请求方式必定为get
			String value = this.request.getParameter(name);  //
			if(value==null){
				return null;
			}
			
			try {
				value = new String(value.getBytes("iso8859-1"),"UTF-8");
			} catch (UnsupportedEncodingException e) {
				throw new RuntimeException(e);
			}
			
			return value;
		}
	}
	
	
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub

	}
}


 

<filter>
  <filter-name>CharacterEncodingFilter2</filter-name> 
  <filter-class>cn.itcast.web.filter.example.CharacterEncodingFilter2</filter-class> 
</filter>
<filter-mapping>
  <filter-name>CharacterEncodingFilter2</filter-name> 
  <url-pattern>/*</url-pattern> 
</filter-mapping>


 























评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值