该应用程序是一个简单的JSP / Servlet应用程序.我想执行用户身份验证(使用BASIC身份验证),如果用户通过身份验证,我将使用SSL(即https)将它们重定向到主屏幕.必须在单击按钮时执行BASIC身份验证.
为了达到这个目的;最初我在我的web.xml中配置了BASIC身份验证,如下所示:
<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 Authentcation部分工作正常(弹出对话框出现询问用户名和密码,它工作正常)
然后我按照以下步骤配置SSL:
1)使用keytool生成密钥库
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)我被重定向到一个带有https的链接(是的,https中出现的https)和GET,并且servlet的doGet()方法被执行,这是不正确的,因为提交按钮表单是这样的,henc 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>
解决方法:
在获取/转换后,如果我正确理解您的方案,您将遇到经典的HTTP重定向“问题”.
当使用非SSL请求访问SSL安全性约束时,服务器将客户端HTTP 302响应(也称为重定向)发送到https URL.
此重定向的实现在所有客户端HTTP堆栈上并不完全相同,但基本上大多数情况下,重定向是通过发出GET来处理的,无论原始HTTP动词是什么(POST或其他).
您可以在维基百科及其链接上找到关于此的许多讨论
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等).