8Filter高级开发1--解决post和get乱码的问题
2012-10-18 17:51
363 查看
一、
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对象,完全解决get、post请求方式下的乱码问题。
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对象,完全解决get、post请求方式下的乱码问题。
//真正解决全站乱码问题的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>
相关文章推荐
- springmvc解决乱码问题(get和post)
- Get,Post请求中文乱码 4000 问题有效解决方法
- 完美解决Get和Post请求中文乱码的问题
- get/post时中文乱码问题的解决办法
- Java后台发送Post和get请求 (并解决返回值乱码问题)
- Post与Get提交使用过滤器解决中文乱码问题
- 解决全站字符乱码(POST和GET中文编码问题)
- httpurlconnection post 和GET 分别传递2个参数给后台,返回JSON 解决乱码问题
- 解决全站字符乱码(POST和GET中文编码问题)
- 如何解决POST请求中文乱码问题,GET的又如何处理呢?
- GET与POST的乱码问题解决
- http get/post解决乱码问题
- 解决servlet中输出中文到浏览器以及post、get两种提交方法乱码问题
- 解决全站字符乱码(POST和GET中文编码问题)
- Get,Post请求中文乱码问题有效解决方法
- Get、Post请求中文乱码问题有效解决方法
- jsp filter过滤器 解决post 以及get乱码问题
- 全站编码 解决Get、Post乱码问题(Servlet)
- 解决问题:在使用springmvc的web.xml配置乱码拦截器之后接收的get或者post请求中文还是乱码