0

我有一个简单的问题,但我正在寻找更长的时间,但我总是找到相同的答案,我真的不知道如何处理......

当他注册到我的应用程序时,我想获取客户的 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

2 回答 2

4

它由ExternalContext#getRequest().

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

请注意,您在最初的尝试中犯了一个重大的概念错误。您正在尝试将当前 HTTP 请求分配为会话范围托管 bean 的属性。HTTP 请求实例将在当前 HTTP 响应结束时过期,因此不再有效,并且当您尝试在创建会话范围 bean 时的初始请求之后的后续请求中访问其方法时,会抛出所有颜色的异常。

于 2012-03-22T21:42:29.577 回答
1

我会采用一种不同的方法,也用于 Seam Solder 项目:制作一个 servlet 过滤器,用于捕获 servlet 请求并通过应用程序范围的生产者使其可用。请参阅焊接项目的相应源代码

于 2012-03-20T07:03:16.417 回答