在我的用例中,我必须使用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);
}
但是我必须阅读回复并在发送转发之前对其进行一些操作。
有可能吗?
答案 0 :(得分:0)
如果您创建了一个servletContextListener,则可以使用它来添加一个新的过滤器,该过滤器作为转发请求的一部分运行。然后,您可以实现一个HttpServletResponseWrapper,它会覆盖getPrintWriter()和getOutputStream()方法,以返回您自己的对象,这些对象基本上缓冲了所写的内容,然后在您的新过滤器中调用doChain()之前用包装器替换响应对象。然后从doChain返回时,从缓冲区中提取响应数据,按照您喜欢的方式处理它,然后使用PrintWriter或OutputStream(其余请求使用的那个)将其写出来。我怀疑其他服务将使用PrintWriter进行输出,这样就是你选择的路径。
这里有一个很好的例子(减去ServletContextListener):
此示例将响应转换为大写的位置是您查找需要更改的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);
}
}
}