2012-03-19 5 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-ответа и, следовательно, больше недействителен и генерирует исключения во всех цветах при попытке получить доступ к его методам в последующих запросах, следующих за первоначальным запросом, когда был создан компонент, обработанный сеансом.

1

Я бы выбрал другой подход, также используемый в проекте Seam Solder: Создайте сервлет-фильтр, который захватывает запрос сервлета и делает его доступным через производителя приложений. См. Соответствующий source code of the solder project.

Смежные вопросы