2017-02-27 63 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 *嗎? –