在 Listener 中访问 HttpServletRequest 对象

Access HttpServletRequest object in Listener

我有一个来自支付网关的 return url 变量。

private static String response_url = "http://1.1.1.1:8001/abc/xyz.html";
// private static String response_url = "http://www.something.com/xyz.html";

第一个变量是本地服务器的,第二个是生产环境的,我根据环境对变量进行注释和取消注释。

<action name="viewResponseFile" class="controller.RAction" method="viewResponseFile">
    <result name="success">somepage.jsp</result>
</action>

控制器映射到 xyz.html 上,它是 payment gateway 中的 return URL。现在我想让它通用。

我打算做的是在现有侦听器上设置该变量 class。

<listener>
     <listener-class>in.com.Initializer</listener-class>
</listener>

我尝试使用 ServletRequestAware 创建 HttpServletRequest 以获得 RequestURI 但没有成功。

public class Initializer implements ServletContextListener
{
    ServletContext context; 


    public Initializer()
    {

    } 

    public void contextInitialized(ServletContextEvent contextEvent)
    {
        // set-up code
    }

    public void contextDestroyed(ServletContextEvent contextEvent)
    {

    }

}

那么怎样才能达到这些要求呢?

显然评论和取消评论不是一个可行的方法,它涉及工作并且可能导致严重的错误;

但是您应该考虑在构建过程中也从例如 .properties 文件中提供它并不好,因为即使是自动化的,不同环境之间的构建也不同。如果您在 dev.properties 中添加 属性 而忘记在 prod.properties 中添加怎么办?如果文件被其他用户使用其他字符编码的编辑器修改怎么办?

最好的方法是将这些参数设为外部。

您的 Web 应用程序不应该包含它们,而应该将它们请求到环境中:数据库中的 配置 table,一组 环境变量,等等...

这样WAR总是相同的,不同的值由不同的服务器提供(然后由系统管理员编写正确的变量在正确的地方,但这是正常的)。

然后您可以确定仅在一个环境中发生的错误不会是代码问题。