在 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 服务 URL [重复]

在 iOS 中访问 RESTful Web 服务

访问 RESTful Web 服务的最佳身份验证机制

RESTful Web 服务 + Spring Security:带有访问令牌的 API 服务?

默认情况下,哪些客户端可以/不能访问 RESTful Web 服务?

如何使用 Spring RESTful Web 服务处理 CSRF 保护?