【问题标题】:Setting a Authorization Header in Filter在过滤器中设置授权标头
【发布时间】:2015-12-25 11:57:13
【问题描述】:

我是 RESTful Web 服务的新手。我有一个新要求。就像,我需要创建一个新的 RESTful Web 服务,我的服务将接受来自调用程序的令牌。此令牌需要设置为授权标头并点击客户端提供的 JAR 中的过滤器。我创建了一个 RESTFul Web 服务,它接受来自调用程序的令牌。现在如何将此令牌设置为授权标头。请帮我解决这个问题。

【问题讨论】:

  • 你检查javax.ws.rs.core.HttpHeaders了吗?
  • 是的,但我对javax.ws.rs.core.HttpHeaders 有一个清晰的想法。你能告诉我一个例子吗?

标签: java web-services rest servlets servlet-filters


【解决方案1】:

在纯 Java 中,您可以这样设置授权标头 客户端

String url = "test.com";
URL urlObj = new URL(url);
HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();
con.setRequestProperty("Authorization", "You Token");

编辑 只是为了确保我不会错过 op 的主题。 如果您想创建一个令牌进行授权,您必须在用户登录您的站点后将此令牌传递给用户。用户客户端收到令牌后,客户端必须在每个请求中发送此令牌(请务必使用 ssl 进行传输)

服务器端代码应如下所示:

public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException {
    String auth = req.getHeader("Authorization");
    //validate Token
}

【讨论】:

  • 我需要将授权标头设置为HttpServletRequest
  • 嗯,我不以我认为的正确方式理解问题。你有一个客户端和一个服务器。客户端通过 auth 标头向服务器发送有效的身份验证令牌。服务器检查令牌并在令牌正确时执行所需的请求。服务器应该发送令牌的唯一时间是用户在服务器上进行身份验证时
    如果您在服务器端从客户端收到令牌,它将包含在HttpServletRequest 中,如果您想将其发送给您的客户端必须把它放在HttpServletResponse
  • 它不是网站。只是一个 Restful Web 服务。我需要创建一个 Rest Web 服务。第三方将通过向我的服务传递令牌来调用。我的服务将收到令牌并需要设置为 Authorization Header。
  • 好的,如果您通过HttpServletRequest 收到令牌,您可以通过HttpServletResponse 轻松将其发回。只需编写类似response.addHeader("Authorization", theToken); 的代码
  • 但我将通过 Rest Web Service 方法将令牌作为字符串获取。现在我需要设置为HttpServletRequest。那就是我卡住的地方。如果您知道如何设置HttpServletRequest,请告诉我。
【解决方案2】:

这个问题的上下文是否与你的这篇文章相同 - Calling a Filter before a Servlet from REST Webservice

然后总结一下,您有一个接受令牌作为标头的 Restful 服务。您从提供某些功能的服务调用过滤器,并且需要将令牌作为请求标头传递给过滤器?

要实现这一点,您需要创建一个HttpServletRequestWrapper 并将其传递给过滤器。您将覆盖 getHeader(String name) 方法和

public class CustomHttpServletRequestWrapper implements HttpServletRequest{
       public CustomHttpServletRequestWrapper(HttpServletRequest request){
            super(request);
       }

       public String getHeader(String name){
            if(name.equals("AUTH-HEADER"){
                  //get the original request
                  HttpServletRequest request = (HttpServletRequest)getRequest();
                   //now get it from the original request and return
            }else{
                  return request.getHeader(name);
             }
       }

      //  TODO override getHeaderNames()
} 

然后在调用过滤器时传递它。

 CustomHttpServletRequestWrapper requestWrapper = new CustomHttpServletRequestWrapper(request);
 request.getRequestDispatcher("/secure").include(requestWrapper, response);

【讨论】:

    【解决方案3】:

    也许你可以这样做:

    request.setAttribute("yourNameToken", yourToken);
    

    那么您可以将令牌与此脚本一起使用:

    String tk = (String) request.getAttribute("yourNameToken");
    

    【讨论】:

      猜你喜欢
      • 2017-08-18
      • 2017-08-30
      • 2021-11-21
      • 2015-12-02
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 2021-04-07
      • 2016-07-13
      相关资源
      最近更新 更多