`
flyzonemu
  • 浏览: 34983 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

在过滤器中修改一个http请求的返回内容

阅读更多
上篇中解决问题的过程中有看过一些response的东西,在这总结一下

response保存了请求的返回信息,里面有个outputstream,你要返回给页面的流,都在这个地方保存.
之前遇到一个问题,想把outputstream修改一下.因为这是个输出流,想要改这个里面的东西不是这么简单的.
sun为我们提供了这么一个工具HttpServletResponseWrapper抽象类,利用这个类的子类把servletresponse包装一下,在过滤器中使用,就可以去除response的文件流,对其作出修改.给出一个实现:
package com.ali.report.birt.filter;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpServletResponseWrapper;

public class CharResponseWrapper extends HttpServletResponseWrapper {
	private ByteArrayOutputStream buffer=null;    
    private ServletOutputStream out=null;    
    private PrintWriter writer=null;    
        
    public CharResponseWrapper(HttpServletResponse resp) throws IOException{    
        super(resp);    
        buffer=new ByteArrayOutputStream();//真正存储数据的流    
        out=new WapperedOutputStream(buffer);    
        writer=new PrintWriter(new OutputStreamWriter(buffer,this.getCharacterEncoding()));    
    }    
    //重载父类获取outputstream的方法    
    @Override   
    public ServletOutputStream getOutputStream()throws IOException{    
        return out;    
    }    
    //重载父类获取writer的方法    
    @Override   
    public PrintWriter getWriter() throws UnsupportedEncodingException{    
        return writer;    
    }    
    //重载父类获取flushBuffer的方法    
    @Override   
    public void flushBuffer()throws IOException{    
        if(out!=null){    
            out.flush();    
        }    
        if(writer!=null){    
            writer.flush();    
        }    
    }    
    @Override   
    public void reset(){    
        buffer.reset();    
    }    
    public String getContent()throws IOException{    
        flushBuffer();//将out、writer中的数据强制输出到WapperedResponse的buffer里面,否则取不到数据    
        return new String(buffer.toByteArray());    
    }    
        
    //内部类,对ServletOutputStream进行包装    
    private class WapperedOutputStream extends ServletOutputStream{    
        private ByteArrayOutputStream bos=null;    
        public WapperedOutputStream(ByteArrayOutputStream stream) throws IOException{    
            bos=stream;    
        }    
        @Override   
        public void write(int b) throws IOException{    
            bos.write(b);    
        }    
    }    

}

然后在你的过滤器中这么使用:
public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
					
			CharResponseWrapper crw = new CharResponseWrapper((HttpServletResponse)response);
			
			chain.doFilter(request, crw);
			
			String content = crw.getContent();//response流的内容
			
			//此处可以对content做处理,然后再把content写回到输出流中			
			response.setContentLength(-1);
			
			PrintWriter out = response.getWriter();
			
			content = this.changeContent(content, sessionid, folder);
			
			out.write(content);
	        
			out.flush();

			out.close();*/
			
				}

如此这般就可以达到你的目的了,当然扩展一下还是可以干很多事的,比如说压缩图片,改变字符集..........
分享到:
评论
2 楼 hairen1988 2015-10-13  
LZ你好!
content = this.changeContent(content, sessionid, folder)
这一句中,folder是什么?sessionid可以从request中取,不知道这个是什么。
另我用你说的这个方法更改response内容时,还是会提示:
java.lang.IllegalStateException: getOutputStream() has already been called for this response。
怎么破?
1 楼 ahao99 2011-12-29  
哥给你回一个

相关推荐

    java过滤器中修改一个http请求的返回内容.pdf

    在标题“java过滤器中修改一个http请求的返回内容.pdf”和描述中提到的,主要涉及如何在过滤器中通过HttpServletResponseWrapper修改HTTP响应的内容。 首先,我们需要了解HttpServletResponse接口,它是Servlet API...

    java过滤器中修改一个http请求的返回内容.docx

    在Java Web开发中,过滤器(Filter)是一个强大的工具,它可以拦截HTTP请求和响应,进行预处理或后处理。在给定的文档中,我们关注的是如何在过滤器中修改HTTP响应的内容。以下是对这个主题的详细解释: 1. **...

    过滤器链的一个小Demo

    2. 按照过滤器在配置中的顺序,从第一个过滤器开始,调用每个过滤器的`doFilter()`方法。 3. `doFilter()`方法内部,首先调用`chain.doFilter(request, response)`将请求传递给下一个过滤器,直到链末尾。 4. 当请求...

    java 请求参数过滤拦截

    在实际开发中,我们通常会创建一个全局过滤器类,配置在web.xml文件中,让其对所有请求生效。过滤器的执行顺序可以通过`<filter-mapping>`的`filter-name`和`url-pattern`来控制,也可以使用注解式配置(如Spring的`...

    一个很简单的过滤器一看就会

    在DEMO中,你可以尝试改变过滤器的行为,例如检查用户是否已登录、修改请求或响应头,甚至对请求参数进行处理。这样,你可以更深入地理解过滤器的工作机制。 总之,过滤器是Web开发中的强大工具,它允许我们在不...

    servlet过滤器详解

    - **修改请求**:过滤器可以修改请求头或请求体中的数据。 - **拦截响应**:在响应返回客户端之前,过滤器还可以对其进行拦截,从而实现对响应内容的检查或修改。 - **修改响应**:过滤器可以修改响应头或响应体...

    过滤器实验

    【过滤器实验】是Web应用开发中的一个重要环节,主要涉及Servlet技术。在Servlet容器中,过滤器(Filter)扮演着预处理请求和后处理响应的角色,它可以拦截、修改或者完全控制用户请求和服务器响应的过程。 一、...

    过滤器操作数据库验证合法用户

    在Java Web开发中,过滤器(Filter)是一个非常重要的组件,它主要用于在请求被实际处理之前或之后执行一些预处理或后处理任务。过滤器在Servlet规范中定义,是实现Servlet API的一部分,允许开发者对HTTP请求和响应...

    java过滤器例子

    当一个HTTP请求到达服务器时,会按照在web.xml中配置的顺序依次通过每个过滤器。每个过滤器都有机会对请求和响应进行处理,然后传递给下一个过滤器,直到请求到达目标资源。返回时,响应也会按照相反的顺序通过过滤...

    Aspdotnet2_0中自定义过滤器对Response内容进行处理

    在ASP.NET 2.0中,自定义过滤器(Filters)是一种强大的机制,允许开发者拦截并处理应用程序的请求和响应。这些过滤器可以用于执行多种任务,如认证、授权、异常处理以及对输出内容的修改。本文将深入探讨如何在ASP...

    JAVAEE过滤器的使用

    在JAVAEE平台上,过滤器(Filter)是一种强大的工具,它允许开发者在请求到达Servlet之前或Servlet响应返回客户端之后对请求和响应进行处理。过滤器在Java Web应用中扮演着重要角色,可以实现如数据验证、登录检查、...

    过滤器进行登录操作

    在Java Web开发中,过滤器(Filter)是一个强大的工具,常用于实现各种需求,如登录操作的处理。本文将深入探讨如何使用过滤器进行登录操作,以及这一过程中的相关知识点。 首先,我们要理解过滤器的基本概念。在...

    使用过滤器实现判断用户是否登录验证.

    过滤器的主要职责包括:修改请求或响应、执行安全检查、日志记录等。 要实现用户登录验证的过滤器,我们需要遵循以下步骤: 1. **创建过滤器类**:首先,创建一个新类,继承自`javax.servlet.Filter`。在该类中,...

    过滤器,Jsp开发中的避免中文乱码

    - 过滤器是Java Servlet规范中定义的一种组件,它实现了javax.servlet.Filter接口,可以在请求处理前、处理后或响应返回前执行一些操作。 - 过滤器链是多个过滤器按顺序调用的机制,每个过滤器可以决定是否将请求...

    基于谷歌浏览器的请求过滤器

    描述中提到“只能修改请求不能修改响应”,这意味着该过滤器专注于请求阶段,用户可以查看并更改发送到服务器的数据,但不能直接影响服务器返回的响应。这可能是出于安全考虑,避免对网站的正常功能造成干扰,或者...

    过滤器的部分知识

    在Java Web开发中,过滤器(Filter)是一个重要的概念,它允许开发者在数据处理和响应发送之前或之后对HTTP请求和响应进行拦截、修改或增强。过滤器是Servlet API的一部分,通过实现`javax.servlet.Filter`接口来...

    过滤器的使用,内有源码的说明

    在Java Web开发中,过滤器(Filter)是一个非常重要的组件,它主要用于在请求到达目标Servlet之前或之后进行处理。过滤器可以实现诸如数据验证、安全控制、字符编码转换等多种功能。本篇将深入探讨过滤器的配置与...

    jsp+servlet登录验证过滤器

    10. **最佳实践**:为了保持代码的可维护性和可扩展性,建议将登录验证逻辑封装在一个独立的服务类中,而不是直接写在过滤器里,这样可以方便地对验证逻辑进行修改和测试。 综上所述,"jsp+servlet登录验证过滤器...

    网络编程 过滤器链例子

    - 在`doFilter()`方法中,开发者可以执行预处理任务,如登录检查、数据校验等,然后通过调用`chain.doFilter(request, response)`传递请求给下一个过滤器,或者直接终止链的执行。 2. **配置过滤器**: - 在Java ...

    web过滤器 c#

    在提供的压缩包文件"WebMIS.GoldFilterOpenSource"中,很可能是包含了一个开源的Web过滤器实现。这样的库通常会提供自定义过滤器的示例,帮助开发者扩展ASP.NET的功能。在使用这个库时,你可以研究源代码,理解其...

Global site tag (gtag.js) - Google Analytics