2
  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Common pages</web-resource-name>
      <url-pattern>/test1.html</url-pattern>
      <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>MY_GROUP</role-name>
    </auth-constraint>
  </security-constraint>

正如预期的那样,有了这个约束,页面 /test1.html 需要认证,而页面 /test2.html 不需要认证。

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Common pages</web-resource-name>
      <url-pattern>/*</url-pattern>
      <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>MY_GROUP</role-name>
    </auth-constraint>
  </security-constraint>

正如预期的那样,有了这个约束,所有页面都需要认证,包括/test2.html。

  <security-constraint>
    <web-resource-collection>
      <web-resource-name>Common pages</web-resource-name>
      <url-pattern>/</url-pattern>
      <url-pattern>/test1.html</url-pattern>
      <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint>
      <role-name>MY_GROUP</role-name>
    </auth-constraint>
  </security-constraint>

有了这个约束,我希望页面 /test1.html 和 / 需要身份验证,但页面 /test2.html 不需要身份验证。

然而,事实证明 /test2.html 也需要身份验证。

问题 1. 这正常吗?为什么会这样?

问题2. url-pattern“/”等价于“/*”的规范中哪里写到了?Java Servlet 规范 2.5:http: //goo.gl/UxoPL

问题 3. 如何判断根页面“/”需要认证,而其他页面不需要?

ps:我使用的是jboss-eap-4.3。

4

1 回答 1

2

/是一个特殊的 URL 模式,它匹配所有与同一个 webapp 中任何更具体的 servlet URL 模式/app/*匹配的东西,比如,*.do等。它是,比如说,“默认 servlet”。默认情况下,这是由 servletcontainer 自己的默认 servlet 处理的,通常用于静态资源,例如普通的 HTML/CSS/JS/图像文件,不会调用任何 webapp 自己的 servlet。例如 Tomcat 就有DefaultServlet这个用途。

/*是一个过于通用的 URL 模式,它匹配所有内容,包括“默认 servlet”请求。此 URL 模式通常仅由过滤器使用,而不由 servlet 使用。否则,您将不得不重新设计 servletcontainer 自己的默认 servlet 来处理静态文件,例如普通的 HTML/CSS/JS/图像文件。

至于您的具体功能要求,您需要指定一个欢迎文件/

<welcome-file-list>
    <welcome-file>index.html</welcome-file>
</welcome-file-list>

然后/index.html改为使用安全约束 URL 模式。

于 2012-05-19T17:45:48.587 回答