基于spring Boot的微信开发————AccessToken的缓存方案

通过微信授权拿到的token有一个7200秒的有效期,并且获取token的次数也有一定限制,所以token不能“随用随取”,通过网络资源获取,解决方案有①储存在数据库中,每次使用时都查询一次数据库,②定义静态全局变量(单例模式),开启线程监控变量是否“过期”,③结合数据库做缓存,开启定时任务,每7200秒从微信服务器中获取一次token并保存到自己的数据库中

各方法的优缺:

①:简单粗暴,对数据库的操作过多,适合访问量小,调用微信API次数少的项目

②:(单例模式)全局变量在服务器重启时会清除,不使用数据库的方式,变量设置不当可能会混淆(微信有两个token,一个用于(粉丝)用户授权,一个用于开发者授权)

③:灵活,易结合到各类开发中,spring也对各种缓存方案有很好的支持

以下为方法③的实现方式之一(未开启定期任务,缓存方案使用ehcache)

 基本配置

ehcache.xml配置

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">

    <defaultCache
            eternal="false"
            maxElementsInMemory="1000"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="0"
            timeToLiveSeconds="600"
            memoryStoreEvictionPolicy="LRU" />

    <cache
            name="TokenCache"
            eternal="false"
            maxElementsInMemory="100"
            overflowToDisk="false"
            diskPersistent="false"
            timeToIdleSeconds="7200"
            timeToLiveSeconds="7200"
            memoryStoreEvictionPolicy="LRU" />

    <!-- eternal:true表示对象永不过期,此时会忽略timeToIdleSeconds和timeToLiveSeconds属性,默认为false -->
    <!-- maxEntriesLocalHeap:堆内存中最大缓存对象数,0没有限制 -->
    <!-- timeToIdleSeconds: 设定允许对象处于空闲状态的最长时间,以秒为单位。当对象自从最近一次被访问后,
    如果处于空闲状态的时间超过了timeToIdleSeconds属性值,这个对象就会过期,EHCache将把它从缓存中清空。
    只有当eternal属性为false,该属性才有效。如果该属性值为0,则表示对象可以无限期地处于空闲状态 -->
</ehcache>

spring boot配置

#端口
server.port=8080
#数据源
spring.datasource.name=test
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=true&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
##连接池属性配置
spring.datasource.initialSize=5  
spring.datasource.minIdle=5  
spring.datasource.maxActive=20  
spring.datasource.maxWait=60000  
spring.datasource.timeBetweenEvictionRunsMillis=60000  
spring.datasource.minEvictableIdleTimeMillis=300000  
spring.datasource.validationQuery=SELECT 1 FROM DUAL  
spring.datasource.testWhileIdle=true  
spring.datasource.testOnBorrow=false  
spring.datasource.testOnReturn=false  
spring.datasource.poolPreparedStatements=true  
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20  
spring.datasource.filters=stat,wall,log4j  
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000 
#mybatis.config
mybatis.mapper-locations=classpath:mapping/*xml
mybatis.type-aliases-package=cn.vision.springbootdemo.model

#分页插件
pagehelper.helper-dialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql

#日志
logging.level.cn.vision.weixindemo.mapper = debug

# spring 设置缓存方案为ehcache
spring.cache.type=ehcache
spring.cache.ehcache.config=classpath:cache/ehcache.xml

 微信工具类———微信post、get请求工具类

package cn.vision.weixindemo.utils.base;

import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.ht
Spring Cloud微服务开发中,可以通过以下几种方式来保存和使用access_token: 1. 在微服务中的配置文件中配置access_token 可以在微服务的配置文件(如application.yml或application.properties)中,添加access_token的配置项。然后在微服务中使用配置项来获取access_token。 示例: 在配置文件中添加以下配置项: ``` wechat: appid: your_appid secret: your_secret access-token: your_access_token ``` 然后在微服务中使用以下代码来获取access_token: ```java @Value("${wechat.access-token}") private String accessToken; ``` 2. 使用Redis等缓存服务保存access_token 可以使用Redis等缓存服务来保存access_token。在微服务中,通过调用缓存服务的API来获取和保存access_token。 示例: 使用Spring Boot集成Redis,在微服务中注入RedisTemplate,然后使用以下代码来获取和保存access_token: ```java @Autowired private RedisTemplate<String, String> redisTemplate; public String getAccessToken() { String accessToken = redisTemplate.opsForValue().get("access_token"); if (accessToken == null) { // 从微信服务器获取access_token accessToken = getAccessTokenFromWechatServer(); // 将access_token保存到Redis中 redisTemplate.opsForValue().set("access_token", accessToken, 7200, TimeUnit.SECONDS); } return accessToken; } ``` 3. 使用数据库保存access_token 可以使用数据库来保存access_token。在微服务中,通过调用数据库的API来获取和保存access_token。 示例: 使用Spring Data JPA集成数据库,在微服务中定义一个Access Token的实体类,然后使用以下代码来获取和保存access_token: ```java @Autowired private AccessTokenRepository accessTokenRepository; public String getAccessToken() { AccessToken accessToken = accessTokenRepository.findFirstByOrderByIdDesc(); if (accessToken == null || accessToken.isExpired()) { // 从微信服务器获取access_token accessToken = getAccessTokenFromWechatServer(); // 将access_token保存到数据库中 accessTokenRepository.save(accessToken); } return accessToken.getToken(); } ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值