You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何实现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

火山引擎 最新活动