我已经创建了一个包含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部分中包含classe上下文,我会得到NullPointerException。我还尝试将Web项目包含在EJB projcet属性中,并且我得到了错误&#34;无法添加循环引用&#34;。我正在使用Netbeans。在这种情况下,如何获取远程IP地址?
答案 0 :(得分:2)
不建议这样做,但如果需要,可以使用:
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
}
}
答案 1 :(得分:1)
在EJB层中拥有Web代码(ServletContext
等)并不是一个好主意,这会使您的业务逻辑与表示层紧密耦合。
更好的解决方案是从表示逻辑传递IP地址,而不是让EJB稍后完成工作。