2012-03-19 35 views
0

我有一個簡單的問題,但我尋找更長的時間,但我總是找到相同的答案,我不知道如何處理...JBoss AS 7,Java EE 6如何獲取客戶IP?

我想獲得IP地址在客戶端,當他註冊到我的應用程序...

,我發現這樣的事情:

@ManagedBean(name="testController") 
    @SessionScoped 
    public class TestController implements Serializable { 

     private static final long serialVersionUID = -3244711761400747261L; 
     protected final HttpServletRequest req; 

     public TestController(HttpServletRequest req) { 
      this.req = req; 
      System.out.println(this.req.getRemoteAddr().toString()); 
     } 
    } 

,但我沒有HttpServletRequest的構造函數.... 或我不知道如何使用它,我得到的只是錯誤....

回答

4

它由ExternalContext#getRequest()提供。

public TestController() { 
    HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest(); 
    System.out.println(request.getRemoteAddr()); 
} 

請注意,您在初次嘗試中犯了一個主要的概念錯誤。您正嘗試將當前HTTP請求分配爲會話作用域管理bean的屬性。 HTTP請求實例將在當前HTTP響應結束時過期,因此不再有效,並且在創建會話作用域bean後,當您嘗試訪問初始請求後的後續請求中的方法時,會在所有顏色中引發異常。

1

我想用一種不同的方法,也用在Seam Solder項目中:創建一個servlet過濾器,捕獲servlet請求並通過應用程序範圍的生產者使其可用。請參閱相應的source code of the solder project