gpt4 book ai didi

java - 如何在 Heroku 上使用 reSTLet 在某些 URL 上强制使用 SSL

转载 作者:太空宇宙 更新时间:2023-11-03 13:18:53 25 4
gpt4 key购买 nike

我有一个在 heroku 上运行的基于 reSTLet 的应用程序,我想使用 SSL。我已经启用了基本的“piggyback”ssl 选项,所以它接受 ssl 连接——差不多了!但是,我希望某些(实际上,可能是全部)URL 仅在用户通过 ssl 连接时才有效。现在(有人告诉我)Heroku 将 SSL 转换为非 SSL 调用并将 HTTP_X_FORWARDED_PROTO 设置为 https,所以我想我需要在 reSTLet 中处理这个问题,但我不确定如何处理。我看到了 Redirector 类,但我不清楚是否可以使用该类来解决这个问题。

注意:我之前使用 GAE 运行我的应用程序,它使用 servlet 容器,因此我可以在 web.xml 中指定“CONFIDENTIAL”。

谢谢!

最佳答案

您可以从 HTTP 请求 header 中获取信息,然后决定是否要抛出错误或重定向:

    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));

关于java - 如何在 Heroku 上使用 reSTLet 在某些 URL 上强制使用 SSL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9145186/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com