准备工作
Utils工具类
FastJsonRedisSerializer工具类
package com.sangeng.Utils; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.serializer.SerializerFeature; import com.fasterxml.jackson.databind.JavaType; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.type.TypeFactory; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.SerializationException; import com.alibaba.fastjson.parser.ParserConfig; import org.springframework.util.Assert; import java.nio.charset.Charset; /** * Redis使用FastJson序列化 * * @author sg */ public class FastJsonRedisSerializer<T> implements RedisSerializer<T> { public static final Charset DEFAULT_CHARSET = Charset.forName("UTF-8"); private Class<T> clazz; static { ParserConfig.getGlobalInstance().setAutoTypeSupport(true); } public FastJsonRedisSerializer(Class<T> clazz) { super(); this.clazz = clazz; } @Override public byte[] serialize(T t) throws SerializationException { if (t == null) { return new byte[0]; } return JSON.toJSONString(t, SerializerFeature.WriteClassName).getBytes(DEFAULT_CHARSET); } @Override public T deserialize(byte[] bytes) throws SerializationException { if (bytes == null || bytes.length <= 0) { return null; } String str = new String(bytes, DEFAULT_CHARSET); return JSON.parseObject(str, clazz); } protected JavaType getJavaType(Class<?> clazz) { return TypeFactory.defaultInstance().constructType(clazz); } }
JwtUtil工具类
package com.sangeng.Utils; import io.jsonwebtoken.Claims; import io.jsonwebtoken.JwtBuilder; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; import java.util.Date; import java.util.UUID; /** * JWT工具类 */ public class JwtUtil { //有效期为 public static final Long JWT_TTL = 60*60*1000L;//60*60*1000 一个小时 //设置秘钥明文 public static final String JWT_KEY="sangeng"; public static String getUUID(){ String token = UUID.randomUUID().toString().replace("-", ""); return token; } /** * 生成jtw * @param subject token中存放的数据(json) * @return */ public static String createJWT(String subject){ JwtBuilder builder = getJwtBuilder(subject, null, getUUID());//设置过期时间 return builder.compact(); } /** * 生成jtw * @param subject token中要存放的数据(json格式) * @param ttlMillis token超过时间 * @return */ public static String createJWT(String subject,Long ttlMillis){ JwtBuilder jwtBuilder = getJwtBuilder(subject, ttlMillis, getUUID()); return jwtBuilder.compact(); } private static JwtBuilder getJwtBuilder(String subject,Long ttlMillis,String uuid){ SignatureAlgorithm signatureAlgorithm=SignatureAlgorithm.HS256; SecretKey secretKey = generalkey(); long nowMillis = System.currentTimeMillis(); Date now = new Date(nowMillis); if (ttlMillis==null){ ttlMillis=JwtUtil.JWT_TTL; } long expMillis = nowMillis + ttlMillis; Date expDate = new Date(expMillis); return Jwts.builder() .setId(uuid)//唯一的ID .setSubject(subject)//主题 可以是JSON .setIssuer("sg")//签发者 .setIssuedAt(now)//签发时间 .signWith(signatureAlgorithm,secretKey)//使用HS256对称加密算法签名 第二个参数为秘钥 .setExpiration(expDate); } public static String createJWT(String id,String subject,Long ttlMillis){ JwtBuilder builder = getJwtBuilder(subject, ttlMillis, id);//设置过期时间 return builder.compact(); } public static void main(String[] args) { String token="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI1YzE0Zjk1ZDUzZDE0OTUzODliYjUxNDE1YTU5YWY2MiIsInN1YiI6IjEiLCJpc3MiOiJzZyIsImlhdCI6MTY3NTgzMzA4MiwiZXhwIjoxNjc1ODM2NjgyfQ.d9Id5JPyiqqvh5poa3tCrYMHgflFfURaLk752d6Zgy0"; Claims claims = parseJWT(token); String subject = claims.getSubject(); System.out.println(subject); } public static SecretKey generalkey(){ byte[] encodedKey = Base64.getDecoder().decode(JwtUtil.JWT_KEY); SecretKeySpec key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES"); return key; } /** * 解析 * @param jwt * @return */ public static Claims parseJWT(String jwt){ SecretKey secretKey = generalkey(); return Jwts.parser() .setSigningKey(secretKey) .parseClaimsJws(jwt) .getBody(); } }
RedisCache工具类
package com.sangeng.Utils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.BoundSetOperations; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.stereotype.Component; import java.util.*; import java.util.concurrent.TimeUnit; @SuppressWarnings(value = {"unchecked","rawtypes"}) @Component public class RedisCache { @Autowired public RedisTemplate redisTemplate; /** * 缓存基本的对象 Integer、String、实体类等 * @param key 缓存的键值 * @param value 缓存的值 * @param <T> */ public <T> void setCacheObject(final String key,final T value){ redisTemplate.opsForValue().set(key,value); } /** * 缓存基本的对象 Integer、String、实体类等 * @param key 缓存的键值 * @param value 缓存的值 * @param timeout 时间 * @param timeUnit 时间颗粒度 */ public <T> void setCacheObject(final String key, final T value, final Integer timeout, final TimeUnit timeUnit){ redisTemplate.opsForValue().set(key,value,timeout,timeUnit); } /** * 设置有效时间 * @param key Redis键 * @param timeout 超时时间 * @return true=设置成功;false=设置失败 */ public boolean expire(final String key,final long timeout){ return expire(key, timeout,TimeUnit.SECONDS); } /** * 设置有效时间 * @param key Redis键 * @param timeout 超时时间 * @param unit 时间单位 * @return true=设置成功 false=设置失败 */ public boolean expire(final String key,final long timeout,final TimeUnit unit){ return redisTemplate.expire(key,timeout,unit); } /** * 获得缓存的基本对象 * @param key 缓存键值 * @param <T> 缓存键值对应的数据 */ public <T> T getCacheObject(final String key){ ValueOperations<String,T> operation = redisTemplate.opsForValue(); return operation.get(key); } /** * 删除单个对象 * @param key * @return */ public boolean deleteObject(final String key){ return redisTemplate.delete(key); } /** * 删除集合对象 * @param collection 多个对象 * @return */ public long deleteObject(final Collection collection){ return redisTemplate.delete(collection); } /** * 缓存List数据 * @param key 缓存的键值 * @param dataList 待缓存的List数据 * @param <T> * @return 缓存的对象 */ public <T> long setCacheList(final String key, final List<T> dataList){ Long count = redisTemplate.opsForList().rightPushAll(key, dataList); return count==null?0:count; } /** * 获得缓存的list对象 * @param key 缓存的键值 * @param <T> * @return 缓存键值对应的数据 */ public <T> List<T> getCacheList(final String key){ return redisTemplate.opsForList().range(key,0,-1); } /** * 缓存Set * @param key 缓存键值 * @param dataSet 缓存的数据 * @param <T> * @return 缓存数据的对象 */ public <T> BoundSetOperations<String, T> setCacheSet(final String key,final Set<T> dataSet){ BoundSetOperations<String,T> setOperations = redisTemplate.boundSetOps(key); Iterator<T> it = dataSet.iterator(); while (it.hasNext()){ setOperations.add(it.next()); } return setOperations; } /** * 获取缓存的set * @param key * @param <T> * @return */ public <T> Set<T> getCacheSet(final String key){ return redisTemplate.opsForSet().members(key); } /** * 缓存Map * @param key * @param dataMap * @param <T> */ public <T> void setCachcheMap(final String key, final Map<String,T> dataMap){ if (dataMap !=null){ redisTemplate.opsForHash().putAll(key,dataMap); } } /** * 获取缓存的Map * @param key * @param <T> * @return */ public <T> Map<String,T> getCacheMap(final String key){ return redisTemplate.opsForHash().entries(key); } /** * 往Hash中存入数据 * @param key Redis键 * @param hKey Hash键 * @param value 值 * @param <T> */ public <T> void setCacheMapValue(final String key,final String hKey,final T value){ redisTemplate.opsForHash().put(key,hKey,value); } /** * 删除Hash中的数据 * @param key * @param hkey */ public void delCacheMapValue(final String key,final String hkey){ HashOperations hashOperations = redisTemplate.opsForHash(); hashOperations.delete(key,hkey); } /** * 获取多个Hash中的数据 * @param key Redis键 * @param hKeys Hash键集合 * @param <T> * @return Hash对象集合 */ public <T> List<T> getMultiCacheMapValue(final String key,final Collection<Object> hKeys){ return redisTemplate.opsForHash().multiGet(key,hKeys); } /** * 获得缓存的基本对象列表 * @param patterm 字符串前缀 * @return 对象列表 */ public Collection<String> keys(final String patterm){ return redisTemplate.keys(patterm); } }
WebUtils 工具类
package com.sangeng.Utils; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class WebUtils { /** * 将字符串渲染到客户端的 * @param response 渲染对象 * @param string 待渲染的字符串 * @return */ public static String renderString(HttpServletResponse response,String string){ try { response.setStatus(200); response.setContentType("application/json"); response.setCharacterEncoding("utf-8"); response.getWriter().println(string); }catch (IOException e){ e.printStackTrace(); } return null; } }
Config包
RedisConfig
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Bean @SuppressWarnings(value = { "unchecked", "rawtypes" }) public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); FastJsonRedisSerializer serializer = new FastJsonRedisSerializer(Object.class); // 使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(serializer); // Hash的key也采用StringRedisSerializer的序列化方式 template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(serializer); template.afterPropertiesSet(); return template; } }
ResponseResult
package com.sangeng.config; import com.fasterxml.jackson.annotation.JsonInclude; @JsonInclude(JsonInclude.Include.NON_NULL) public class ResponseResult<T> { /** * 状态码 */ private Integer code; /** * 提示信息,如果有错误时,前端可以获取该字段进行提示 */ private String msg; /** * 查询到的结果数据, */ private T data; public ResponseResult(Integer code, String msg) { this.code = code; this.msg = msg; } public ResponseResult(Integer code, T data) { this.code = code; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } public ResponseResult(Integer code, String msg, T data) { this.code = code; this.msg = msg; this.data = data; } }
实体类
ResponseResult实体类
package com.sangeng.domain; import com.fasterxml.jackson.annotation.JsonInclude; /** * */ @JsonInclude(JsonInclude.Include.NON_NULL) public class ResponseResult<T> { /** * 状态码 */ private Integer code; /** * 提示信息,如果有错误时,前端可以获取该字段进行提示 */ private String msg; /** * 查询到的结果数据, */ private T data; public ResponseResult(Integer code, String msg) { this.code = code; this.msg = msg; } public ResponseResult(Integer code, T data) { this.code = code; this.data = data; } public Integer getCode() { return code; } public void setCode(Integer code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public T getData() { return data; } public void setData(T data) { this.data = data; } public ResponseResult(Integer code, String msg, T data) { this.code = code; this.msg = msg; this.data = data; } }
User 实体类
package com.sangeng.domain; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.io.Serializable; import java.util.Date; /** * 用户表(User)实体类 * * @author */ @Data @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { private static final long serialVersionUID = -40356785423868312L; /** * 主键 */ private Long id; /** * 用户名 */ private String userName; /** * 昵称 */ private String nickName; /** * 密码 */ private String password; /** * 账号状态(0正常 1停用) */ private String status; /** * 邮箱 */ private String email; /** * 手机号 */ private String phonenumber; /** * 用户性别(0男,1女,2未知) */ private String sex; /** * 头像 */ private String avatar; /** * 用户类型(0管理员,1普通用户) */ private String userType; /** * 创建人的用户id */ private Long createBy; /** * 创建时间 */ private Date createTime; /** * 更新人 */ private Long updateBy; /** * 更新时间 */ private Date updateTime; /** * 删除标志(0代表未删除,1代表已删除) */ private Integer delFlag; }