3

该应用程序是一个简单的 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 Authentcation 部分运行良好(弹出对话框要求输入用户名和密码,并且运行良好)

然后我按照以下步骤配置 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)点击按钮(必须执行基本认证),认证对话框没有出现(出现基本认证要求输入用户名和密码)

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>
4

2 回答 2

3

在获取/发布转换时,如果我正确理解了您的情况,您将遇到经典的 HTTP 重定向“问题”。

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

您可以在 wikipedia 及其链接 http://en.wikipedia.org/wiki/HTTP_302上找到许多关于此的讨论, 另请参阅Response.Redirect with POST 而不是 Get?HTTP:POST 请求收到 302,重定向请求应该是 GET 吗?进行讨论。或者通常在谷歌上,“HTTP 302 POST”。

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

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

于 2013-03-06T18:50:25.190 回答
2

我发现有两个主要问题,
1)基本身份验证没有出现在点击
2)点击 doGet 而不是 doPost

让我们一步一步地创建这个应用程序.....
1) 创建 2 个 jsp 和 1 个 servlet。

index.jsp
<form action="RegisterServlet" method="post">
<input type="submit" name="submit">
</form>
RegisterServlet.java
doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/welcome.jsp");
dispatcher.forward(request,response);
}

2) 应用基本认证
web.xml
<security-constraint>
<web-resource-collection>
<web-resource-name>BasicAuth</web-resource-name>
<url-pattern>/RegisterServlet</url-pattern>
<http-method>POST</http-method>
<http-method>GET</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>Admin</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>Basic Authentication</realm-name>
</login-config>
<security-role>
<description>Admin Role</description>
<role-name>Admin</role-name>
</security-role>


**我已经为 RegisterServlet 提供了基本身份验证。这将在 index.jsp 的表单提交上启用基本身份验证。<http-method>GET</http-method>也添加



在tomcat-users.xml中创建角色和用户
<role rolename="Admin"/>
<user username="Admin" password="password" roles="Admin"/>



3) web.xml 中的以下代码, <user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
user-data-constraint 如果调用表单 http 到 https,它将调用 GET,因为它被认为是一种不好的做法,所以要调用 POST,在行动中,你可以提供一个完整的路径(url)....或从 https 资源访问 https。

于 2013-03-06T11:17:47.163 回答