首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用Oltu检索post数据,使用Oltu将@Context HttpServletRequest传递给OAuthTokenRequest

无法使用Oltu检索post数据,使用Oltu将@Context HttpServletRequest传递给OAuthTokenRequest
EN

Stack Overflow用户
提问于 2014-03-13 11:13:02
回答 3查看 6.2K关注 0票数 16

我正在为Oauth2使用Oltu。

当使用@Context HttpServletRequest请求时,我无法检索post数据

当我使用@FormParam时,我能够检索post数据。

如何将请求传递给OAuthTokenRequest

代码语言:javascript
复制
OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request);

我收到了跟随错误

{“错误”:“invalid_request”,“error_description”:“缺少grant_type参数值”}

在oltu OAuthTokenRequest类上调试时,使用下面的代码来检索param值

代码语言:javascript
复制
public String getParam(String name) {
        return this.request.getParameter(name); // from request it is unable to get post data.As i am getting request object using  @Context HttpServletRequest request .
    }

据说使用@Context HttpServletRequest请求无法获得使用@Context HttpServletRequest请求的post数据,因此,我的问题是

如何在jax-ws中获取带有post数据的HttpServletRequest请求,以便将HttpServletRequest请求传递给OAuthTokenRequest --这是我的代码。

代码语言:javascript
复制
@Path("/token")
public class TokenEndpoint {

 @POST
    @Consumes("application/x-www-form-urlencoded")
    @Produces("application/json")
    public Response authorize(@FormParam("state") String state,@Context HttpServletRequest request) throws OAuthSystemException {
        try {
        // here I am unable to get value of request.getParameter("state") 
       // but using (@FormParam("state") I am able to get value of post parameter state
            request.getParameter("state");
            // exception is thrown from following code 
            OAuthTokenRequest oauthRequest = new OAuthTokenRequest(request);
EN

回答 3

Stack Overflow用户

发布于 2014-03-20 17:17:10

找到了解决办法(阅读评论)。

OLTU Issue #26

泽西岛正在消耗邮政数据。

解决方案是封装HttpServletRequest并重写getParameters()

这是包装器:

代码语言:javascript
复制
public class OAuthRequestWrapper extends HttpServletRequestWrapper {

    private MultivaluedMap<String, String> form;

    public OAuthRequestWrapper(HttpServletRequest request, MultivaluedMap<String, String> form)
    { super(request); this.form = form; }

    @Override
    public String getParameter(String name) {
        String value = super.getParameter(name);
        if (value == null)
        { value = form.getFirst(name); }
        return value;
    }
}

以下是如何实现令牌POST方法:

代码语言:javascript
复制
@POST
@Path("/token")
@Consumes("application/x-www-form-urlencoded")
@Produces("application/json")
public Response token(@Context HttpServletRequest request, MultivaluedMap<String, String> form) {   

    [...]

    OAuthTokenRequest oauthRequest = new OAuthTokenRequest(new OAuthRequestWrapper(request, form));

    [...]

}
票数 20
EN

Stack Overflow用户

发布于 2014-08-13 13:07:20

还存在资源服务器端点无法从post请求(jersey作为jax-rs实现)检索令牌值的问题,这是因为在资源服务器代码中使用验证器接口实现。

代码语言:javascript
复制
httpServletRequest.getParameterValues(param);

可以通过将String[] getParameterValues(String)重写到Matteo提出的同一个HttpServletRequestWrapper中来解决这个问题,请注意额外的条件,这对于捕获空令牌请求很重要(如果没有传递令牌,该方法应该返回null ):

代码语言:javascript
复制
@Override
public String[] getParameterValues(String name) {
    String[] values = super.getParameterValues(name);
    if(values == null && form.get(name) != null){
        values = new String[form.get(name).size()];
        values = form.get(name).toArray(values);
    }
    return values;
}

与apache oltu 1.0.0相关

票数 2
EN

Stack Overflow用户

发布于 2016-03-30 18:33:27

我发现了另一种限制,即无法在JAX处理程序中获取oltu所需的参数。

而不是使用HttpServletRequestWrapper对象,只需在WebFilter实现中调用HttpServletRequest.getParameterMap()方法。这将用请求的所有参数加载请求对象的缓存参数映射,使这些参数在此请求对象的生命周期内可用。

我更喜欢这种方法,因为它使JAX处理程序更干净,而且我已经在使用WebFilter拒绝对所有没有有效令牌的非oauth请求的访问。

我已经在泽西岛和CXF证实了这一点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22376810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档