您的位置:首页 > 编程语言 > Java开发

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请求方式下的乱码问题。

//真正解决全站乱码问题的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>


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息