你可以擺脫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。但這裏是基本SecureFilter:
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,則只需將路徑/資源映射:
router.attach("/secure", new SecureFilter(getContext(), HelloSecureResource.class));
router.attach("/secureWithRedirect", new SecureFilter(getContext(), HelloSecureResource.class, true));
這是罰款處理一個或兩個電話,但我的API有至少一個一打資源,所有這些資源至少接受一種方法(大部分接受更多)。我想在一個地方做這件事,而不是在我處理電話的任何地方。 – 2012-02-06 21:28:14
你知道RESTlet是否有全局攔截器/過濾器? – 2012-02-06 21:37:59
這就是我要找的。它有一個重定向器類,但我不知道如何使用它來實現我想要的。也許我可以使用「org.restlet.service.Service」,但是,再次,不清楚如何。 – 2012-02-06 23:30:38