在React.js项目中,使用axios与redux结合创建一个刷新令牌的中间件可以帮助你在API请求因令牌过期而失败时自动刷新令牌,并重新发起请求。以下是如何实现这一功能的基础概念和相关步骤:
首先,创建一个Axios实例,并设置基础URL和其他默认配置。
import axios from 'axios';
const apiClient = axios.create({
baseURL: 'https://your-api-url.com',
timeout: 1000,
headers: { 'Authorization': `Bearer ${localStorage.getItem('token')}` }
});
创建一个中间件来拦截请求和响应,检查令牌是否过期,并在需要时刷新令牌。
const refreshTokenMiddleware = store => next => action => {
if (action.type !== 'API_REQUEST') {
return next(action);
}
const originalRequest = action.payload;
apiClient.interceptors.response.use(
response => response,
async error => {
const originalRequest = error.config;
if (error.response.status === 401 && !originalRequest._retry) {
originalRequest._retry = true;
try {
const newToken = await store.dispatch(refreshToken()); // 假设refreshToken是一个action creator
originalRequest.headers['Authorization'] = `Bearer ${newToken}`;
return apiClient(originalRequest);
} catch (refreshError) {
return Promise.reject(refreshError);
}
}
return Promise.reject(error);
}
);
return next(action);
};
创建一个action来处理令牌刷新逻辑。
// actions.js
export const refreshToken = () => async dispatch => {
try {
const response = await apiClient.post('/refresh-token', { refreshToken: localStorage.getItem('refreshToken') });
localStorage.setItem('token', response.data.token);
return response.data.token;
} catch (error) {
// 处理错误,例如重定向到登录页面
throw error;
}
};
在创建Redux store时,添加自定义的中间件。
import { createStore, applyMiddleware } from 'redux';
import rootReducer from './reducers';
import refreshTokenMiddleware from './middleware/refreshTokenMiddleware';
const store = createStore(
rootReducer,
applyMiddleware(refreshTokenMiddleware)
);
这种中间件特别适用于需要长时间运行的单页应用程序(SPA),其中用户的会话可能会在后台过期,但用户仍然与应用交互。通过自动刷新令牌,可以提供无缝的用户体验,而不需要用户重新登录。
_retry
)来避免重复请求。通过以上步骤,你可以在React.js应用中实现一个有效的刷新令牌机制,从而提高用户体验和应用的安全性。
领取专属 10元无门槛券
手把手带您无忧上云