在 RESTful Web 服务中访问 HttpServletRequest 对象
Posted
技术标签:
【中文标题】在 RESTful Web 服务中访问 HttpServletRequest 对象【英文标题】:Getting Access to HttpServletRequest object in restful web service 【发布时间】:2011-12-13 23:08:33 【问题描述】:我可以通过如下方式访问soap web 服务中的HttpServlet Request 对象: 在服务实现中为 WebServiceContext 声明一个私有字段,并将其注解为资源:
@Resource
private WebServiceContext context;
为了获取 HttpServletRequet 对象,我编写如下代码:
MessageContext ctx = context.getMessageContext();
HttpServletRequest request =(HttpServletRequest)ctx.get(AbstractHTTPDestination.HTTP_REQUEST);
但是这些东西在一个安静的网络服务中是行不通的。 我正在使用 Apache CXF 开发宁静的 Web 服务。请告诉我如何访问 HttpServletRequest 对象。
【问题讨论】:
【参考方案1】:将此代码用于访问请求和每个请求的响应:
@Path("/User")
public class RestClass
@GET
@Path("/getUserInfo")
@Produces(MediaType.APPLICATION_JSON)
public Response getUserrDetails(@Context HttpServletRequest request,
@Context HttpServletResponse response)
String username = request.getParameter("txt_username");
String password = request.getParameter("txt_password");
System.out.println(username);
System.out.println(password);
User user = new User(username, password);
return Response.ok().status(200).entity(user).build();
...
【讨论】:
【参考方案2】:我建议使用org.apache.cxf.jaxrs.ext.MessageContext
import javax.ws.rs.core.Context;
import org.apache.cxf.jaxrs.ext.MessageContext;
...
// add the attribute to your implementation
@Context
private MessageContext context;
...
// then you can access the request/response/session etc in your methods
HttpServletRequest req = context.getHttpServletRequest();
HttpServletResponse res = context.getHttpServletResponse()
您可以使用@Context
注释来标记其他类型(例如 ServletContext 或专门的 HttpServletRequest)。见Context Annotations.
【讨论】:
在 Jersey 实现中,MessageContext
不起作用。但是你仍然可以使用@Context HttpServletRequest
。
我无法让您的示例生效。我只能通过将 HttpServletRequest 添加为使用 @Context 注释装饰的方法参数来获得对它的引用,如下所示。以上是关于在 RESTful Web 服务中访问 HttpServletRequest 对象的主要内容,如果未能解决你的问题,请参考以下文章
RESTful Web 服务 + Spring Security:带有访问令牌的 API 服务?