emt*_*t14 21 security https routing login playframework
我想为我的应用程序的登录页面强制执行https路由.
Play可以这样做吗!没有使用前端http服务器?
Ned*_*igg 21
您可以使用@Before拦截器重定向每个请求,即使用户直接键入http://也是如此.下面是我使用的代码(它在无容器play run运行时运行,或者在Heroku后端运行时).
public class HttpsRequired extends Controller {
/** Called before every request to ensure that HTTPS is used. */
@Before
public static void redirectToHttps() {
//if it's not secure, but Heroku has already done the SSL processing then it might actually be secure after all
if (!request.secure && request.headers.get("x-forwarded-proto") != null) {
request.secure = request.headers.get("x-forwarded-proto").values.contains("https");
}
//redirect if it's not secure
if (!request.secure) {
String url = redirectHostHttps() + request.url;
System.out.println("Redirecting to secure: " + url);
redirect(url);
}
}
/** Renames the host to be https://, handles both Heroku and local testing. */
@Util
public static String redirectHostHttps() {
if (Play.id.equals("dev")) {
String[] pieces = request.host.split(":");
String httpsPort = (String) Play.configuration.get("https.port");
return "https://" + pieces[0] + ":" + httpsPort;
} else {
if (request.host.endsWith("domain.com")) {
return "https://secure.domain.com";
} else {
return "https://" + request.host;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个适用于Java Play 2.1.1和Heroku的示例.
public class ForceHttps extends Action<Controller> {
// heroku header
private static final String SSL_HEADER = "x-forwarded-proto";
@Override
public Result call(Context ctx) throws Throwable {
final Result result;
if (Play.isProd() && !isHttpsRequest(ctx.request())) {
result = redirect("https://" + ctx.request().host()
+ ctx.request().uri());
}
else {
// let request proceed
result = this.delegate.call(ctx);
}
return result;
}
private static boolean isHttpsRequest(Request request) {
// heroku passes header on
return request.getHeader(SSL_HEADER) != null
&& request.getHeader(SSL_HEADER)
.contains("https");
}
}
Run Code Online (Sandbox Code Playgroud)
然后,对于要检查https的任何控制器,添加@With(ForceHttps.class).或者,如果您想要检查所有控制器,则添加一个类HttpsController extends Controller并让所有类扩展HttpsController.
例如
@With(ForceHttps.class)
public class HttpsController extends Controller {
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7323 次 |
| 最近记录: |