将请求URL更改为指向servlet过滤器中的不同Web服务器

时间:2013-04-11 09:11:57

标签: php jsp redirect servlet-filters

有没有办法将请求URL更改为指向托管在不同Web服务器中的另一个页面?假设我在Tomcat中托管了一个页面:

<form action="http://localhost:8080/Test/dummy.jsp" method="Post">
    <input type="text" name="text"></input>
    <input type="Submit" value="submit"/>
</form>

我使用servlet过滤器拦截请求:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,ServletException {
    HttpServletRequest request = (HttpServletRequest) req;
    chain.doFilter(req, res);
    return;
}

我想要的是将请求URL更改为指向另一个Web服务器http://localhost/display.php中托管的PHP页面。我知道我可以使用response.sendRedirect,但在我的情况下它不起作用,因为它会丢弃所有POST数据。有没有办法更改请求URL,以便chain.doFilter(req, res);将我转发到该PHP页面?

1 个答案:

答案 0 :(得分:1)

HttpServletResponse#sendRedirect()默认发送HTTP 302重定向,确实隐式创建了一个新的GET请求。

您需要改为使用HTTP 307重定向。

response.setStatus(307);
response.setHeader("Location", "http://localhost/display.php");

(我认为http://localhost网址只是示范性的;这显然不适用于制作)

注意:浏览器会在继续之前要求确认。

替代方案是代理:

URLConnection connection = new URL("http://localhost/display.php").openConnection();
connection.setDoOutput(true); // POST
// Copy headers if necessary.

InputStream input1 = request.getInputStream();
OutputStream output1 = connection.getOutputStream();
// Copy request body from input1 to output1.

InputStream input2 = connection.getInputStream();
OutputStream output2 = response.getOutputStream();
// Copy response body from input2 to output2.

注意:您最好使用servlet代替过滤器。

另一个替代方案是将PHP代码移植到JSP / Servlet代码。另一个替代方案是通过PHP模块(例如Quercus)直接在Tomcat上运行PHP。