| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 |
- import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';
- import { inject } from '@angular/core';
- import { Router } from '@angular/router';
- import { catchError, throwError } from 'rxjs';
- import { ConfigService } from 'base-core';
- import { AuthService } from '../services/auth.service';
-
- export const MockInterceptor: HttpInterceptorFn = (req, next) => {
- const config = inject(ConfigService);
- const router = inject(Router);
- const authService = inject(AuthService);
-
- console.log(`拦截请求: ${req.method} ${req.url}`);
- console.log(`完整URL: ${req.urlWithParams}`);
-
- // 如果启用模拟数据且请求是API调用,可以在此拦截
- // 目前仅记录请求
- if (config.useMockData) {
- console.log(`Mock enabled for: ${req.url}`);
- }
-
- // 克隆请求以添加认证头
- let authReq = req;
-
- // 检查是否为公开端点(不需要认证)
- const isPublicEndpoint = req.url.includes('/login') || req.url.includes('/register');
-
- // 为需要认证的API请求添加Basic认证头(暂时禁用)
- if (req.url.includes('/api/') && !isPublicEndpoint) {
- console.log('API请求,添加默认认证头');
- const defaultBasicAuth = 'YWRtaW46MTIz'; // base64("admin:123")
- authReq = req.clone({
- setHeaders: {
- Authorization: `Basic ${defaultBasicAuth}`
- }
- });
- } else {
- console.log('公开端点或非API请求,不添加认证头');
- }
-
- return next(authReq).pipe(
- catchError((error: HttpErrorResponse) => {
- console.log(`请求错误: ${error.status} ${req.method} ${req.url}`);
- console.log('错误详情:', error.error);
-
- // 处理认证错误
- if (error.status === 401 || error.status === 403 ||
- (error.error && (error.error.error?.includes('认证') || error.error.error?.includes('缺少认证')))) {
- console.warn('认证失败,跳转到登录页面:', error.error);
- console.log('当前路由:', router.url);
-
- // 清除本地存储的认证信息
- authService.logout();
-
- // 跳转到登录页面,除非当前已经在登录页面
- if (!router.url.includes('/login')) {
- console.log('重定向到登录页面');
- router.navigate(['/login'], {
- queryParams: { returnUrl: router.url }
- });
- } else {
- console.log('已经在登录页面,不重定向');
- }
- }
-
- return throwError(() => error);
- })
- );
- };
|