路由拦截器

该代码段展示了如何使用Axios库设置请求和响应拦截器来处理Token。在请求拦截器中,首先从Cookie获取Token,如果未找到则尝试获取Token,若获取失败则刷新页面。响应拦截器处理了状态码为200但无data.status的情况,并在数据请求失败且状态码不为0时处理Token过期情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import Cookies from 'js-cookie';
import axios from 'axios';
import { getToken } from './token';

// const { CancelToken } = axios;

// 初始化配置
const http = axios.create({
  baseURL: '/api',

});
// // 请求拦截器
http.interceptors.request.use(
  (config) => {
    const token = Cookies.get('token');

    if (config.token !== false && !token) {
      // let cancel;
      // const nextConfig = { ...config };
      // eslint-disable-next-line no-param-reassign
      // config.cancelToken = new CancelToken((c) => {
      //   cancel = c;
      // });
      // 缺少 Token,请求取消
      // cancel();
      // 预请求 token,绕过 iways 登录
      // getToken(http).then(() => http(nextConfig));

      getToken(http).then(() => window.location.reload());
    }

    // 注入 token
    // eslint-disable-next-line no-param-reassign
    config.headers.token = token;
    // config.headers.token = "token";

    // 注入请求数据
    // eslint-disable-next-line no-param-reassign
    config.data = { data: config.data };
    // 由于广本接口结构不统一,屏蔽掉这里

    return config;
  },
  (error) => Promise.reject(error),
);

// // 响应拦截器
http.interceptors.response.use(
  (response) => {
    let { status, data } = response;

    // 二进制流文件
    if (status === 200 && !data.status) return response;

    ({ status: { status }, data } = data);

    // 数据请求失败
    if (status !== 0) {
      // Token 过期重刷
      // eslint-disable-next-line prefer-promise-reject-errors
      return Promise.reject({ response: response.data.status });
    }

    // 成功并返回数据
    return data || {};
  },
  (error) => {
    // 因无 Token 而取消的请求不抛出错误
    if (axios.isCancel(error)) {
      return undefined;
    }

    if (error.response) {
      return Promise.reject(new Error(`Http ${error.message}`));
    }

    return Promise.reject(error);
  },
);

export default http;

### Solon 框架中的路由拦截器 Solon 是一种现代化的应用开发框架,相较于传统的 Spring Boot 和 Spring Cloud,在启动速度、QPS 性能以及运行时资源占用方面有显著优势[^4]。 #### 创建自定义拦截器 为了创建并使用路由拦截器,首先需要编写一个实现了 `Handler` 接口的类。这个类负责处理请求前后的逻辑操作: ```java import org.noear.solon.core.Handler; import org.noear.solon.SolonApp; public class MyInterceptor implements Handler { @Override public void handle(SolonApp app, Context ctx, Handle next) throws Throwable { System.out.println("Before request processing..."); // 继续执行下一个处理器 next.handle(ctx); System.out.println("After request processed."); } } ``` 上述代码展示了如何通过重写 `handle()` 方法来设置预处理和后处理逻辑[^1]。 #### 注册全局拦截器 为了让所有的 HTTP 请求都经过该拦截器,可以在应用程序入口处注册它: ```java import org.noear.solon.Solon; import org.noear.solon.annotation.Inject; public class App { @Inject private static final MyInterceptor myInterceptor = null; public static void main(String[] args) { Solon.start(App.class, args, app -> { app.before(myInterceptor::handle); }); } } ``` 这里利用了 `app.before()` 函数将之前编写的拦截器实例绑定到了整个应用生命周期上[^2]。 #### 条件性应用拦截器 如果希望仅针对特定路径或条件触发拦截行为,则可以通过正则表达式或其他方式筛选目标 URL: ```java // 只匹配 /api 开头的URL if (ctx.pathNew().startsWith("/api")) { // 执行拦截逻辑... } // 或者基于其他业务规则判断是否应该调用拦截器 boolean shouldIntercept = someBusinessLogic(); if (shouldIntercept) { // 执行拦截逻辑... } ``` 这种方式允许更加灵活地控制哪些请求会被拦截下来做额外处理[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值