添加redis缓存支持

This commit is contained in:
macro 2020-03-22 15:09:32 +08:00
parent fa0af3188c
commit 092bd90257
11 changed files with 184 additions and 98 deletions

View File

@ -0,0 +1,34 @@
package com.macro.mall.portal.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
/**
* 全局跨域配置
* Created by macro on 2019/7/27.
*/
@Configuration
public class GlobalCorsConfig {
/**
* 允许跨域调用的过滤器
*/
@Bean
public CorsFilter corsFilter() {
CorsConfiguration config = new CorsConfiguration();
//允许所有域名进行跨域调用
config.addAllowedOrigin("*");
//允许跨越发送cookie
config.setAllowCredentials(true);
//放行全部原始头信息
config.addAllowedHeader("*");
//允许所有请求方法跨域调用
config.addAllowedMethod("*");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
return new CorsFilter(source);
}
}

View File

@ -1,14 +1,20 @@
package com.macro.mall.portal.config;
import com.macro.mall.portal.service.UmsMemberService;
import com.macro.mall.security.component.DynamicSecurityService;
import com.macro.mall.security.config.SecurityConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.access.ConfigAttribute;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import java.util.Collection;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
* mall-security模块相关配置
* Created by macro on 2019/11/5.

View File

@ -1,6 +1,7 @@
package com.macro.mall.portal.controller;
import com.macro.mall.common.api.CommonResult;
import com.macro.mall.model.UmsMember;
import com.macro.mall.portal.service.UmsMemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@ -13,6 +14,7 @@ import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import java.security.Principal;
import java.util.HashMap;
import java.util.Map;
@ -57,6 +59,17 @@ public class UmsMemberController {
return CommonResult.success(tokenMap);
}
@ApiOperation("获取会员信息")
@RequestMapping(value = "/info", method = RequestMethod.GET)
@ResponseBody
public CommonResult info(Principal principal) {
if(principal==null){
return CommonResult.unauthorized(null);
}
UmsMember member = memberService.getCurrentMember();
return CommonResult.success(member);
}
@ApiOperation("获取验证码")
@RequestMapping(value = "/getAuthCode", method = RequestMethod.GET)
@ResponseBody

View File

@ -1,35 +0,0 @@
package com.macro.mall.portal.service;
/**
* redis操作Service,
* 对象和数组都以json形式进行存储
* Created by macro on 2018/8/7.
*/
public interface RedisService {
/**
* 存储数据
*/
void set(String key, String value);
/**
* 获取数据
*/
String get(String key);
/**
* 设置超期时间
*/
boolean expire(String key, long expire);
/**
* 删除数据
*/
void remove(String key);
/**
* 自增操作
* @param delta 自增步长
*/
Long increment(String key, long delta);
}

View File

@ -0,0 +1,34 @@
package com.macro.mall.portal.service;
import com.macro.mall.model.UmsMember;
/**
* 会员信息缓存业务类
* Created by macro on 2020/3/14.
*/
public interface UmsMemberCacheService {
/**
* 删除会员用户缓存
*/
void delMember(Long memberId);
/**
* 获取会员用户缓存
*/
UmsMember getMember(String username);
/**
* 设置会员用户缓存
*/
void setMember(UmsMember member);
/**
* 设置验证码
*/
void setAuthCode(String telephone, String authCode);
/**
* 获取验证码
*/
String getAuthCode(String telephone);
}

View File

@ -9,6 +9,7 @@ import com.macro.mall.portal.dao.PortalOrderItemDao;
import com.macro.mall.portal.dao.SmsCouponHistoryDao;
import com.macro.mall.portal.domain.*;
import com.macro.mall.portal.service.*;
import com.macro.mall.security.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
@ -47,8 +48,10 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
private SmsCouponHistoryMapper couponHistoryMapper;
@Autowired
private RedisService redisService;
@Value("${redis.key.prefix.orderId}")
private String REDIS_KEY_PREFIX_ORDER_ID;
@Value("${redis.key.orderId}")
private String REDIS_KEY_ORDER_ID;
@Value("${redis.database}")
private String REDIS_DATABASE;
@Autowired
private PortalOrderDao portalOrderDao;
@Autowired
@ -318,8 +321,8 @@ public class OmsPortalOrderServiceImpl implements OmsPortalOrderService {
private String generateOrderSn(OmsOrder order) {
StringBuilder sb = new StringBuilder();
String date = new SimpleDateFormat("yyyyMMdd").format(new Date());
String key = REDIS_KEY_PREFIX_ORDER_ID + date;
Long increment = redisService.increment(key, 1);
String key = REDIS_DATABASE+":"+ REDIS_KEY_ORDER_ID + date;
Long increment = redisService.incr(key, 1);
sb.append(date);
sb.append(String.format("%02d", order.getSourceType()));
sb.append(String.format("%02d", order.getPayType()));

View File

@ -1,43 +0,0 @@
package com.macro.mall.portal.service.impl;
import com.macro.mall.portal.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import java.util.concurrent.TimeUnit;
/**
* redis操作Service的实现类
* Created by macro on 2018/8/7.
*/
@Service
public class RedisServiceImpl implements RedisService {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public void set(String key, String value) {
stringRedisTemplate.opsForValue().set(key, value);
}
@Override
public String get(String key) {
return stringRedisTemplate.opsForValue().get(key);
}
@Override
public boolean expire(String key, long expire) {
return stringRedisTemplate.expire(key, expire, TimeUnit.SECONDS);
}
@Override
public void remove(String key) {
stringRedisTemplate.delete(key);
}
@Override
public Long increment(String key, long delta) {
return stringRedisTemplate.opsForValue().increment(key,delta);
}
}

View File

@ -0,0 +1,68 @@
package com.macro.mall.portal.service.impl;
import com.macro.mall.mapper.UmsMemberMapper;
import com.macro.mall.model.UmsMember;
import com.macro.mall.portal.service.UmsMemberCacheService;
import com.macro.mall.security.annotation.CacheException;
import com.macro.mall.security.config.RedisConfig;
import com.macro.mall.security.service.RedisService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* UmsMemberCacheService实现类
* Created by macro on 2020/3/14.
*/
@Service
public class UmsMemberCacheServiceImpl implements UmsMemberCacheService {
@Autowired
private RedisService redisService;
@Autowired
private UmsMemberMapper memberMapper;
@Value("${redis.database}")
private String REDIS_DATABASE;
@Value("${redis.expire.common}")
private Long REDIS_EXPIRE;
@Value("${redis.expire.authCode}")
private Long REDIS_EXPIRE_AUTH_CODE;
@Value("${redis.key.member}")
private String REDIS_KEY_MEMBER;
@Value("${redis.key.authCode}")
private String REDIS_KEY_AUTH_CODE;
@Override
public void delMember(Long memberId) {
UmsMember umsMember = memberMapper.selectByPrimaryKey(memberId);
if (umsMember != null) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_MEMBER + ":" + umsMember.getUsername();
redisService.del(key);
}
}
@Override
public UmsMember getMember(String username) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_MEMBER + ":" + username;
return (UmsMember) redisService.get(key);
}
@Override
public void setMember(UmsMember member) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_MEMBER + ":" + member.getUsername();
redisService.set(key, member, REDIS_EXPIRE);
}
@CacheException
@Override
public void setAuthCode(String telephone, String authCode) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_AUTH_CODE + ":" + telephone;
redisService.set(key,authCode,REDIS_EXPIRE_AUTH_CODE);
}
@CacheException
@Override
public String getAuthCode(String telephone) {
String key = REDIS_DATABASE + ":" + REDIS_KEY_AUTH_CODE + ":" + telephone;
return (String) redisService.get(key);
}
}

View File

@ -8,7 +8,7 @@ import com.macro.mall.model.UmsMemberExample;
import com.macro.mall.model.UmsMemberLevel;
import com.macro.mall.model.UmsMemberLevelExample;
import com.macro.mall.portal.domain.MemberDetails;
import com.macro.mall.portal.service.RedisService;
import com.macro.mall.portal.service.UmsMemberCacheService;
import com.macro.mall.portal.service.UmsMemberService;
import com.macro.mall.security.util.JwtTokenUtil;
import org.slf4j.Logger;
@ -48,19 +48,23 @@ public class UmsMemberServiceImpl implements UmsMemberService {
@Autowired
private UmsMemberLevelMapper memberLevelMapper;
@Autowired
private RedisService redisService;
@Value("${redis.key.prefix.authCode}")
private UmsMemberCacheService memberCacheService;
@Value("${redis.key.authCode}")
private String REDIS_KEY_PREFIX_AUTH_CODE;
@Value("${redis.key.expire.authCode}")
@Value("${redis.expire.authCode}")
private Long AUTH_CODE_EXPIRE_SECONDS;
@Override
public UmsMember getByUsername(String username) {
UmsMember member = memberCacheService.getMember(username);
if(member!=null) return member;
UmsMemberExample example = new UmsMemberExample();
example.createCriteria().andUsernameEqualTo(username);
List<UmsMember> memberList = memberMapper.selectByExample(example);
if (!CollectionUtils.isEmpty(memberList)) {
return memberList.get(0);
member = memberList.get(0);
memberCacheService.setMember(member);
return member;
}
return null;
}
@ -109,9 +113,7 @@ public class UmsMemberServiceImpl implements UmsMemberService {
for(int i=0;i<6;i++){
sb.append(random.nextInt(10));
}
//验证码绑定手机号并存储到redis
redisService.set(REDIS_KEY_PREFIX_AUTH_CODE+telephone,sb.toString());
redisService.expire(REDIS_KEY_PREFIX_AUTH_CODE+telephone,AUTH_CODE_EXPIRE_SECONDS);
memberCacheService.setAuthCode(telephone,sb.toString());
return sb.toString();
}
@ -130,6 +132,7 @@ public class UmsMemberServiceImpl implements UmsMemberService {
UmsMember umsMember = memberList.get(0);
umsMember.setPassword(passwordEncoder.encode(password));
memberMapper.updateByPrimaryKeySelective(umsMember);
memberCacheService.delMember(umsMember.getId());
}
@Override
@ -146,6 +149,7 @@ public class UmsMemberServiceImpl implements UmsMemberService {
record.setId(id);
record.setIntegration(integration);
memberMapper.updateByPrimaryKeySelective(record);
memberCacheService.delMember(id);
}
@Override
@ -185,7 +189,7 @@ public class UmsMemberServiceImpl implements UmsMemberService {
if(StringUtils.isEmpty(authCode)){
return false;
}
String realAuthCode = redisService.get(REDIS_KEY_PREFIX_AUTH_CODE + telephone);
String realAuthCode = memberCacheService.getAuthCode(telephone);
return authCode.equals(realAuthCode);
}

View File

@ -33,7 +33,7 @@ spring:
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 8 # 连接池中的最大空闲连接
min-idle: 0 # 连接池中的最小空闲连接
timeout: 3000ms # 连接超时时间(毫秒)
timeout: 1000ms # 连接超时时间(毫秒)
rabbitmq:
host: localhost

View File

@ -10,7 +10,7 @@ mybatis:
jwt:
tokenHeader: Authorization #JWT存储的请求头
secret: mall-portal-secret #JWT加解密使用的密钥
expiration: 604800 #JWT的超期限时间(60*60*24)
expiration: 604800 #JWT的超期限时间(60*60*24*7)
tokenHead: Bearer #JWT负载中拿到开头
secure:
@ -32,12 +32,14 @@ secure:
# 自定义redis key
redis:
database: mall
key:
prefix:
authCode: "portal:authCode:"
orderId: "portal:orderId:"
expire:
authCode: 90 # 验证码超期时间
authCode: 'ums:authCode'
orderId: 'oms:orderId'
member: 'ums:member'
expire:
authCode: 90 # 验证码超期时间
common: 86400 # 24小时
# 消息队列定义
rabbitmq: