如何实现JSP页面重定向?附LoginServlet代码片段
在LoginServlet中实现JSP页面重定向的方法
嘿,针对你的LoginServlet代码,我给你梳理两种常用的JSP页面重定向实现方式,你可以根据业务场景灵活选择:
1. 客户端重定向(sendRedirect)
这种方式会让浏览器发起一个全新的HTTP请求,地址栏会显示目标页面的URL,非常适合登录成功后跳转到主页这类需要用户感知页面变化的场景。
你可以补全Servlet的请求处理方法,像这样实现:
package servlets; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; public LoginServlet() { super(); } // 登录请求一般用POST处理,重写doPost方法 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 模拟登录验证逻辑 String username = request.getParameter("username"); String password = request.getParameter("password"); if ("admin".equals(username) && "123456".equals(password)) { // 登录成功,重定向到主页index.jsp response.sendRedirect("index.jsp"); } else { // 登录失败,重定向回登录页并携带错误标识 response.sendRedirect("login.jsp?error=invalid"); } } // 如果需要支持GET请求,直接复用POST逻辑 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } }
小提示:sendRedirect里的相对路径是基于Web应用根目录的,要是想跳转到外部网站,直接写完整URL就行。
2. 服务器端转发(forward)
这是服务器内部的跳转行为,浏览器地址栏不会发生变化,还能通过request对象传递数据(比如错误提示文本),特别适合登录失败后返回登录页并显示详细错误的场景。
示例代码如下:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); if (!"admin".equals(username) || !"123456".equals(password)) { // 把错误信息存入request,转发回登录页 request.setAttribute("loginError", "用户名或密码输入错误,请重试"); request.getRequestDispatcher("login.jsp").forward(request, response); return; } // 登录成功,转发到主页 request.getRequestDispatcher("index.jsp").forward(request, response); }
之后在login.jsp里可以用EL表达式取出错误信息展示:
<c:if test="${not empty loginError}"> <p style="color: red; font-size: 14px;">${loginError}</p> </c:if>
注意:转发的相对路径是基于当前Servlet的位置,也可以用绝对路径(以/开头,代表Web应用根目录),比如request.getRequestDispatcher("/login.jsp").forward(...)。
两种方式的核心区别
sendRedirect:客户端跳转,产生两次HTTP请求,地址栏更新,无法通过request传递数据;forward:服务器端跳转,仅一次HTTP请求,地址栏不变,可通过request传递临时数据。
你可以根据自己的需求选对应的实现方式~
内容的提问来源于stack exchange,提问作者Neo Cortex




