安全约束不会通过HTTPS打开页面

时间:2014-08-13 08:15:49

标签: java-ee https security-constraint

我想要安全地打开一些页面。大部分页面都是 以名称" my_Account _"

开头

例如,其中一个页面是" my_account_add_credit_card.xhtml"

为了做到这一点,我已将下面的代码放入web.xml

<security-constraint>
    <web-resource-collection>           
        <web-resource-name>my account</web-resource-name>
        <description>my account</description>
        <url-pattern>/my_account_*</url-pattern>
    </web-resource-collection>  
    <user-data-constraint>
        <description/>
        <transport-guarantee>CONFIDENTIAL</transport-guarantee>
    </user-data-constraint>
</security-constraint>

但它不起作用。我也改变了如下的网址格式

<url-pattern>/*</url-pattern>

然后它工作但问题是这将打开每一页 HTTPS,我不希望它在HTTPS中打开所有页面。我只需要 打开以&#34; my_account _&#34;

开头的页面

我正在使用glassfish

1 个答案:

答案 0 :(得分:1)

tldr; 根据规范,您的<url-pattern>没有达到预期的效果。请参阅下面的可能解决方案。


在Servlet 3.0规范的第13.8.3节处理请求中(在“安全性”一章下),它描述了如何选择请求的安全性约束:

  

当Servlet容器收到请求时,它应使用中描述的算法   第95页的“使用URL路径”选择在urlpattern上定义的约束(如果有)   这是与请求URI的最佳匹配。

上面指出的部分描述了URL的匹配方式。但是,特别是在12.2节中,指定了映射:

  
      
  • 字符串以'/'字符开头,后缀'/ *'后缀用于   路径映射。
  •   
  • 以'*。'前缀开头的字符串用作扩展名映射。
  •   
  • 仅包含'/'字符的字符串表示该字符串的“默认”servlet   应用。在这种情况下,servlet路径是请求URI减去上下文路径   并且路径信息为空。
  •   
  • 所有其他字符串仅用于完全匹配。
  •   

根据这一点,/my_account_*的映射属于最后类别(它不会以/*结尾而落入第一个类别)。这就是映射不起作用的原因。

你能做什么?

  1. 我建议更改目录布局而不是(例如)

    /my_account_file1.jsp
    /my_account_file2.jsp
    

    制作目录并将这些文件放入其中:

    /my_account/
        file1.jsp
        file2.jsp
    

    映射应该成为:

    <url-pattern>/my_account/*</url-pattern>
    
  2. 您可以使用第三方安全库,如Spring Security,Apache Shiro或JBoss Picketlink。

  3. 您可以向/*添加过滤器并以编程方式强制执行安全性(不,不要自己动手,请参见第2点,此处仅包括完整性 )。使用servlet可以实现类似的方法,但我建议反对