我想要安全地打开一些页面。大部分页面都是 以名称" 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
答案 0 :(得分:1)
tldr; 根据规范,您的<url-pattern>
没有达到预期的效果。请参阅下面的可能解决方案。
在Servlet 3.0规范的第13.8.3节处理请求中(在“安全性”一章下),它描述了如何选择请求的安全性约束:
当Servlet容器收到请求时,它应使用中描述的算法 第95页的“使用URL路径”选择在urlpattern上定义的约束(如果有) 这是与请求URI的最佳匹配。
上面指出的部分描述了URL的匹配方式。但是,特别是在12.2节中,指定了映射:
- 字符串以'/'字符开头,后缀'/ *'后缀用于 路径映射。
- 以'*。'前缀开头的字符串用作扩展名映射。
- 仅包含'/'字符的字符串表示该字符串的“默认”servlet 应用。在这种情况下,servlet路径是请求URI减去上下文路径 并且路径信息为空。
- 所有其他字符串仅用于完全匹配。
根据这一点,/my_account_*
的映射属于最后类别(它不会以/*
结尾而落入第一个类别)。这就是映射不起作用的原因。
我建议更改目录布局而不是(例如)
/my_account_file1.jsp
/my_account_file2.jsp
制作目录并将这些文件放入其中:
/my_account/
file1.jsp
file2.jsp
映射应该成为:
<url-pattern>/my_account/*</url-pattern>
您可以使用第三方安全库,如Spring Security,Apache Shiro或JBoss Picketlink。
您可以向/*
添加过滤器并以编程方式强制执行安全性(不,不要自己动手,请参见第2点,此处仅包括完整性 )。使用servlet可以实现类似的方法,但我建议反对。