前端网站是vue项目,用elementui组件,每次登陆失效之后都会主动弹出这样的窗口,请问怎么杜绝自动弹出?

如果这个弹窗 不是你自己写的,而是浏览器自带的,那么它很可能是 Basic Authentication(基本身份验证) 触发的。

为什么会弹出这个窗口?

浏览器会在访问 需要身份验证的 HTTP 资源 时,自动弹出这个对话框。这通常是因为:

  1. 后端服务器返回了 401 Unauthorized,并带有 WWW-Authenticate 头部,要求进行身份验证。
  2. 请求了受保护的资源(比如 API、静态资源等)。
  3. GitLab、Jenkins 等系统可能默认开启了 Basic Auth 认证

如何解决?

既然明白了是由于请求之后失效,后端返回了401,那么就想办法解决401问题:

1、后端处理,把401改成其他返回码,但是401本来就是后端的标识:访问无权限,所以这种办法虽然可行,但是改变后端的返回习惯;

2、前端获取401,然后改变提示方式或者跳转到登录页;

axios.interceptors.response.use(
  response => response,
  error => {
    if (error.response && error.response.status === 401) {
      console.warn("登录失效,重定向到登录页");
      // 这里不让它进入浏览器默认的身份认证弹窗
      return Promise.resolve({ data: "未授权" });
    }
    return Promise.reject(error);
  }
);

原理

  • axios 拦截所有响应,检查 401 错误。
  • Promise.resolve({ data: "未授权" })401 变成可控的错误,不让浏览器弹窗,而是让前端自己处理,比如跳转到登录页。

3、如果请求是 OPTIONS 预检请求

如果你的前端在跨域请求 API,并且后端返回 401,那么 浏览器可能会先发一个 OPTIONS 预检请求
如果 OPTIONS 响应 401,有时浏览器会直接弹出 Basic Auth 登录框。

解决方案 让后端 OPTIONS 请求不要返回 401,而是返回:

HTTP/1.1 200 OK
Access-Control-Allow-Origin: *
Access-Control-Allow-Methods: GET,POST,OPTIONS
Access-Control-Allow-Headers: Authorization,Content-Type

如果你无法修改后端,可以在 axios 里让 OPTIONS 请求自动返回:

myInterceptor.interceptors.request.use(function (config) {
    if (config.method.toUpperCase() === 'OPTIONS') {
        console.warn("拦截 OPTIONS 预检请求,防止触发 401");
        return Promise.resolve({ status: 200 });
    }
    return config;
}, function (error) {
    return Promise.reject(error);
});

(推荐)修改 Nginx 配置,去掉 WWW-Authenticate

浏览器弹窗是因为 后端返回了 WWW-Authenticate,可以在 Nginx 层面拦截并删除 WWW-Authenticate,避免浏览器自动触发 Basic Auth。

🔧 修改 nginx.conf

在 Nginx 配置 location 段落中,添加:

server {
    listen 80;
    server_name your-domain.com;

    location /api/ {
        proxy_pass http://backend-server;
        proxy_set_header Authorization "";  # 清空认证头
        proxy_hide_header WWW-Authenticate; # 隐藏后端返回的 Basic Auth 认证头
    }
}

然后重启 Nginx

nginx -s reload

📌 作用

  • proxy_set_header Authorization ""; 👉 清除浏览器自动发送的 Authorization 头,避免认证请求触发。
  • proxy_hide_header WWW-Authenticate; 👉 让后端返回 401不带 WWW-Authenticate,浏览器就不会弹窗。
推荐配置nginx;
 
 
 
posted on 2025-03-10 10:53  java先生  阅读(496)  评论(0)    收藏  举报