如果登录失败,则要运行servlet并更改URL

时间:2016-03-28 13:35:43

标签: jsp servlets requestdispatcher

我在JSP中创建了一个Login页面,我在其中创建了一个表单,询问用户的用户名和密码,并使用post方法调用servlet。现在如果登录失败,我想再次重定向到登录页面。为此,我可以做两件事:

  1. 使用请求调度程序的forward方法,或
  2. 使用sendRedirect方法。
  3. 在第一种情况下,我成功回到登录页面,但是URL仍然是servlet(我不知道如何以及为什么),在第二种情况下,我也获得了登录页面,但是这个请求对象将被重新生成的时间(一个新的)。我不想要一个新的请求对象。我该怎么办?

2 个答案:

答案 0 :(得分:2)

首先,重定向和前进是真正不同的动物,即使两者都导致显示新页面:

  • 转发只是将控制传递给同一请求中的另一个servlet,因此浏览器中的URL无法更改
  • 重定向返回一个特殊响应,要求浏览器向响应中传递的URL发出新请求

无论如何,这是一个常见的用例,有两种常用的方法可以使用重定向来解决它:

  • 在网址中传递参数:而不是重定向到/login,重定向到/login?param=value。这样,您可以测试此参数是否存在并相应地处理它
  • 使用会话参数。您可以在登录前创建会话,您只需在登录前不设置任何用户ID,并且在成功登录后您必须使之前的会话无效并创建一个新会话。后一种方法避免在浏览器URL中显示参数,也允许任何(Serializable)对象,而不是限制为字符串。

答案 1 :(得分:0)

我认为您应该分析您的请求流程。当您输入JSP页面的URL时,例如http://localhost:8080/login.jsp,您的浏览器会向您的服务器发送GET请求(例如Tomcat)。 Tomcat找到JSP页面(不要查看复杂的细节),解释它(因为它是一个JSP页面)并将HTML页面发送回浏览器。就URL而言,没有任何变化:你要求一个JSP页面,然后你就可以找回它。该网址仍为http://localhost:8080/login.jsp

浏览器显示的HTML是login.jsp包含的内容:登录表单。

登录表单在提交时会生成standard HTTP POST behavior,并且自您指定(例如在HTML表单的action参数中)后,浏览器会执行HTTP POST表单数据到您的servlet的URL。此网址是您为其提供的网址映射,例如http://localhost:8080/login。请注意,当您按下表单上的login按钮时,浏览器会更改URL,向用户表明它正在对servlet的URL执行HTTP POST

现在,如果您选择forward此请求到其他位置,则URL不会受到影响,因为您作为程序员选择提供发送到您的servlet的POST请求({{1}在你的webapp的某些部分。返回的响应只是由浏览器显示,而不会引用任何URL。这正是你告诉它要做的。据推测,您解释了http://localhost:8080/login方法中的login.jsp,并在返回的HTML中创建了登录表单。结果,您显示了登录表单,而URL仍然指向您的servlet。因此,在使用转发时,您需要了解转发的URL影响。

如果失败登录,发送重定向到forward将是正确的做法。再次按照您的请求流程。失败的登录将在login.jsp处理到您的servlet URL。 HTTP POST无效(例如密码错误),因此您的servlet代码应发送form data,以恢复正确的网址。这是因为当发送重定向时,实际发送的是带有HTTP Redirect标头的HTTP 302响应,该标头告诉浏览器获取该URL。由于您的Location标头(如果登录失败)将是您的JSP页面(Location)的标头,则URL将指向HTML表单的URL。现在网址又开始变得有意义了。

在webapp中的三个范围中:请求范围,会话范围和应用程序范围,顾名思义,请求范围是每个HTTP请求。与请求范围关联的所有login.jsp都会为每个请求获取一个新值。这对于保持HTTP的无状态特性非常重要。