2012-02-04 8 views
1

私はheroku上でSSLを使用したいRestletベースのアプリケーションを実行しています。私は基本的な "ピギーバック" sslオプションを有効にしているので、ssl接続を受け付けます。しかし、ユーザーがssl経由で接続した場合にのみ(実際にはおそらくすべての)URLが機能するようにしたいと思います。今のところ、私はHerokuがSSLをnon-ssl呼び出しに変換し、HTTP_X_FORWARDED_PROTOをhttpsに設定しているので、これをrestletで処理する必要があると思いますが、どうすればよいか分かりません。私はRedirectorクラスを見ていますが、このクラスを使ってこの問題を解決できるかどうかは私には分かりません。Heroku上でRestletを使用していくつかのURLにSSLを強制する方法

注:サーブレットコンテナを使用するGAEを使用して以前にアプリを実行していたため、web.xmlに「CONFIDENTIAL」と指定できました。

ありがとうございます!

答えて

2

あなたは、HTTPリクエストヘッダから情報を取得し、あなたがエラーを投げるか、リダイレクトするかどうかを決定することができます

Form requestHeaders = (Form) this.getRequest().getAttributes().get("org.restlet.http.headers"); 

    boolean secure = false; 
    if (requestHeaders.getValues("x-forwarded-proto") != null) { 
     secure = requestHeaders.getValues("x-forwarded-proto").contains("https"); 
    } 

はこれに拡大し、あなたが簡単に適用することができフィルタを作成することができますルート。完全なコード例はon GitHubです。

public class SecureFilter extends Filter { 

    private boolean doRedirect; 

    public SecureFilter(Context context, Restlet next) { 
     super(context); 
     doRedirect = false; 
     setNext(next); 
    } 

    public SecureFilter(Context context, Restlet next, boolean doRedirect) { 
     super(context); 
     this.doRedirect = doRedirect; 
     setNext(next); 
    } 

    public SecureFilter(Context context, Class<?> next) { 
     super(context); 
     doRedirect = false; 
     setNext(next); 
    } 

    public SecureFilter(Context context, Class<?> next, boolean doRedirect) { 
     super(context); 
     this.doRedirect = doRedirect; 
     setNext(next); 
    } 

    public boolean isDoRedirect() { 
     return doRedirect; 
    } 

    public void setDoRedirect(boolean doRedirect) { 
     this.doRedirect = doRedirect; 
    } 

    @Override 
    protected int beforeHandle(Request request, Response response) { 
     Form requestHeaders = (Form) request.getAttributes().get("org.restlet.http.headers"); 

     if ((requestHeaders.getValues("x-forwarded-proto") != null) && (requestHeaders.getValues("x-forwarded-proto").indexOf("https") != 0)) { 
      if (doRedirect) { 
       String target = "https://" + request.getHostRef().getHostDomain() + request.getResourceRef().getPath(); 
       Redirector redirector = new Redirector(getContext(), target, Redirector.MODE_CLIENT_SEE_OTHER); 
       redirector.handle(request, response); 
       return STOP; 
      } 
      else { 
       response.setStatus(Status.CLIENT_ERROR_FORBIDDEN); 
       return STOP; 
      } 
     } 

     return CONTINUE; 
    } 

} 

は、単にルート/リソースマッピングをラップ、SecureFilterを使用するには::しかし、ここでは基本的なSecureFilterある

router.attach("/secure", new SecureFilter(getContext(), HelloSecureResource.class)); 
    router.attach("/secureWithRedirect", new SecureFilter(getContext(), HelloSecureResource.class, true)); 
+0

これは、1つのまたは2つの通話を処理するための罰金ですが、私のAPIは、少なくとも持っています少なくとも1つの方法を受け入れています(ほとんどがより多くを受け入れます)。私はコールを処理するあらゆる場所ではなく、1か所でこれを実行したいと考えています。 –

+0

RESTletにグローバルなインターセプタ/フィルタがあるかどうか知っていますか? –

+0

これは私が探しているものです。それはリダイレクタクラスを持っていますが、私はそれを使って私が望むものを達成する方法を見ません。おそらく私は "org.restlet.service.Service"を使うことができますが、やはりどうしたらいいのかわかりません。 –

関連する問題