Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

如何做全局的登录状态管理 #95

Closed
tianlizhao opened this issue Sep 19, 2016 · 25 comments
Closed

如何做全局的登录状态管理 #95

tianlizhao opened this issue Sep 19, 2016 · 25 comments

Comments

@tianlizhao
Copy link

tianlizhao commented Sep 19, 2016

检查是否登录:

  • 在切换页面的时候(只能在每个子的路由里做onEnter={isLogin}吗?),如下:
<Router history={history}>
      <Route path="/" component={MainLayout} onEnter={isLogin}>
        <IndexRoute component={�User} />
        <Route path='tag' component={Tag} />
      </Route>
    <Route path="/login" component={Login} />
    <Route path="*" component={NotFound} />
</Router>
不能直接在父路由上加onEnter,所有的子路由都生效么?
或者有别的什么办法
  • 在请求api的时候 (可以在request.js 里面做响应前和响应后的处理,然后throw error,在全局的onerror里处理)

然后在代码里如何控制跳转呢?

@nikogu
Copy link
Member

nikogu commented Sep 21, 2016

我建议采用第二种(使用请求控制),很简单,封装一下你的 request 函数,然后在里面根据情况处理即可(跳转页面,弹框提示之类的)

@sorrycc
Copy link
Member

sorrycc commented Sep 23, 2016

在 subscription 里处理:

  1. 通过 history.listen 判断是否进入目标页面
  2. 触发 effect,在 effect 里判断登录状态以及页面跳转

如何跳转详见基于 action 进行页面跳转@dva-knowledge

@rrandom
Copy link

rrandom commented Sep 25, 2016

我要在每个请求service中带上登录后的token,请问这种情况怎么写比较好?

@hbrls
Copy link
Contributor

hbrls commented Sep 25, 2016

@rrandom 我在 fetch 外又封装了一个 $http,在这个里面加 token

@rrandom
Copy link

rrandom commented Sep 26, 2016

@hbrls 请问你的token是存在store里的吗? 如果是的话,请问你的$http是怎么写的

@sorrycc
Copy link
Member

sorrycc commented Sep 26, 2016

token 存 cookie 里的吧,$http 的实现我觉得应该类似 https://github.com/dvajs/dva-cli/blob/master/boilerplates/app/src/utils/request.js

@chenxiangxi
Copy link

@sorrycc 请问在dva中,怎么把token设置到cookie中?

@sorrycc
Copy link
Member

sorrycc commented Sep 28, 2016

token 设到 cookie 里不是 dva 做的事情,是服务器端响应头做的。

@chenxiangxi
Copy link

@sorrycc 在dora中有没有办法?我现在的做法是所有api会在网站服务器端加上token。昨天才发现dva和dora,挺不错。

@AdamChrist
Copy link

我两种都做了.
第一种是跳转页面判断token是否生效.做这个主要是为了控制web的页面权限.
第二种每个页面的API请求的时候带上token.服务器判断是否有权限访问API.因为服务器可能手机APP访问

@neeboo
Copy link

neeboo commented Oct 23, 2016

可以放在localstorage 用jsonwebtoken即可

@liSong5713
Copy link

用户登录的信息 可以保存在 login_model (相当于全局的model),那么在其他的model 怎么取到这个login_model的信息呢

@sorrycc
Copy link
Member

sorrycc commented Nov 8, 2016

@liSong5713
Copy link

liSong5713 commented Nov 8, 2016

这个我找到了 方法 yield select(global => global)

@gera2ld
Copy link

gera2ld commented Nov 16, 2016

history.listen只能在页面跳转后做处理吧?不能像onEnter那样在跳转前做处理?这样就需要把所有加载数据的action都集中到model里,而不能放在componentDidMount中,否则就会在history.listen做出的处理之前发出请求。

@zllc
Copy link

zllc commented Nov 16, 2016

@sorrycc 我是在onEnter 中 处理登录问题的,请问在onEnter中(或者在router中)如何获取store或者dispatch呢?

@sorrycc
Copy link
Member

sorrycc commented Nov 16, 2016

onEnter 是在 router.js 里吗? 是在话可以先通过 app._store.dispatch 处理吧。

app.router(({ history, app }) => {});

这里可以获取到 app 实例的,https://github.com/dvajs/dva/blob/4cca243/index.d.ts#L70

@zllc
Copy link

zllc commented Nov 16, 2016

@sorrycc onEnter 是在 router.js 里 已经用上面的方法成功获取dispatch。多谢。

@senlaner
Copy link

@sorrycc 如何在 request.js 中获取 dispatch

@Vcgoyo
Copy link

Vcgoyo commented Dec 26, 2016

我是封装了一层 request.js 用户登录后服务端将Token传回来保存在 localstorage,fetch前将token放到cookie中,服务端验证token,如果token验证失败,后端返回401 在request.js response方法中统一错误处理 抛出 Error 在 index里捕获相应错误,然后用 window.location='/login' 跳转登陆页

@zhanbohui
Copy link

@liSong5713 请教一下,在其他的model获取全局的model中的数据要怎么写,可以给个示例吗?

@HeskeyBaozi
Copy link

我在我的项目里,两种保持登录状态的方式都尝试了:
https://github.com/HeskeyBaozi/dva-blog-crud-demo

@liSong5713
Copy link

@zhanbohui 也是一样 effect中 yield select(globalState=>state})

@baixiaoji
Copy link

一定要使用dva吗?

@sorrycc sorrycc closed this as completed Sep 2, 2017
@wuyunjiang
Copy link

@Vcgoyo 页面没有发送请求,就是说还是收不到401,这个时候通过什么判断用户是否登录

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests