Jsp 想要运行servlet并在登录失败时更改url吗

Jsp 想要运行servlet并在登录失败时更改url吗,jsp,servlets,requestdispatcher,Jsp,Servlets,Requestdispatcher,我已经在JSP中创建了一个登录页面,在该页面中,我只创建了一个表单,要求用户输入用户名和密码,并使用我称为servlet的post方法。现在,如果登录失败,我想重新重定向到登录页面。为此,我可以做两件事: 使用请求分派器的转发方法,或 使用sendRedirect方法 在第一种情况下,我成功返回到登录页面,但URL仍然是servlet的URL(我不知道如何和为什么),在第二种情况下,我也得到了登录页面,但这次将重新生成请求对象(一个新的)。我不想要新的请求对象。我能做些什么?首先,重定向和转发实

我已经在JSP中创建了一个登录页面,在该页面中,我只创建了一个表单,要求用户输入用户名和密码,并使用我称为servlet的
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.