【求助】Token保持登录状态的问题

画个逗号丶给明天 2019-08-12 09:58:53
我这里有一个网站,采用前后端分离,前台全部是html,后台springmvc,用token实现用户登录状态的保持,感觉流程没什么问题,就是想实现不了

需求:URL采用REST风格
不使用session和cookie


1.点击登录,提交ajax请求,向后台发送用户名和密码。
2.后台验证用户名密码,不考虑登陆失败的情况,后台会返回一个token,
3.前台拿到token,将token保存到浏览器的sessionStorage中,
4.location.href发送一个新请求,这个请求会返回一个用户主界面
5.问题来了,我后台有一个拦截器,这个拦截器会从请求头中验证token,防止用户不登录就访问
而当我location.href时,是没有办法设置请求头的,所以这个请求就被拦截了。
下面是我尝试过得解决方案


1.使用post提交表单的方式,将token放入请求体中,拦截器使用request.getRequestParamter来获取token
这种情况确实可以成功跳转到用户主界面,但是当我刷新界面时,服务器会间隔返回412
看了下解决方案:[https://blog.csdn.net/xiyou222/article/details/79543775]
发现最好的方法就是改成get方式,而get没办法设置请求头

2.使用get请求,将token放到url上,这种方法确实可行,但是违反了我的需求
3.cookie和session 违反需求。


总结起来就是一个句话,我要带上token向后台发送一个请求来跳转页面,但是URL要采用REST风格

有哪位大神可以帮我解决吗

登录按钮事件


拦截器

用户主界面

...全文
734 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_43869905 2019-08-13
  • 打赏
  • 举报
回复
还有 token 一般是放redis里面
  • 打赏
  • 举报
回复
引用 7 楼 weixin_43869905的回复:
$window.sessionStorage.accessToken 这样 放在请求头中 有什么问题吗?
可以,还有这种东西。。。。
  • 打赏
  • 举报
回复
引用 9 楼 aw277866304的回复:
你是不是有什么误区?或者业务还是有点问题? 1、比如登录,你肯定是要先请求登录接口,登录成功后返回用户信息(包括token)到前端; 2、在前端进行处理,将token保存到cookie或者session中,再跳转页面; 3、在其他页面请求接口时,带上token就行了,拦截器就不会进行拦截。 放到请求接口的后面,就算通过url的形式浏览器也看不到你的token的。
不使用cookie和session
软件老王 2019-08-13
  • 打赏
  • 举报
回复
引用 9 楼 aw277866304 的回复:
你是不是有什么误区?或者业务还是有点问题? 1、比如登录,你肯定是要先请求登录接口,登录成功后返回用户信息(包括token)到前端; 2、在前端进行处理,将token保存到cookie或者session中,再跳转页面; 3、在其他页面请求接口时,带上token就行了,拦截器就不会进行拦截。 放到请求接口的后面,就算通过url的形式浏览器也看不到你的token的。
  • 打赏
  • 举报
回复
引用 5 楼 cwmlow的回复:
可以试试过滤器配合redis缓存来实现token验证 前端请求除登录之外的接口都需header头部带登录生成的token过来 后端通过redis缓存的token来判断是否正确和过没过期
还要去学readis
CS_草祭先生 2019-08-13
  • 打赏
  • 举报
回复
你是不是有什么误区?或者业务还是有点问题? 1、比如登录,你肯定是要先请求登录接口,登录成功后返回用户信息(包括token)到前端; 2、在前端进行处理,将token保存到cookie或者session中,再跳转页面; 3、在其他页面请求接口时,带上token就行了,拦截器就不会进行拦截。 放到请求接口的后面,就算通过url的形式浏览器也看不到你的token的。
maradona1984 2019-08-13
  • 打赏
  • 举报
回复
如果真的前后端分离,你的html请求根本不会到你的后端服务器的,只会到nginx这种静态服务器上,控制权限只需要考虑ajax请求,页面被访问也无所谓,反正没有数据 所以我感觉你们完全可以放弃控制html路径的校验,只需要校验ajax请求,ajax的请求头设置应该很简单的
weixin_43869905 2019-08-13
  • 打赏
  • 举报
回复
$window.sessionStorage.accessToken 这样 放在请求头中 有什么问题吗?
weixin_43869905 2019-08-13
  • 打赏
  • 举报
回复
为什么要用location.href
cwmlow 2019-08-13
  • 打赏
  • 举报
回复
可以试试过滤器配合redis缓存来实现token验证 前端请求除登录之外的接口都需header头部带登录生成的token过来 后端通过redis缓存的token来判断是否正确和过没过期
编程写手 2019-08-13
  • 打赏
  • 举报
回复
引用 3 楼 画个逗号丶给明天的回复:
[quote=引用 2 楼 你是小KS的回复:]为什早放在Header中,不是放在请求体上吗?
不暴露,就算是放在请求体上,得到的也是相同的结果,get方法携带参数,必须要写在url上,而post会报412错误[/quote] 好吧,结果就是他获得参数方式错误
  • 打赏
  • 举报
回复
引用 2 楼 你是小KS的回复:
为什早放在Header中,不是放在请求体上吗?
不暴露,就算是放在请求体上,得到的也是相同的结果,get方法携带参数,必须要写在url上,而post会报412错误
编程写手 2019-08-13
  • 打赏
  • 举报
回复
为什早放在Header中,不是放在请求体上吗?
  • 打赏
  • 举报
回复
拦截器第17行写错了,应为
String token=request.getRequestParamter("token");

81,095

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧