我做了以下步骤:
1) 通过keytool创建自签名证书
2) 在server.xml中配置8443端口连接器
3) 检查 localhost:8080 和 localhost:8433 是否都可以访问
4) 将以下安全约束添加到我的 web.xml
<security-constraint>
<web-resource-collection>
<web-resource-name>securedapp</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
当我转到 http://localhost:8080/MyApp/
时,没有重定向到 https://localhost:8443/MyApp/
。据我了解,对于传输保证为 secret 的 URL 使用 HTTP 的请求应该使用 HTTPS 自动重定向到相同的 URL。
但是,我的应用仍然可以访问,并且可以同时使用 HTTP 和 HTTPS。我正在使用 Tomcat 6.0.36。 我错过了什么?
提前致谢。
最佳答案
回答我自己的问题。
我发现此行为是由 HTTP 连接器的 secure
标志引起的。我之前出于测试目的设置它,然后忘记了。
当 HTTP 连接器具有 secure="true"
并且浏览器中没有现有的 JSESSIONID cookie 时:
- 对于 HTTP 请求,JSESSIONID 存储在一个 URL 中
- 对于 HTTPS 请求,JSESSIONID 存储在 cookie 中
- CONFIDENTIAL 传输保证不会导致重定向到 使用 HTTPS 的相同 URL
当 HTTP 连接器有 secure="false"
时:
- 如预期的那样,使用 HTTP 请求其传输保证的 URL 是 CONFIDENTIAL 会自动重定向到相同的 URL 使用 HTTPS
关于tomcat - 具有 secret 传输保证的 URL 仍然可以使用 HTTP 访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15932430/