我在JSP中创建了一个Login页面,我在其中创建了一个表单,询问用户的用户名和密码,并使用post
方法调用servlet。现在如果登录失败,我想再次重定向到登录页面。为此,我可以做两件事:
forward
方法,或sendRedirect
方法。 在第一种情况下,我成功回到登录页面,但是URL仍然是servlet(我不知道如何以及为什么),在第二种情况下,我也获得了登录页面,但是这个请求对象将被重新生成的时间(一个新的)。我不想要一个新的请求对象。我该怎么办?
答案 0 :(得分:2)
首先,重定向和前进是真正不同的动物,即使两者都导致显示新页面:
无论如何,这是一个常见的用例,有两种常用的方法可以使用重定向来解决它:
/login
,重定向到/login?param=value
。这样,您可以测试此参数是否存在并相应地处理它答案 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的无状态特性非常重要。