Shiro安全框架+小程序开发+java后台+登陆接口调用+携带cookie调用其他接口+保持session一致+保持登录状态

Shiro安全框架+小程序开发+java后台+登陆接口调用+携带cookie调用其他接口+保持session一致+保持登录状态

问题:

由于开发小程序的时候wx.request()发起的每次请求对于服务器来说都是不同的会话(wx.request()请求是先经过微信服务器再到达我们的服务器),这样导致后续接口的请求都相当于未登录的状态。

解决方案:

小程序代码将成功登录后header里面的cookie存在全局变量里面,然后再次请求其他接口的时候,再去全局变量里面获取并放在request的header里面,这样每次请求接口的时候都带了用户认证信息,后台就知道这个用户是已登陆用户了。

小程序有提供对请求头的支持

===========================================================

摘要:首先要跟大家讲的是,shiro框架提供了很好地安全机制,特别是其中的拦截器功能。在我们通过java+Spring+SpringBoot+Mybaties进行平台开发的时候,如果前端是通过浏览器访问的话,shiroSecurity.xml安全配置文件中配置如下:其中对于登陆安全校验来讲,最重要的就是下面的SIDrememberMe了,这里的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的校验:

Shiro安全框架+小程序开发+java后台+登陆接口调用+携带cookie调用其他接口+保持session一致+保持登录状态_第1张图片

上面截图内容如下:

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);

         })

       }

你可能感兴趣的:(java,shiro,小程序,session,cookie)