当前位置: 首页 > 面试题库 >

如何使用React Router V4从axios拦截器重定向?

谈炳
2023-03-14
问题内容

收到403错误时,我想在axios拦截器中进行重定向。但是我如何才能访问React组件之外的历史记录呢?

在React-Router v4中以编程方式导航中,它是在React组件的上下文中,但是这里我在axios上下文中尝试

axios.interceptors.response.use(function (response) {
    // Do something with response data
    return response;
  }, function (error) {
    // Do something with response error
    if(error.response.status === 403) { console.log("Redirection needed !"); }

    // Trow errr again (may be need for some other catch)
    return Promise.reject(error);
});

问题答案:

我通过从Component树之外访问Redux
Store并通过注销按钮发送相同的操作来解决了这一问题,因为我的拦截器是在单独的文件中创建的,并且在加载任何Component之前先进行加载。

因此,基本上,我做了以下工作:

index.js文件中:

//....lots of imports ommited for brevity
import { createStore, applyMiddleware } from 'redux';
import reduxThunk from 'redux-thunk';
import reducers from './reducers';
import { UNAUTH_USER } from './actions/types'; //this is just a constants file for action types.

const createStoreWithMiddleware = applyMiddleware(reduxThunk)(createStore);
const store = createStoreWithMiddleware(reducers);

//Here is the guy where I set up the interceptors!
NetworkService.setupInterceptors(store);

//lots of code ommited again...
//Please pay attention to the "RequireAuth" below, we'll talk about it later

ReactDOM.render(
  <Provider store={store}>
      <BrowserRouter>
          <div>
              <Header />
              <main className="plan-container">
                  <Switch>
                      <Route exact path="/" component={Landing} />
                      <Route exact path="/login" component={Login} />
                      <Route exact path="/signup" component={Signup} />
                      <Route exact path="/calendar" component={RequireAuth(Calendar)} />
                      <Route exact path="/profile" component={RequireAuth(Profile)} />
                  </Switch>
              </main>
          </div>
      </BrowserRouter>
  </Provider>
  , document.querySelector('.main-container'));

并在network-service.js文件:

import axios        from 'axios';
import { UNAUTH_USER } from '../actions/types';

export default {
  setupInterceptors: (store) => {

    // Add a response interceptor
    axios.interceptors.response.use(function (response) {
        return response;
    }, function (error) {
        //catches if the session ended!
        if ( error.response.data.token.KEY == 'ERR_EXPIRED_TOKEN') {
            console.log("EXPIRED TOKEN!");
            localStorage.clear();
            store.dispatch({ type: UNAUTH_USER });
        }
        return Promise.reject(error);
    });

  }
};

最后但并非最不重要的一点是,我有一个HOC(高阶组件),它将受保护的组件包装在会话结束时进行实际重定向的位置。这样,当我触发动作类型UNAUTH_USER时,它将我的化简器上的isLogged属性设置sessionfalse,因此该组件会随时得到通知并为我进行重定向。

require-auth.js组件文件

import React, { Component } from 'react';
import { connect } from 'react-redux';

export default function(ComposedComponent) {

    class RequireAuth extends Component {

        componentWillMount() {
            if(!this.props.session.isLogged) {
                this.props.history.push('/login');
            }
        };

        componentWillUpdate(nextProps) {
            if(!nextProps.session.isLogged) {
                this.props.history.push('/login');
            }
        };

        render() {
            return <ComposedComponent {...this.props} />
        }
    }

    function mapStateToProps(state) {
        return { session: state.session };
    }

    return connect(mapStateToProps)(RequireAuth);
}

希望有帮助!



 类似资料:
  • 问题内容: 使用笑话进行测试时,我具有基本的测试服语法: 问题是我的代码中有拦截器,当使用jest命令输出运行测试时,拦截器会: TypeError:无法读取未定义的属性“拦截器” 并指向拦截器对象 是存储以下项的返回值的变量 在SO上引用了该axios线程。我如何以开玩笑的方式测试axios,但是它不涉及任何拦截器,因此并没有真正的帮助。 问题答案: 最后就足够了

  • 问题内容: 我们的应用程序要求用户登录才能查看任何内容。如果没有有效的用户会话,则会拦截对所有页面的访问,并弹出登录表单。我希望拦截器在显示登录表单之前记住原始请求URI,并在登录表单验证成功后重定向到该请求。我尝试按照Struts2Redirect进行身份验证拦截器后的更正操作 但是,由于,我得到了空白页。 从未被调用。 解决方案: 完全擦除@Results批注,而不是调用 问题答案: 如果未登

  • 问题内容: 我知道如何拦截所有请求,但是我只想拦截来自我资源的请求。 有谁知道如何做到这一点? 问题答案: 如果只想拦截来自特定资源的请求,则可以使用可选的action 属性。Angular的文档请参见此处(用法>操作) 的JavaScript Plunker:http ://plnkr.co/edit/xjJH1rdJyB6vvpDACJOT?p=preview

  • 本文向大家介绍Vue 前端实现登陆拦截及axios 拦截器的使用,包括了Vue 前端实现登陆拦截及axios 拦截器的使用的使用技巧和注意事项,需要的朋友参考一下 该项目是利用了Github 提供的personal token作为登录token,通过token访问你的Repository List。通过这个项目学习如何实现一个前端项目中所需要的 登录及拦截、登出、token失效的拦截及对应 axi

  • 我试着用spring AOP写一个拦截器,拦截器会发现一个请求URL是否是书签,如果是的话会重定向到认证页面。代码段: public Object invoke(MethodInvocation invocation)抛出Throwable{Logger.Entering(This.GetClass().GetSimPlename(),“invoke”,invocation); 当我调试时,控件按

  • 问题内容: 我正在使用Java EE 6和Jboss AS7.1,并尝试使用拦截器绑定(来自jboss网站的示例)。 我有一个InterceptorBinding注解: 拦截器: 还有一个豆: 但是拦截器没有被称为。。。 在编写此代码时将调用拦截器: 谢谢你的帮助。 问题答案: 您是否按照参考示例中的说明启用了拦截器? 缺省情况下,bean档案没有通过拦截器绑定绑定的已启用拦截器。必须通过将侦听器