Нет описания
Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

mock.interceptor.ts 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. import { HttpInterceptorFn, HttpErrorResponse } from '@angular/common/http';
  2. import { inject } from '@angular/core';
  3. import { Router } from '@angular/router';
  4. import { catchError, throwError } from 'rxjs';
  5. import { ConfigService } from 'base-core';
  6. import { AuthService } from '../services/auth.service';
  7. export const MockInterceptor: HttpInterceptorFn = (req, next) => {
  8. const config = inject(ConfigService);
  9. const router = inject(Router);
  10. const authService = inject(AuthService);
  11. console.log(`拦截请求: ${req.method} ${req.url}`);
  12. console.log(`完整URL: ${req.urlWithParams}`);
  13. // 如果启用模拟数据且请求是API调用,可以在此拦截
  14. // 目前仅记录请求
  15. if (config.useMockData) {
  16. console.log(`Mock enabled for: ${req.url}`);
  17. }
  18. // 克隆请求以添加认证头
  19. let authReq = req;
  20. // 检查是否为公开端点(不需要认证)
  21. const isPublicEndpoint = req.url.includes('/login') || req.url.includes('/register');
  22. // 为需要认证的API请求添加Basic认证头(暂时禁用)
  23. if (req.url.includes('/api/') && !isPublicEndpoint) {
  24. console.log('API请求,添加默认认证头');
  25. const defaultBasicAuth = 'YWRtaW46MTIz'; // base64("admin:123")
  26. authReq = req.clone({
  27. setHeaders: {
  28. Authorization: `Basic ${defaultBasicAuth}`
  29. }
  30. });
  31. } else {
  32. console.log('公开端点或非API请求,不添加认证头');
  33. }
  34. return next(authReq).pipe(
  35. catchError((error: HttpErrorResponse) => {
  36. console.log(`请求错误: ${error.status} ${req.method} ${req.url}`);
  37. console.log('错误详情:', error.error);
  38. // 处理认证错误
  39. if (error.status === 401 || error.status === 403 ||
  40. (error.error && (error.error.error?.includes('认证') || error.error.error?.includes('缺少认证')))) {
  41. console.warn('认证失败,跳转到登录页面:', error.error);
  42. console.log('当前路由:', router.url);
  43. // 清除本地存储的认证信息
  44. authService.logout();
  45. // 跳转到登录页面,除非当前已经在登录页面
  46. if (!router.url.includes('/login')) {
  47. console.log('重定向到登录页面');
  48. router.navigate(['/login'], {
  49. queryParams: { returnUrl: router.url }
  50. });
  51. } else {
  52. console.log('已经在登录页面,不重定向');
  53. }
  54. }
  55. return throwError(() => error);
  56. })
  57. );
  58. };