请求调度程序读取包含之前的响应

时间:2015-12-02 17:11:15

标签: java servlets response requestdispatcher

在我的用例中,我必须使用RequestDispatcher来将请求转发到部署在同一服务器上的另一个servlet。

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain arg2) throws IOException, ServletException {
   String generateRedirectUrl=FormURL((HttpServletRequest)req);
   ServletContext context = ((HttpServletRequest)req).getSession().getServletContext();
   ServletContext newContext = context.getContext("/myNewContext");
   RequestDispatcher dispatcher = newContext.getRequestDispatcher(generateRedirectUrl);  
   dispatcher.forward(req, resp);          
}

但是我必须阅读回复并在发送转发之前对其进行一些操作。

有可能吗?

1 个答案:

答案 0 :(得分:0)

如果您创建了一个servletContextListener,则可以使用它来添加一个新的过滤器,该过滤器作为转发请求的一部分运行。然后,您可以实现一个HttpServletResponseWrapper,它会覆盖getPrintWriter()和getOutputStream()方法,以返回您自己的对象,这些对象基本上缓冲了所写的内容,然后在您的新过滤器中调用doChain()之前用包装器替换响应对象。然后从doChain返回时,从缓冲区中提取响应数据,按照您喜欢的方式处理它,然后使用PrintWriter或OutputStream(其余请求使用的那个)将其写出来。我怀疑其他服务将使用PrintWriter进行输出,这样就是你选择的路径。

这里有一个很好的例子(减去ServletContextListener):

http://www.java2s.com/Tutorial/Java/0400__Servlet/Filterthatusesaresponsewrappertoconvertalloutputtouppercase.htm

此示例将响应转换为大写的位置是您查找需要更改的json名称,值对,然后根据需要进行修改。

这是一个合适的ServletContextListener的示例。请注意,需要添加侦听器,以便为所有应用程序调用它,并且不同的服务器实现提供了不同的方法来执行此操作:

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;

    @WebListener
    public class ServletContextListenerFilter implements ServletContextListener {

        public ServletContextListenerFilter() {}

        @Override
        public void contextDestroyed(ServletContextEvent arg0) {}

        @Override
        public void contextInitialized(ServletContextEvent sce) {
            ServletContext sc = sce.getServletContext();

            if (sc.getServletContextName().equals("Third party rest serice context name")) {
                sc.addFilter("FilterName", filterClass);
            }

        }
    }