1

我希望我的一些页面可以安全地打开。大多数这些页面都以名称“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 模式

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

然后它起作用了,但问题是这将打开 HTTPS 中的每个页面,我不希望它打开 HTTPS 中的所有页面。我只需要打开以“my_account_”开头的页面

我用玻璃鱼

4

1 回答 1

1

tldr; 根据规格,您<url-pattern>不会做您期望它做的事情。有关可能的解决方案,请参见下文。


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

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

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

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

根据这一点,您将/my_account_*属于LAST类别的映射(它不会/*以属于第一个类别结束)。这就是映射不起作用的原因。

你能做什么?

  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 来完成,但我建议不要这样做

于 2014-08-13T11:23:59.020 回答