在Listener中访问HttpServletRequest对象

时间:2017-02-27 10:07:10

标签: java servlets struts2

我有一个带有来自支付网关的返回网址的变量。

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的返回URL。现在我想让它变得通用。

我打算做的是在现有的Listener类上设置该变量。

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

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

public class Initializer implements ServletContextListener
{
    ServletContext context; 


    public Initializer()
    {

    } 

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

    public void contextDestroyed(ServletContextEvent contextEvent)
    {

    }

}

那么如何才能达到这些要求呢?

1 个答案:

答案 0 :(得分:1)

显然评论和取消注释不是一种可行的方式,它涉及到工作并可能导致严重的错误;

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

最佳方式是将这些参数设为外部。

您的Web应用程序不应该包含它们,而应该向它们询问环境:数据库中的配置表,一组环境变量等。

这样WAR始终是相同的,不同的值由不同的服务器提供(然后系统管理员可以在正确的位置编写正确的变量,但是那是正常的。)

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