You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录成功后如何正确重定向?HTTPOnly Cookie认证问题修复

登录认证跳转逻辑修复

问题描述

使用HTTPOnly Cookie进行用户认证,期望登录成功后从登录页重定向至首页,但目前代码在输入错误用户名或密码时,页面仍会跳转到首页且用户未登录,需要修改代码实现仅凭证正确时跳转。

原Login.jsx代码

function Login({ onUpdateUser }) {
  const [formData, setFormData] = useState({
    username: "",
    password: "",
  });

  const navigate = useNavigate();

  function handleChange(e) {
    setFormData({ ...formData, [e.target.name]: e.target.value });
  }

function handleSubmit(e) {
    e.preventDefault();
     fetch("http://localhost:3000/api/v1/login", {
      method: "POST",
      credentials: "include",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(formData),
    })
     .then((r) => {
        if (!r.ok) throw Error("Incorrect username or password!")
        .then(navigate('/login'))
      })
      .then((user) => onUpdateUser(user))
      .then(navigate('/'))
  }
}

修复方案及修改后代码

问题出在Promise链式调用逻辑错误:错误抛出后未被正确捕获,且跳转首页的操作位于链式末尾,无论请求成败都会执行。修改时需将成功后的操作放在响应正常的分支内,错误时捕获并阻止跳转。

function Login({ onUpdateUser }) {
  const [formData, setFormData] = useState({
    username: "",
    password: "",
  });
  const [errorMsg, setErrorMsg] = useState(""); // 新增状态存储错误提示

  const navigate = useNavigate();

  function handleChange(e) {
    setFormData({ ...formData, [e.target.name]: e.target.value });
  }

  function handleSubmit(e) {
    e.preventDefault();
    setErrorMsg(""); // 提交前清空旧错误提示
    fetch("http://localhost:3000/api/v1/login", {
      method: "POST",
      credentials: "include",
      headers: {
        "Content-Type": "application/json",
      },
      body: JSON.stringify(formData),
    })
    .then((r) => {
      if (!r.ok) throw new Error("Incorrect username or password!");
      return r.json(); // 解析响应体获取用户数据
    })
    .then((user) => {
      onUpdateUser(user);
      navigate('/'); // 仅登录成功时跳转首页
    })
    .catch((err) => {
      setErrorMsg(err.message); // 在登录页显示错误提示
      // 错误时停留在登录页,不执行跳转
    });
  }

  return (
    <form onSubmit={handleSubmit}>
      {/* 表单输入组件(如用户名、密码输入框) */}
      {errorMsg && <p style={{color: 'red'}}>{errorMsg}</p>}
      <button type="submit">登录</button>
    </form>
  );
}

修改要点说明

  • 修正错误抛出后的链式调用逻辑,将错误捕获移至catch方法中,避免错误分支的代码嵌套混乱
  • 仅在请求响应正常、获取到用户数据后,才执行更新用户状态和跳转首页的操作
  • 新增错误提示状态,在登录页展示错误信息,提升用户体验
  • 提交表单前清空错误提示,避免旧提示干扰新的登录操作

内容的提问来源于stack exchange,提问作者AndresM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 08:01:42