Filter 先拦截request, doFilter放行, response响应回来, Filter再次拦截 ,执行doFilter()后面的代码
执行过程:
发出request请求,服务器封装request对象,filter拦截request对象,在filter里面可以拿到前台传递过来的数据,使用装饰着模式,编写MyRequest类继承 HttpServletRequestWrapper.在MyRequest重写getParmater()方法--后台正式通过该方法拿request的数据。new 一个MyRequest对象传递给后台。
其实后台最终 通过MyRequest对象 调用它getParmater,拿到的是已经修改过的数据
在doFilter放行,封装一个假的response,也就是放行的是MyResponse对象,该对象里面重写writer方法,writer方法返回 printwriter(缓冲区) ,也就是返回一个打印流对象,并且指定向哪个缓冲区存放数据。
最终后台,把数据放到了MyResponse对象中早就定义好的缓冲区中。在Filter里面,拿到缓冲区的内容,进行编辑,把编辑后的内容 再通过正真的 ().writer()写到页面去。
public class ResponseWrapper extends HttpServletResponseWrapper {
private PrintWriter cachedWriter;//定义打印流,servlet里拿到后,数据通过它存到缓冲区
private CharArrayWriter bufferedWriter;//缓冲区,用来存放后台数据
public ResponseWrapper(HttpServletResponse response) {
super(response);
bufferedWriter = new CharArrayWriter();
cachedWriter = new PrintWriter(bufferedWriter);
}
@Override
public PrintWriter getWriter() throws IOException {
return cachedWriter;
}
public String getResult() {
byte[] bytes = ().getBytes();
try {
return new String(bytes, "UTF-8");
} catch (UnsupportedEncodingException e) {
return "";
}
}
}
################################################################
#
#################################################################
通过过滤器拦截Response对象,然后就可以对输出流进行操作了。
复制代码
public class ResponseFilter implements Filter {
@Override
public void init( filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//设置假response 里面有缓冲区,假的writer
ResponseWrapper wrapper = new ResponseWrapper((HttpServletResponse) response);
(request, wrapper);//分界线,request拦截执行从这往前的代码,resposne拦截执行该行之后的代码
//后台已经把数据封装到缓冲区中,这里是取出来
String result = ();
//后台数据编辑后,通过真正的response写到前台页面去
().write(());
}
@Override
public void destroy() {
}
}
复制代码
相关文章
- Spring/SpringBoot 过滤器修改、获取http 请求request中的参数 和 response返回值,比如修改请求体和响应体的字符编码
- filter拦截修改response
- java使用Filter过滤器对Response返回值进行修改
- mybatis自定义拦截器实现统一过滤动态修改sql
- Spring MVC 拦截器(Interceptor)与过滤器(Filter)的区别?-两者应用场景
- 解决Xposed框架拦截修改手机型号失败问题
- 转:java使用Filter过滤器对Response返回值进行修改
- SpringBoot------拦截器Filter的使用
- Filter—过滤器和拦截器的区别
- 过滤器 Filter vs 拦截器 Interceptor