【问题标题】:How to force only one page to open with SSL?如何强制只使用 SSL 打开一页?
【发布时间】:2011-05-11 03:23:22
【问题描述】:

在我的项目中,我使用 SSL,但它适用于所有页面。我只想将它用于登录页面,在该页面之后它应该恢复为 HTTP 协议。我怎样才能做到这一点?我在下面找到了一种方法,但它不起作用。

    <security-constraint>
    <web-resource-collection>
        <web-resource-name>Notify page, accessed internally by application</web-resource-name>
        <url-pattern>/Login.xhtml</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Entire Site</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <user-data-constraint>
        <transport-guarantee>NONE</transport-guarantee>
    </user-data-constraint>
</security-constraint>

我的项目是一个 JSF 2.0 项目,我使用的是 Eclipse Helios 和 Tomcat 7.0。

谢谢。

【问题讨论】:

    标签: jsf login https jsf-2 facelets


    【解决方案1】:

    这是不可能的。当会话由 HTTPS 请求创建时,它不适用于 HTTP 请求。最好的办法是在登录期间自己创建一个非安全 cookie,并通过它来维护登录。

    Map<String, Object> properties = new HashMap<String, Object>();
    properties.put("secure", false);
    externalContext.addResponseCookie(name, value, properties);
    

    但是再想一想,那么 HTTPS 登录的意义何在?如果您在 HTTPS 之后返回 HTTP 并且希望用户保持登录状态,那么您需要将会话 cookie 设置为不安全。这样,黑客仍然可以嗅探 cookie 中的会话 ID 以进行session fixation hack。通过 HTTPS 登录只能防止黑客了解实际的用户名/密码,但一旦黑客在 cookie 中计算出会话 ID,这将不再有任何意义。

    我会说,忘记开关并在登录后一直坚持使用 HTTPS。

    【讨论】:

    • 感谢您的有用回答。我想在登录后在 HTTP 和 HTTPS 之间切换,因为我使用的是 Primefaces,它的一些组件(例如文件上传器)在 HTTPS 时会出错。我不知道为什么,但它正在发生,为此我只想将 SSL 设置为登录页面。如果您能就 Primefaces 错误提供帮助,那当然很棒。
    • 提出新问题或将此问题报告给 PrimeFaces。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    • 2013-11-03
    • 1970-01-01
    • 2013-03-31
    相关资源
    最近更新 更多