【问题标题】:Add Http Basic Authentication to servletRequest将 Http 基本身份验证添加到 servletRequest
【发布时间】:2017-05-25 10:30:58
【问题描述】:

我有一个ProxyServlet 来处理从我的应用程序发送到另一台服务器(使用 HTTP 基本身份验证)的请求,我想在 Servlet 触发实际请求之前手动添加标头,这样用户就不必输入任何凭据。

我使用HttpServletRequestWrapper尝试了类似下面的代码

public class DataServlet extends ProxyServlet {
  @Override
  protected void service(HttpServletRequest servletRequest, HttpServletResponse servletResponse)
        throws ServletException, IOException {

    final SystemCredentials credentials = new SystemCredentials("username", "password");

    HttpServletRequestWrapper wrap = new HttpServletRequestWrapper(servletRequest){

        @Override
        public String getHeader(String name) {              
            if (name.equals("Authorization")){
                String encoding = Base64.getEncoder().encodeToString((credentials.getUser().concat(":").concat(credentials.getPassword()).getBytes()));
                return "Basic " + encoding;
            } else
                return super.getHeader(name);
        }

    };

    super.service(wrap, servletResponse);

  }
}

它似乎不起作用,当我尝试访问它时,会显示一个弹出窗口并询问远程服务器的凭据。

我的 web.xml 包含

<servlet>
  <servlet-name>data</servlet-name>
  <servlet-class>foo.package.servlet.DataServlet</servlet-class>
  <init-param>
    <param-name>targetUri</param-name>
    <param-value>http://fooServer/DataServer</param-value>
  </init-param>
  <async-supported>true</async-supported>
</servlet>
<servlet-mapping>
  <servlet-name>data</servlet-name>
  <url-pattern>/DataServer/*</url-pattern>
</servlet-mapping>

还有其他方法可以使这项工作吗?

谢谢!

【问题讨论】:

    标签: java http servlets basic-authentication request-headers


    【解决方案1】:

    解决方案是覆盖方法 getHeader(String name)getHeaders(String name)getHeaderNames() ,如下所示。这也取决于实现如何寻找标头。在这种情况下,ProxyServlet 正在通过 Enumeration&lt;String&gt; getHeaders(String name) 查找。

    HttpServletRequestWrapper wrap = new HttpServletRequestWrapper(servletRequest){
    
    
            @Override
            public String getHeader(String name) {
    
                if (name.equals(HttpHeaders.AUTHORIZATION)){
                    String encoding = Base64.getEncoder().encodeToString((credentials.getUser().concat(":").concat(credentials.getPassword()).getBytes()));
                    return "Basic " + encoding;
                }
                return super.getHeader(name);
            }
    
            @Override
            public Enumeration<String> getHeaders(String name) {
                if (name.equals(HttpHeaders.AUTHORIZATION)){
                    List<String> temp = new ArrayList<>();
                    String encoding = Base64.getEncoder().encodeToString((credentials.getUser().concat(":").concat(credentials.getPassword()).getBytes()));
                    temp.add("Basic " + encoding);
                    return Collections.enumeration(temp);
                }
                return super.getHeaders(name);
            }
    
            @Override
            public Enumeration<String> getHeaderNames() {
                // TODO Auto-generated method stub
                List<String> temp = Collections.list(super.getHeaderNames());
                temp.add(HttpHeaders.AUTHORIZATION);
                return Collections.enumeration(temp);
    
            }
    
        };
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-21
      • 2011-11-12
      相关资源
      最近更新 更多