使用filter拦截servlet和jsp页面的内容,进行过滤后输出
2012-09-17 08:54
901 查看
思路:使用filter拦截servlet或者jsp页面内容,比如内容替换,再向用户展现修改后的页面
使用普通的filter拦截页面内容,会出现这种情况
从入中可以看出,输出内容并没有通过过滤器就输出了。
![](http://img.my.csdn.net/uploads/201209/17/1347841489_2062.gif)
从入中可以看出,输出内容并没有通过过滤器就输出了。
既然使用普通filter不能达到目的,那么就换一种方法,在Servlet或者jsp接收到response之前,将response使用一个“假的response”替换,让servlet或者jsp的内容输出到这个“假的response”中,然后再对输出内容进行处理,最后再将整个通过真的response输出给客户端
图示如下:
![](http://img.my.csdn.net/uploads/201209/17/1347843340_9591.gif)
实现上图的步骤:
1.创建一个filter--用来使用"假的response"替换掉实际的response
2.创建一个“假的response"--继承HttpServletResponseWrapper类即可
3.在filter进行替换内容和实际输出
主要类的代码如下:
filter:
假的resonse:
功能是将输出页面中的test替换为actual.
经过测试发现,如果向“假的response”添加cookie,是可以将cookie正常放到客户端的。这可能也是为什么创建“假的response”需要原response的一个引用的原因之一吧。
modify 2012-09-20
经过实际使用,发现使用字符流作为PrintWriter的目的地会造成乱码的情况,鉴于反复编码比较困难,所以使用更简单的StringWriter作为输出目的地。
使用普通的filter拦截页面内容,会出现这种情况
从入中可以看出,输出内容并没有通过过滤器就输出了。
![](http://img.my.csdn.net/uploads/201209/17/1347841489_2062.gif)
从入中可以看出,输出内容并没有通过过滤器就输出了。
既然使用普通filter不能达到目的,那么就换一种方法,在Servlet或者jsp接收到response之前,将response使用一个“假的response”替换,让servlet或者jsp的内容输出到这个“假的response”中,然后再对输出内容进行处理,最后再将整个通过真的response输出给客户端
图示如下:
![](http://img.my.csdn.net/uploads/201209/17/1347843340_9591.gif)
实现上图的步骤:
1.创建一个filter--用来使用"假的response"替换掉实际的response
2.创建一个“假的response"--继承HttpServletResponseWrapper类即可
3.在filter进行替换内容和实际输出
主要类的代码如下:
filter:
public class ContentChangeFilter implements Filter{ public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain fc) throws IOException, ServletException { CoverResponse cr = new CoverResponse((HttpServletResponse)response); fc.doFilter(request, cr); //处理替换 String content = cr.getContent(); content = content.replace("test", "actual"); response.getWriter().print(content); } public void init(FilterConfig arg0) throws ServletException { } }
假的resonse:
public class CoverResponse extends HttpServletResponseWrapper{ private MyPrintWriter tmpWriter; private ByteArrayOutputStream output; public CoverResponse(HttpServletResponse response) { super(response); output = new ByteArrayOutputStream(); tmpWriter = new MyPrintWriter(output); } public void finalize() throws Throwable { super.finalize(); output.close(); tmpWriter.close(); } public String getContent() { try { tmpWriter.flush(); //刷新该流的缓冲,详看java.io.Writer.flush() String s = tmpWriter.getByteArrayOutputStream().toString("UTF-8"); //此处可根据需要进行对输出流以及Writer的重置操作 //比如tmpWriter.getByteArrayOutputStream().reset() return s; } catch (UnsupportedEncodingException e) { return "UnsupportedEncoding"; } } //覆盖getWriter()方法,使用我们自己定义的Writer public PrintWriter getWriter() throws IOException { return tmpWriter; } public void close() throws IOException { tmpWriter.close(); } //自定义PrintWriter,为的是把response流写到自己指定的输入流当中 //而非默认的ServletOutputStream private static class MyPrintWriter extends PrintWriter { ByteArrayOutputStream myOutput; //此即为存放response输入流的对象 public MyPrintWriter(ByteArrayOutputStream output) { super(output); myOutput = output; } public ByteArrayOutputStream getByteArrayOutputStream() { return myOutput; } } }
功能是将输出页面中的test替换为actual.
经过测试发现,如果向“假的response”添加cookie,是可以将cookie正常放到客户端的。这可能也是为什么创建“假的response”需要原response的一个引用的原因之一吧。
modify 2012-09-20
经过实际使用,发现使用字符流作为PrintWriter的目的地会造成乱码的情况,鉴于反复编码比较困难,所以使用更简单的StringWriter作为输出目的地。
package com.aspire.pams.tag.sichuan.tools; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class CoverResponse extends HttpServletResponseWrapper{ private PrintWriter tmpWriter; private StringWriter output; public CoverResponse(HttpServletResponse response) { super(response); output = new StringWriter(); tmpWriter = new PrintWriter(output); } public void finalize() throws Throwable { super.finalize(); output.close(); tmpWriter.close(); } public String getContent() { tmpWriter.flush(); //刷新该流的缓冲,详看java.io.Writer.flush() String s = output.toString(); //此处可根据需要进行对输出流以及Writer的重置操作 //比如tmpWriter.getByteArrayOutputStream().reset() return s; } //覆盖getWriter()方法,使用我们自己定义的Writer public PrintWriter getWriter() throws IOException { return tmpWriter; } public void close() throws IOException { tmpWriter.close(); } }
相关文章推荐
- asp.net 使用HttpModule对全站输出的动态页面的HTML内容进行修改,不会错乱
- asp.net 使用页适配器和重写Render对全站输出的页面的HTML内容进行修改,不会错乱
- SpringMVC——使用RequestDispatcher.include()和HttpServletResponseWrapper动态获取jsp输出内容
- 实现Struts2中对未登录的jsp页面进行拦截功能(采用的是Struts2中过滤器进行过滤拦截)
- servlet和struts2一起使用,实现绝对路径下的图片输出到jsp页面
- asp.net 使用页适配器和重写Render对全站输出的页面的HTML内容进行修改,不会错乱
- jsp中用过滤器filter拦截指定页面,转到servlet处理后返回目标页面的一个小例子
- 使用JSP相关元素实现页面内容输出
- SpringMVC——使用RequestDispatcher.include()和HttpServletResponseWrapper动态获取jsp输出内容
- 使用mod_ext_filter组件在Apache中实现输出内容的替换,为所有页面增加统计功能
- 在使用SSH过程中,在JSP页面中对数据进行处理,出异常!
- Servlet 过滤器Filter判断用户是否登陆(jsp页面)
- 使用Session在JSP页面间传递表单内容
- 数据库中的记录通过servlet回显到jsp页面中(连接数据库或者查询參照:对数据进行增删改查)
- Asp.net MVC 3 Razor 视图引擎 中使用@输出的内容都会被自动进行HTML编码 问题的解决办法
- 使用servlet编程,解决输出到页面的中文显示乱码问题。
- Flex 使用ArrayCollection的FilterFunction进行数据过滤
- java Filter之拦截jsp页面检查用户是否已经登录
- 百度UEditor的简单使用,JSP页面的表单中的内容后台获取和前端配置-结合项目使用
- 用过滤器对jsp页面中的敏感字段进行过滤