あなたは、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));
これは、1つのまたは2つの通話を処理するための罰金ですが、私のAPIは、少なくとも持っています少なくとも1つの方法を受け入れています(ほとんどがより多くを受け入れます)。私はコールを処理するあらゆる場所ではなく、1か所でこれを実行したいと考えています。 –
RESTletにグローバルなインターセプタ/フィルタがあるかどうか知っていますか? –
これは私が探しているものです。それはリダイレクタクラスを持っていますが、私はそれを使って私が望むものを達成する方法を見ません。おそらく私は "org.restlet.service.Service"を使うことができますが、やはりどうしたらいいのかわかりません。 –