2017-02-27 60 views
-1

我有一个变量,来自支付网关的返回URL。在监听器中访问HttpServletRequest对象

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> 

我试着用ServletRequestAwareRequestURI创建HttpServletRequest,但没有成功。

public class Initializer implements ServletContextListener 
{ 
    ServletContext context; 


    public Initializer() 
    { 

    } 

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

    public void contextDestroyed(ServletContextEvent contextEvent) 
    { 

    } 

} 

那么如何才能实现这些要求呢?

回答

1

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

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

最好的方法是使这些参数外部。

Web应用程序不应该将其纳入,应该不是让他们的环境:一个配置表在数据库中,一组环境变量等...

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

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

+0

在环境变量的情况下,我将不得不在'N'个服务器上设置环境。如果使用数据库方法创建单个URL的表是不可行的。没有办法在Listener类中选择'localhost:8080 \ project_name \'(动态主机名)? – piechuckerr

+0

通常,一个web应用程序在dev和prod环境之间有很多不同的设置,或者甚至在环境之间是相等的,但是将来可能会改变,并且因此它们被参数化为表或env变量。 。顺便说一句,对于单个URL的情况,你不能从相对请求头中读取* referer *吗? –