Files
sa-token/sa-token-doc/doc/use/not-cookie.md
2020-02-06 00:52:49 +08:00

2.4 KiB
Raw Blame History

无cookie模式


何为无cookie

  • 常规PC端鉴权方法一般由cookie进行
  • 而cookie有两个特性1、可由后端控制写入2、每次请求自动提交
  • 这就使得大多数web前端码农无需任何特殊操作就能完成鉴权的流程因为整个流程都是后端控制完成的
  • 而在app、小程序等前后台分离场景中是没有cookie这一功能的此时大多数人都会一脸懵逼咋进行鉴权啊
  • 其实很简单
    • 不能后端控制写入了,就前端自己写入(难点在如何将token传递到前端
    • 每次请求不能自动提交了,那就手动提交(难点在前端如何将token传递到后端,同时后端将其读取出来

将token传递到前端

  1. 首先调用 StpUtil.setLoginId(Object login_id) 进行登录
  2. 调用 StpUtil.getTokenInfo() 返回当前会话的token值
    • 此方法返回一个Map有两个keytokenName和tokenValuetoken的名称和token的值
    • 将此Map传递到前台让前端人员将这两个值保存到本地

前端将token提交到后端

  1. 无论是app还是小程序其传递方式都大同小异
  2. 那就是将token塞到请求header里 ,格式为:{tokenName: tokenValue}
  3. 以经典跨端框架uni-app为例:
	var tokenName = uni.getStorageSync('tokenName');	// 从本地缓存读取tokenName值
	var tokenValue = uni.getStorageSync('tokenValue');	// 从本地缓存读取tokenValue值
	var header = {
		"content-type": "application/x-www-form-urlencoded"	 // 防止后台拿不到参数
	};
	if (tokenName != undefined && tokenName != '') {
		header[tokenName] = tokenValue;
	}
	// 后续在发起请求时将 header 对象塞到请求头部 
  1. 只要按照如此方法将token值传递到后端sa-token就能像传统PC端一样自动读取到token值进行鉴权
  2. 你可能会有疑问难道我每个ajax都要写这么一坨岂不是麻烦死了
    • 你当然不能每个ajax都写这么一坨因为这种重复代码都是要封装在一个函数里统一调用的

其它解决方案?

  • 如果你对cookie非常了解那你就会明白所谓cookie本质上就是一个特殊的header参数而已
  • 而既然它只是一个header参数我们就能就能手动模拟实现它从而完成鉴权操作
  • 这其实是对无cookie模式的另一种解决方案有兴趣的同学可以百度了解一下在此暂不赘述