使Struts2 redirectAction使用相对路径而不是绝对路径

时间:2013-12-13 12:26:24

标签: java struts2 nginx

我有一个在nginx后面运行的struts2 Web应用程序模块。该应用程序在专用网络中运行,但我们的客户端通过互联网请求访问,因此打开了一个端口。

我的问题如下。我有一些已执行的操作,然后使用redirectAction转发到另一个标准应答操作。这样做是为了在json中编写标准答案的单一操作。不幸的是,重定向动作的响应头中的位置已清除端口 - 我猜nginx会这样做 - 因此重定向错过了,因为它没有端口。

我的nginx管理员说他无法触摸特定模块的nginx重定向,无论是全部还是全部。

有没有人知道是否有办法让struts redirectAction在相对路径上工作,而不是绝对路径?我唯一的想法是,我将尝试创建redirectAction实现的自定义变体 - org.apache.struts2.dispatcher.ServletActionRedirectResult - 但我想知道是否有更简单的方法来实现相同的结果。< / p>

2 个答案:

答案 0 :(得分:1)

不是为tomcat打开特定端口,而是应该将特定域的请求内部转发到在其他端口运行的tomcat。

我们的服务器具有针对tomcat的apache的这种配置,我们使用了mod_jk&amp;为此目的mod_proxy

谷歌搜索这些主题将进一步描述如何实现这一目标。因为它们本身就是一个相当大的主题。

可能的解决方案:

Nginx reverse proxy for tomcat

NGINX with Tomcat configuration

答案 1 :(得分:0)

由于nginx,我尝试生成自定义重定向操作失败,因此尽管重新配置nginx时遇到了初步问题,我们最终还是因为我们无法在其他任何地方解决它。

我们在nginx中发现的是它为我们的模块提供了这个:

proxy_redirect          off;
proxy_set_header        X-Real-IP       $remote_addr;
proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;

导致基于端口8889的操作中的所有重定向操作丢弃其端口(位置中的链接)。

我们找到了两种方法来解决这个问题:通过删除上面的三个配置行,或者添加它们:

proxy_set_header        Host            $host:8889;

这两种解决方案都适用于我们。

至于我尝试创建一个相对的自定义操作,最后使用HttpServlet结果对象格式化了操作:

finalLocation = response.encodeRedirectURL(tmpLocation.toString());

输出,即使将tmpLocation添加为相对值,最终也会被构建为动作答案中的绝对位置。并且无端。