Jsp 想要运行servlet并在登录失败时更改url吗
我已经在JSP中创建了一个登录页面,在该页面中,我只创建了一个表单,要求用户输入用户名和密码,并使用我称为servlet的Jsp 想要运行servlet并在登录失败时更改url吗,jsp,servlets,requestdispatcher,Jsp,Servlets,Requestdispatcher,我已经在JSP中创建了一个登录页面,在该页面中,我只创建了一个表单,要求用户输入用户名和密码,并使用我称为servlet的post方法。现在,如果登录失败,我想重新重定向到登录页面。为此,我可以做两件事: 使用请求分派器的转发方法,或 使用sendRedirect方法 在第一种情况下,我成功返回到登录页面,但URL仍然是servlet的URL(我不知道如何和为什么),在第二种情况下,我也得到了登录页面,但这次将重新生成请求对象(一个新的)。我不想要新的请求对象。我能做些什么?首先,重定向和转发实
post
方法。现在,如果登录失败,我想重新重定向到登录页面。为此,我可以做两件事:
转发
方法,或sendRedirect
方法李>
在第一种情况下,我成功返回到登录页面,但URL仍然是servlet的URL(我不知道如何和为什么),在第二种情况下,我也得到了登录页面,但这次将重新生成请求对象(一个新的)。我不想要新的请求对象。我能做些什么?首先,重定向和转发实际上是不同的动物,即使它们都会导致显示新页面:
- 转发只是在同一请求中将控制权传递给另一个servlet,所以浏览器中的URL不能更改
- 重定向返回一个特殊响应,要求浏览器向响应中传递的URL发出新请求
- 在URL中传递参数:不要重定向到
,而是重定向到/login
。这样,您可以测试此参数的存在性并相应地处理它/login?param=value
- 使用会话参数。您可以在登录前创建会话,只需在登录前不在此处设置任何用户id,成功登录后,您必须使以前的会话无效并创建一个新会话。后一种方式避免了在浏览器URL中显示参数,还允许任何(可序列化)对象,而不限于字符串
- 转发只是在同一请求中将控制权传递给另一个servlet,所以浏览器中的URL不能更改
- 重定向返回一个特殊响应,要求浏览器向响应中传递的URL发出新请求
- 在URL中传递参数:不要重定向到
,而是重定向到/login
。这样,您可以测试此参数的存在性并相应地处理它/login?param=value
- 使用会话参数。您可以在登录前创建会话,只需在登录前不在此处设置任何用户id,成功登录后,您必须使以前的会话无效并创建一个新会话。后一种方式避免了在浏览器URL中显示参数,还允许任何(可序列化)对象,而不限于字符串
- 我认为您应该分析您的请求流程。当您键入JSP页面的URL时,例如
http://localhost:8080/login.jsp
,浏览器向服务器发送一个GET
请求(比如Tomcat)。Tomcat找到JSP页面(不要看复杂的细节),解释它(因为它是一个JSP页面),然后将HTML页面发送回浏览器。就URL而言,没有任何变化:您请求了一个JSP页面,然后得到了它。URL保持在http://localhost:8080/login.jsp
浏览器显示的HTML是login.jsp所包含的内容:一个登录表单
提交登录表单时,会产生一个错误,并且由于您指定了(例如,在HTML表单的操作
参数中),浏览器会将表单数据的HTTP POST
发送到servlet的URL。此URL是您为其提供URL映射的内容,例如http://localhost:8080/login
。请注意,当您按下表单上的login
按钮时,浏览器更改了URL,向您(用户)指示它正在对servlet的URL执行HTTP POST
现在,如果您选择将此请求转发到其他地方,则URL不会被触及,因为作为程序员,您选择为发送到servlet的POST
请求提供服务(http://localhost:8080/login
)在您的Web应用程序的某些部分。返回的响应仅由浏览器显示,没有对URL的任何引用。这正是你让它做的。大概,您在forward
方法中解释了login.jsp
,并在返回的HTML中创建了登录表单。结果,您显示了登录表单,而URL仍然指向您的servlet。因此,在使用转发时,您需要了解转发对URL的影响
在登录失败的情况下,向login.jsp
发送重定向是正确的做法。再次遵循您请求的流程。失败的登录将在httppost
上处理到您的servlet URL。表单数据
无效(例如,密码错误),因此您的servlet代码应发送一个HTTP重定向
,以恢复正确的URL。这是因为当发送重定向时,实际发送的是一个带有位置
头的响应,该头告诉浏览器去获取该URL。由于您的位置
标题(在登录失败的情况下)将是JSP页面的标题(login.JSP
),因此URL将指向HTML表单的标题。现在,URL又开始有意义了
webapp中的三个作用域:请求作用域、会话作用域和应用程序作用域,顾名思义,请求作用域是每个HTTP请求的作用域。与请求范围关联的所有对象
都会为每个请求获取一个新值。这对于保持HTTP的无状态性质非常重要。我认为您应该分析请求流。当您键入JSP页面的URL时,例如http://localhost:8080/login.