gpt4 book ai didi

java - Tomcat 6.0 中的基本身份验证和 SSL 配置失败

转载 作者:数据小太阳 更新时间:2023-10-29 02:24:15 24 4
gpt4 key购买 nike

该应用程序是一个简单的 JSP/Servlet 应用程序。我想执行用户身份验证(使用 BASIC 身份验证),如果用户通过身份验证,那么我将使用 SSL(即 https)将他们重定向到主屏幕。 基本身份验证必须在单击按钮时执行。

为了实现这个目标;最初我在我的 web.xml 中配置了基本身份验证,如下所示:

<security-role>
<role-name>Admin</role-name>
</security-role>
<security-role>
<role-name>Guest</role-name>
</security-role>
<security-constraint>
<web-resource-collection>
<web-resource-name>BasicDemo</web-resource-name>
<url-pattern>/*</url-pattern>
<http-method>POST</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
</login-config>

代码的用户 BASIC Authentication 部分完美运行(出现弹出对话框询问用户名和密码并且运行正常)

然后我按照以下步骤配置了 SSL:

1) 使用keytool生成Keystore

2) 在 server.xml 中添加了以下条目:

<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
maxThreads="150" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="${user.home}/.keystore"
keystorePass="password" />

3) 在

的 web.xml 中添加了这个
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>

在运行应用程序时,以下是我遇到的问题:

1) 单击按钮(必须执行 BASIC 身份验证)时,没有出现身份验证对话框(BASIC 身份验证出现时要求输入用户名和密码)

2) 我被重定向到带有 GET 的 https 链接(是的,https 出现在 url 中)并且执行了 servlet 的 doGet() 方法,这是不正确的,因为提交按钮表单是这样的,所以 doPost应该执行方法而不是 doGet:

<form action="CentralController" method="post">

我这边的一个错误可能是使用 POST 而不是 GET 进行身份验证,但我仍然觉得这应该有效,我可能遗漏了一些东西,因此它不起作用。请让我知道问题出在哪里以及如何解决它以达到我的预期。

编辑

web.xml 中的 Servlet 定义

 <servlet>
<servlet-name>CentralController</servlet-name>
<servlet-class>com.controller.CentralController</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CentralController</servlet-name>
<url-pattern>/CentralController</url-pattern>
</servlet-mapping>

这是表格:

<form action="CentralController" method="post">
<input type="submit" value="Submit" name="submit">
</form>

最佳答案

关于 get/post 转换,如果我正确理解您的场景,您遇到的是典型的 HTTP 重定向“问题”。

当使用非 SSL 请求达到 SSL 安全约束时,服务器会向客户端发送 HTTP 302 响应(也称为重定向)到 https URL。此重定向的实现在所有客户端 HTTP 堆栈上并不完全相同,但基本上大多数时候,无论原始 HTTP 动词是什么(POST 或其他),重定向都是通过发出 GET 来处理的。

您可以在维基百科及其链接上找到很多关于此的讨论 http://en.wikipedia.org/wiki/HTTP_302另见 Response.Redirect with POST instead of Get?HTTP: POST request receives a 302, should the redirect-request be a GET?进行讨论。或者一般在谷歌上,“HTTP 302 POST”。

可悲的结论是,您不能指望在发送(在您的情况下为 HTTP 到 HTTPS)重定向时保留原始请求的 POST 性质,这将取决于浏览器,并且有许多浏览器无论重定向状态代码(302、307 等)如何,都会发出 GET。

您可能仍想尝试上面第一个链接中所述的解决方法。

关于java - Tomcat 6.0 中的基本身份验证和 SSL 配置失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054291/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com