使用Java Web Services时如何获得对HttpServletRequest对象的访问
时间:2020-03-06 14:43:18 来源:igfitidea点击:
我正在使用Java 6,Tomcat 6和Metro。我使用WebService和WebMethod批注公开我的Web服务。我想获取有关该请求的信息。我尝试了以下代码,但是wsCtxt始终为null。我必须采取什么步骤才能使WebServiceContext不为null。
换句话说:如何执行以下行以获取wsCtxt的非空值?
MessageContext msgCtxt = wsCtxt.getMessageContext();
@WebService
public class MyService{
@Resource
WebServiceContext wsCtxt;
@WebMethod
public void myWebMethod(){
MessageContext msgCtxt = wsCtxt.getMessageContext();
HttpServletRequest req = (HttpServletRequest)msgCtxt.get(MessageContext.SERVLET_REQUEST);
String clientIP = req.getRemoteAddr();
}
解决方案
也许javax.ws.rs.core.Context注释是针对我们要查找的内容,而不是Resource?
我建议我们将变量从wsCtxt重命名为wsContext或者将name属性分配给@Resource批注。 @Resource上的J2ee教程指示变量名称用作查找的一部分。我在使用Glassfish注入不同类型的资源时遇到了同样的问题。
尽管正确名称可能不是wsContext。我正在关注这个Java技巧。如果我们喜欢变量名称wsCtxt,请在变量声明中使用name属性:
@Resource(name="wsContext") WebServiceContext wsCtxt;
我仍然有这个问题。这是我的解决方法,是编写一个ServletRequestListener,将请求放入ThreadLocal变量中。然后,WebService可以从ThreadLocal获取请求。换句话说,我正在重新实现一些对我不起作用的东西。
这是侦听器:
import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
public class SDMXRequestListener implements ServletRequestListener {
public SDMXRequestListener() {
}
public void requestDestroyed(ServletRequestEvent event) {
}
public void requestInitialized(ServletRequestEvent event) {
final ServletRequest request = event.getServletRequest();
ServletRequestStore.setServletRequest(request);
}
}
这是ThreadLocal包装器:
import javax.servlet.ServletRequest;
public class ServletRequestStore {
private final static ThreadLocal<ServletRequest> servletRequests = new ThreadLocal<ServletRequest>();
public static void setServletRequest(ServletRequest request) {
servletRequests.set(request);
}
public static ServletRequest getServletRequest() {
return servletRequests.get();
}
}
和web.xml的连接:
<listener>
<listener-class>ecb.sdw.webservices.SDMXRequestListener</listener-class>
</listener>
Web服务使用以下代码来获取请求:
final HttpServletRequest request = (HttpServletRequest) ServletRequestStore.getServletRequest();
以下代码使用Java 5,Tomcat 6和Metro对我有效
Java 6中的WS支持与我们使用的Metro版本之间可能存在冲突。我们是否在Java 5构建上尝试过?
@WebService
public class Sample {
@WebMethod
public void sample() {
HttpSession session = findSession();
//Stuff
}
private HttpSession findSession() {
MessageContext mc = wsContext.getMessageContext();
HttpServletRequest request = (HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST);
return request.getSession();
}
@Resource
private WebServiceContext wsContext;
}

