前端网站是vue项目,用elementui组件,每次登陆失效之后都会主动弹出这样的窗口,请问怎么杜绝自动弹出?
如果这个弹窗 不是你自己写的,而是浏览器自带的,那么它很可能是 Basic Authentication(基本身份验证) 触发的。
为什么会弹出这个窗口?
浏览器会在访问 需要身份验证的 HTTP 资源 时,自动弹出这个对话框。这通常是因为:
后端服务器返回了 401 Unauthorized,并带有 WWW-Authenticate 头部,要求进行身份验证。
请求了受保护的资源(比如 API、静态资源等)。
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;