转发不会更改浏览器地址栏中的 URL

2022-09-04 07:26:17

我刚刚开始使用Servlets / JSP / JSTL,我有这样的东西:

<html>
<body>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<jsp:directive.page contentType="text/html; charset=UTF-8" />

<c:choose>
  <c:when test='${!empty login}'>
    zalogowany
  </c:when>
<c:otherwise>
   <c:if test='${showWarning == "yes"}'>
        <b>Wrong user/password</b>
    </c:if>
    <form action="Hai" method="post">
    login<br/>
     <input type="text" name="login"/><br/>
     password<br/>
     <input type="password" name="password"/>
     <input type="submit"/>
     </form>
  </c:otherwise>
</c:choose>
</body>
</html>

和在我的 doPost 方法

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException 
{
    HttpSession session=request.getSession();
    try
    {
        logUser(request);
    }
    catch(EmptyFieldException e)
    {
        session.setAttribute("showWarning", "yes");
    } catch (WrongUserException e) 
    {
        session.setAttribute("showWarning", "yes");
    }
    RequestDispatcher d=request.getRequestDispatcher("/index.jsp");
    System.out.println("z");
    d.forward(request, response);
}

但是有些东西不起作用,因为我想要这样的东西:

  1. 如果用户有活动会话并登录到系统“zalogowany”,则应显示
  2. 否则日志记录表单

问题是无论我做什么,那些转发都不会让我索引.jsp,它位于我的项目的根文件夹中,我仍然在我的地址栏中Projekt / Hai。


答案 1

如果这真的是你唯一的问题

问题是无论我做什么,那些转发都不会让我索引.jsp,它位于我的项目的根文件夹中,我仍然在我的地址栏中Projekt / Hai。

那么我不得不让你失望:这完全是规范。转发基本上告诉服务器使用给定的JSP来呈现结果。它不会告诉客户端在给定的 JSP 上发送新的 HTTP 请求。如果希望客户端的地址栏发生更改,则必须告诉客户端发送新的 HTTP 请求。您可以通过发送重定向而不是转发来执行此操作。

所以,而不是

RequestDispatcher d=request.getRequestDispatcher("/index.jsp");
System.out.println("z");
d.forward(request, response);

response.sendRedirect(request.getContextPath() + "/index.jsp");

另一种方法是完全删除URL并始终使用URL。您可以通过将 JSP 隐藏在文件夹中来实现此目的(以便最终用户永远无法直接打开它,并强制使用 servlet 的 URL),并实现 servlet 的 并显示 JSP:/index.jsp/Hai/WEB-INFdoGet()

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
}

这样,您只需打开 http://localhost:8080/Project/Hai 并查看JSP页面的输出,表单将只提交到完全相同的URL,因此浏览器地址栏中的URL基本上不会更改。我可能只会将 更改为更合理的东西,例如 ./Hai/login

另请参阅:


答案 2