【问题标题】:How to get the remote IP address of a client in EJB project from servlet?如何从 servlet 获取 EJB 项目中客户端的远程 IP 地址?
【发布时间】:2016-09-25 00:07:36
【问题描述】:

我创建了一个企业应用程序项目,其中包含一个 EJB 项目和一个 Web 项目,它运行良好。现在我想在 EJB 项目中获取远程客户端的 IP 地址,以用于我的应用程序中的一些逻辑。我尝试在 Web 部件中创建一个上下文类,如下所示:

Context.java

public class Context {
  private static ThreadLocal<Context> instance = new ThreadLocal<Context>();
  private HttpServletRequest request;

  private Context(HttpServletRequest request) {
    this.request = request;
  }

  public static Context getCurrentInstance() {
    return instance.get();
  }

  public static Context newInstance(HttpServletRequest request) {
    Context context = new Context(request);
    instance.set(context);
    return context;
  }

  public HttpServletRequest getRequest() {
    return request;
  }
}

从 EJB 中的类我尝试调用上下文类:

public String setIPAddress() {

    HttpServletRequest request = Context.getCurrentInstance().getRequest();
    String remoteIPAddress = request.getRemoteAddr();

    return remoteIPAddress;
}

我的问题是我不能从 EJB 类调用 context.java,如果我在 EJB 部分中包含类上下文,我会得到 NullPointerException。我还尝试将 Web 项目包含在 EJB 项目属性中,但出现错误“无法添加循环引用”。我正在使用 Netbeans。这种情况下如何获取远程IP地址?

【问题讨论】:

    标签: java servlets jakarta-ee ejb ip-address


    【解决方案1】:

    不建议这样做,但如果需要,可以使用:

    import javax.ejb.Stateless;
    import javax.faces.context.FacesContext;
    import javax.servlet.http.HttpServletRequest;
    
    @Stateless
    public class MyServiceBean {
    
        public void initialize() {
    
            final HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance().getExternalContext().getRequest();
            System.out.println("IP:" + request.getRemoteAddr());
    
            // load data
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      在 EJB 层中包含 Web 代码(ServletContext 等)不是一个好主意,这会使您的业务逻辑与表示层紧密耦合。

      更好的解决方案是从表示逻辑传递 IP 地址,而不是让 EJB 稍后完成工作。

      【讨论】:

      • Pradeep Pati:谢谢您的回答。问题是我需要远程客户端的 IP 地址进行测试。例如,如果 IP@ 等于 ip1 --> 做某事,如果 IP@ 等于 ip2 --> 做其他事情。这个逻辑在我的 EJB 项目中,这就是为什么我需要获取客户端的 IP 地址
      • @samia,虽然我不明白setIPAddress() 的真正用途,但您可以将签名更改为setIPAddress(String ipAddress),并将IP 从Servlet 传递给EJB。
      猜你喜欢
      • 1970-01-01
      • 2012-05-10
      • 2011-06-08
      • 2018-04-30
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 2012-03-14
      • 2012-02-16
      相关资源
      最近更新 更多