2017-05-25 12 views
0

アプリケーションから送信された別のサーバー(HTTP基本認証を使用する)へのリクエストを処理するためにProxyServletがあります。実際に要求が発生する前にサーブレットが手動でヘッダーを追加します。資格情報を入力する必要があります。servletRequestにHttp基本認証を追加する

私はそれにアクセスしようとしたとき、私は動作するように見えるdoes notの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> 

この作品を作るための他の方法がありますが含まれていますか?

ありがとうございます!

答えて

1

解決策は、以下のように、getHeader(String name)getHeaders(String name)およびgetHeaderNames()のメソッドをオーバーライドすることでした。これは実装がヘッダをどのように探しているかにも依存します。この場合、ProxyServletEnumeration<String> 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); 

     } 

    }; 
関連する問題