在Play!框架上强制使用SSL

21

我目前正在使用Play! 1.2.2和其新的Netty客户端框架。

虽然我可以异步地获取HTTP和HTTPS,但我还没有找到一个简单的方法来强制执行SSL。有没有任何使用过Play!的人知道一个简单的强制执行SSL的方法?我不确定是否需要创建重定向,或者这是否可以在conf文件中迅速解决。

2个回答

22

有几种方法可以强制使用SSL。

首先,您可以将所有操作设置为使用.secure()方法,例如:

<a href="@{Application.index.secure()}">index page</a>

或者,也可能是最好的方法,是通过前端HTTP服务器(如Apache、Nginx或Lighttpd)完成此操作。

前端HTTP服务器的基本思想是:您的应用程序在9000端口运行,但不可从外部网络访问。所有传入请求由HTTP处理,并配置为仅接受HTTPS。 HTTPS由HTTP服务器处理,然后将请求转发给Play。

这样可以使您的整个Play应用程序正常工作,而SSL则被卸载到另一个应用程序中。

这种方法也可以应用于负载均衡器,而不是HTTP服务器,但我猜大多数人会选择更便宜的HTTP服务器,除非在企业环境中运行。


非常有帮助,我很感谢考虑了多种方法。 - crockpotveggies

12
在控制器中,您可以检查request.secure是否为真,并执行重定向或返回403 /访问被拒绝。 您可以通过以下方式强制整个控制器使用SSL:
public static class ForceSSL extends Controller
{
    @Before
    static void verifySSL()
    {
        if (request.secure == false)
            redirect("https://" + request.host + request.url); 
    }
}

...并注释另一个控制器:

@With(ForceSSL.class)
public class Foo extends Controller
{
....
}

另请参阅 http://groups.google.com/group/play-framework/browse_thread/thread/7b9aa36be85d0f7b


1
如果使用 Heroku,此代码将会导致“Too Many Redirects”错误。请使用此处提供的相似代码:https://dev59.com/1Gs05IYBdhLWcg3wJurp - seePatCode

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接