问题:
由于开发小程序的时候wx.request()发起的每次请求对于服务器来说都是不同的会话(wx.request()请求是先经过微信服务器再到达我们的服务器),这样导致后续接口的请求都相当于未登录的状态。
解决方案:
小程序代码将成功登录后header里面的cookie存在全局变量里面,然后再次请求其他接口的时候,再去全局变量里面获取并放在request的header里面,这样每次请求接口的时候都带了用户认证信息,后台就知道这个用户是已登陆用户了。
小程序有提供对请求头的支持
===========================================================
摘要:首先要跟大家讲的是,shiro框架提供了很好地安全机制,特别是其中的拦截器功能。在我们通过java+Spring+SpringBoot+Mybaties进行平台开发的时候,如果前端是通过浏览器访问的话,shiroSecurity.xml安全配置文件中配置如下:其中对于登陆安全校验来讲,最重要的就是下面的SID和rememberMe了,这里的SID相当于sessionId,rememberMe相当cookie。
<bean id="simpleCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<property name="name" value="SID"/>
<property name="httpOnly" value="true"/>
<property name="maxAge" value="-1"/>
bean>
<bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie">
<property name="name" value="rememberMe"/>
<property name="httpOnly" value="true"/>
<property name="maxAge" value="2592000"/>
bean>
<bean id="rememberMeManager"
class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('加密密钥')}"/>
<property name="cookie" ref="rememberMeCookie"/>
bean>
针对上面的代码,介绍的很清楚了,接下来,介绍下,在java后台ApacheTomcat的catalina.out中打印的日志,如下图中可见。当登陆成功以后,shiro会进行session和cokie的校验:
上面截图内容如下:
Cookie [SID=902c6ac0-cb13-4c05-be28-affc3d7901dc; Path=/; HttpOnly]
Cookie [rememberMe=deleteMe; Path=/; Max-Age=0; Expires=Thu, 26-Mar-2020 04:01:19 GMT]
Cookie [rememberMe=Xdv+xQZZoW/xoaruhhzxMg8HrIiiVGVSrtBIXy+Wn5QNSnh20SZIW+DNwPFoC0si1Stf3MTHPbxTNnzUOdrFLmrPqLYH0gyiNHGoF3wB0S3RbALsIa/QUKpdLWBApkEnBddu68wTTNNosprwfDoo+y4opckXw3/Yp4PjkBjl701OZl82FveN7pEtmq35eN7sbKwnWimNyeopzihrvwb+OG5b+mDzQHbMP54GZhKecmlsYvA6ABjq4e3pfhd6P29zTxw1l0KPVqpGY8ti1o/t+EEiDNXbanx+3KI2mkCj7zxR3xJxIeSmM5VCuVHe3JX+wByOKpezuZfRKWldRmzTsd2hI1uuOLtklW51jiTLI5SrpJlzL+527WWZaoQO4jVOVPdh3kMcOFUyOAlL3W63kqGjQQDcSYKgcllpUGB9L08Ndjx9qJjMYi28ZBVBmEEF198xzcibJ3zVQLEhYU0uLS9vFJVdVEfooB5eAKspvsWsXuA12OunwU+4r37BjKvuw5GQJ4tXqh0+cNhTBt7aQ9qC8TUygLHVg+XNwTUGUbT5qTDHsbBRtgjrrt+S3PqR2Ojf1+hETuM9pV66ChANQ8+fK0+uogB/muCjLj23052Z/DDR+n2HHFZxjJIUoN0BfVuY338qIlG6k0J006eh89PX2wtBzOkVKwEC4WNwC35qRhJrEmkiliipJoD4DNlOGAgeA+ctr9covJYMBfTdORWWhDQ27p1olHs6fudJuYwIJ67JjyN1yRVkuGm/HYbYmF766ImCzwkvk5T2+VOLmvdCoSVOdy672fA1US4F7+EraOcrgxFLBjGfyFHAiQO6T3vXqo6fGINVPCALp5xiiQlfevNDQBOzU0xuWJhMchPGGZzly2hIbGX3i6q/6pSbn9+dejY8QzskZBbCxh5zhfvOEbUf8vE9mbK2iq+AQIyVgdXQTAehycGjCDGuQPNW/vDjjwAtRZHqbxtQLhPkS8cdWkt6dnjsPLqhzee+0J42sqcgoHfSdo8xeBDpIEehhdkEz9MEO+UCKl3aLbcVKXcsduf7FGsrEWw+E2bkXnPYK+ZWl4WU1LPQPr/NR3ZwceOSdssLtGavByfd4tvFhJ+ytF9SkukVua0HTrvU3UzaPlX/7NXIuNhD4aYKTHhk6+msaPWe+I+ArtWM300PclR5an+kavnC2l81wacvkmrQoYgdwg0AoCuiOSysXlDyM66JpUGj52q6U8ScrSP90kNU5IMIVVdcHj7/N/kdnLlR13+/Em3OmD1C10b33d7mlQHmGEckJmoLSCvZ39oROFS07XXHYOHdfrD6Kxqb6AMFlCnugeOKXu/SNljBoDd7GUFDFCKCnMhvdDFP1NQmN2BQ/1k/LtfQ7cVZuO6lwpZDb604IyR4BdjGZiSssm1/jUpXj5IXYYkcLbJg5nMBa7Gd4/JvxQ2YwmDvjYqO4ennHsx+weAHw3hnmCLUyO3d9rY2h52YsXsSzoia+SP6Tw==; Path=/; Max-Age=2592000; Expires=Sun, 26-Apr-2020 04:01:19 GMT; HttpOnly]
校验成功以后,下面开始接扫小程序的调用方式,当小程序调用登陆接口的时候,示例如下:
* 如果是小程序调用登陆接口,就得先将cookie存放在globalData里面,然后调用其他接口的时候再去globalData里面获取
* 1.小程序登陆接口调用示例:
* login(){
* let Base64 = require('js-base64').Base64
var header = Base64.encode(this.loginName+':'+this.password)
this.$fly.request({
method: 'post',
url: '/login/appLogin', //这里是我登录接口的路径
headers: {
'Authorization': 'Basic ' + header
},
params: {
}
}).then(res => {
this.globalData.userId = res.data.dataObject.userId //将用户id存入全局变量,当然如果登录成功的话,就不用存这个,因为后台可以从session里面获取用户id.
this.globalData.setcookie = res.headers["set-cookie"] //将cookie存入全局变量中,这里注意存入方式,从headers里面取出来的时候要加中括号和双引号
}).catch(err => {
console.log(err);
})}
2.小程序调用其他接口示例:// 查看详情
getDetail() {
this.$fly.request({
method: 'get',
url: '/sys/user/findUserDetail', //这个接口是查看用户详情接口
headers:{
cookie:this.globalData.setcookie.toString() //关键在这句话,将前面登录接口存入全局变量globalData里面的cookie取出来,再次存入headers里面,这里代表的是刚才已成功登陆的用户去后台调用接口,因为后台知道已成功登陆了,所以会记得,所以会让这个用户进行接口调用。
},
params: {
userId: this.globalData.userId //这个userId可以不传
}
}).then(res => {
console.log(res);
}).catch(err => {
console.log(err);
})
}