uni 封装request请求 + refreshToken无缝换token

uni 封装request请求

  1. utils/interceptors.js
import { simpleHttp } from './request/simple'
import { baseUrl } from '../config'
import store from '@/store'
import { authNav } from './checkAuth'
// 1.请求拦截器
// 2.在响应的时候,处理data数据
// 3.统一的错误处理
// 这里的vm,就是我们在vue文件里面的this,所以我们能在这里获取vuex的变量,比如存放在里面的token变量
const install = (Vue, vm) => {
  // 此为自定义配置参数,具体参数见上方说明
  Vue.prototype.$u.http.setConfig({
    baseUrl,
    dataType: 'json',
    showLoading: true, // 是否显示请求中的loading
    loadingText: '请求中...', // 请求loading中的文字提示
    loadingTime: 800, // 在此时间内,请求还没回来的话,就显示加载中动画,单位ms
    originalData: false, // 是否在拦截器中返回服务端的原始数据
    loadingMask: true, // 展示loading的时候,是否给一个透明的蒙层,防止触摸穿透
    // 配置请求头信息
    header: {
      'content-type': 'application/json;charset=UTF-8'
    },
    // options - 即为上一次请求的所有的config配置
    // instance - 即为原先的request实例 -> token已经被更新回来了,所以可以继续使用
    errorHandle: async (err, { options, instance }) => {
      if (err.statusCode === 401) {
        // todo 4.业务 —> refreshToken -> 请求响应401 -> 刷新token
        try {
          const { code, token } = await simpleHttp({
            method: 'POST',
            url: baseUrl + '/login/refresh'
          }, {
            header: {
              Authorization: 'Bearer ' + uni.getStorageSync('refreshToken')
            }
          })
          // console.log('🚀 ~ file: interceptors.js ~ line 30 ~ errorHandle: ~ token', token)
          if (code === 200) {
            // refreshToken请求成功
            // 1.设置全局的token
            store.commit('setToken', token)
            // 2.重新发起请求
            const newResult = await instance.request(options)
            return newResult
          }
        } catch (error) {
          // 代表refreshToken已经失效
          // 清除本地的token
          store.dispatch('logout')
          // 导航到用户的登录页面
          authNav()
        }
        uni.showToast({
          icon: 'none',
          title: '鉴权失败,请重新登录',
          duration: 2000
        })
      } else {
        // 其他的错误
        // showToast提示用户
        // 3.对错误进行统一的处理 -> showToast
        const { data: { msg } } = err
        uni.showToast({
          icon: 'none',
          title: msg || '请求异常,请重试',
          duration: 2000
        })
      }
    }
  })

  // 请求拦截,配置Token等参数
  Vue.prototype.$u.http.interceptor.request = (config) => {
  // 引用token
  // 1.在头部请求的时候,token带上 -> 请求拦截器
    const publicArr = [/\/public/, /\/login/]
    // local store -> uni.getStorageSync('token')
    let isPublic = false
    publicArr.forEach(path => {
      isPublic = isPublic || path.test(config.url)
    })
    const token = uni.getStorageSync('token')
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
很抱歉,我之前提到的 `tokenManager().grantRefreshToken(refreshToken)` 是一个伪代码示例,实际上 Keycloak 的 Java 客户端库中并没有这个方法。请忽略我之前的回答。 要通过 Keycloak 使用 Refresh Token 获取 Access Token,你可以使用 Keycloak 的 Rest API 或者其他 HTTP 客户端库来发送请求。以下是一个使用 Java 的 `HttpClient` 类来发送请求的示例代码: ```java import java.io.IOException; import java.net.URI; import java.net.URISyntaxException; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; import java.util.HashMap; import java.util.Map; public class KeycloakClientExample { public static void main(String[] args) throws URISyntaxException, IOException, InterruptedException { // Keycloak 配置信息 String serverUrl = "http://localhost:8080/auth"; String realm = "your-realm"; String clientId = "your-client"; String clientSecret = "your-client-secret"; String refreshToken = "your-refresh-token"; // 构建请求参数 Map<String, String> params = new HashMap<>(); params.put("grant_type", "refresh_token"); params.put("refresh_token", refreshToken); params.put("client_id", clientId); params.put("client_secret", clientSecret); // 构建请求 HttpRequest request = HttpRequest.newBuilder() .uri(new URI(serverUrl + "/realms/" + realm + "/protocol/openid-connect/token")) .header("Content-Type", "application/x-www-form-urlencoded") .POST(buildFormDataFromMap(params)) .build(); // 发送请求 HttpClient client = HttpClient.newHttpClient(); HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString()); // 检查响应 if (response.statusCode() == 200) { String responseBody = response.body(); System.out.println("Access Token Response: " + responseBody); } else { System.out.println("Failed to retrieve Access Token"); } } private static HttpRequest.BodyPublisher buildFormDataFromMap(Map<String, String> data) { StringBuilder builder = new StringBuilder(); for (Map.Entry<String, String> entry : data.entrySet()) { if (builder.length() > 0) { builder.append("&"); } builder.append(entry.getKey()); builder.append("="); builder.append(entry.getValue()); } return HttpRequest.BodyPublishers.ofString(builder.toString()); } } ``` 确保在运行代码之前,将上述示例中的配置信息替为你自己的实际值。此示例使用了 Java 11 中引入的 `java.net.http.HttpClient` 类来发送 HTTP 请求。 请注意,此示例仅用于演示目的,实际应用中可能需要添加错误处理、合适的认证方法以及其他安全措施。你可以根据自己的需求和使用的 HTTP 客户端库进行相应的实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值