当我使用Java Web服务时,如何获得对HttpServletRequest对象的访问权?

问题描述 投票:15回答:5

我使用的是Java 6、Tomcat 6和Metro。我使用WebService和WebMethod注解来公开我的Web服务。我想获取有关请求的信息。我尝试了以下代码,但wsCtxt总是空的。我必须采取什么步骤才能 获取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();
  }
java web-services annotations servlets
5个回答
12
投票

我建议你将你的变量从wsCtxt重命名为wsContext,或者将名称属性分配给@Resource注解。 在这里,我建议你将你的变量从wsCtxt改名为wsContext,或者将名称属性分配给@Resource注解。关于@Resource的J2ee教程 表示将变量的名称作为查找的一部分。 我在Glassfish中使用资源注入注入不同类型的资源时也遇到过这个问题。

虽然你的正确名称可能不是wsContext。 我的做法是这样的 岩浆小费. 如果你喜欢wsCtxt这个变量名,那就在变量声明中使用name属性。

@Resource(name="wsContext") WebServiceContext wsCtxt;


3
投票

我还是有这个问题 我的解决方法是写一个ServletRequestListener,把请求放到一个ThreadLocal var中,然后WebService可以从ThreadLocal中获取请求。换句话说,我重新实现了一些对我来说行不通的东西。

这是Listener。

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();


3
投票

下面的代码对我来说,使用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;
}

1
投票

也许javax.ws.rs.core.Context注解是你要找的,而不是资源?

© www.soinside.com 2019 - 2024. All rights reserved.