| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.doumee.config.jwt; |
| | | |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; |
| | | import com.doumee.biz.system.SystemDictDataBiz; |
| | | import com.doumee.service.business.third.model.LoginUserInfo; |
| | | import com.doumee.core.utils.Constants; |
| | | import com.doumee.core.utils.HttpsUtil; |
| | | import com.doumee.dao.system.SystemUserMapper; |
| | | import com.doumee.dao.system.model.SystemUser; |
| | | import io.jsonwebtoken.Jwts; |
| | | import io.jsonwebtoken.SignatureAlgorithm; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.apache.http.HttpEntity; |
| | | import org.apache.http.HttpResponse; |
| | | import org.apache.http.client.HttpClient; |
| | | import org.apache.http.client.methods.HttpGet; |
| | | import org.apache.http.impl.client.HttpClientBuilder; |
| | | import org.apache.http.util.EntityUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | | import org.springframework.data.redis.core.RedisTemplate; |
| | | import org.springframework.stereotype.Component; |
| | | |
| | | import javax.annotation.Resource; |
| | | import java.io.IOException; |
| | | import java.util.Date; |
| | | import java.util.HashMap; |
| | | import java.util.Map; |
| | | import java.util.concurrent.TimeUnit; |
| | | |
| | | @Component |
| | | @Slf4j |
| | | public class JwtTokenUtil { |
| | | |
| | | @Autowired |
| | | private RedisTemplate<String,Object> redisTemplate; |
| | | @Resource |
| | | private JwtProperties jwtProperties; |
| | | @Autowired |
| | | private SystemDictDataBiz systemDictDataBiz ; |
| | | @Autowired |
| | | private SystemUserMapper systemUserMapper; |
| | | /** |
| | | * çætoken令ç |
| | | * |
| | | * @param payloads 令ç䏿ºå¸¦çéå ä¿¡æ¯ |
| | | * @return 令tokenç |
| | | */ |
| | | public String generateToken( LoginUserInfo payloads) { |
| | | if(payloads == null){ |
| | | return null; |
| | | } |
| | | payloads.setLoginDate(new Date()); |
| | | Map<String,Object> map = new HashMap<>(); |
| | | map.put("id",payloads.getId()); |
| | | // Map<String,Object> map = BeanUtil.beanToMap(payloads); |
| | | return generateTokenDo(payloads); |
| | | } |
| | | |
| | | /** |
| | | * ä»ä»¤çä¸è·åç¨æ·å |
| | | * |
| | | * @param token 令ç |
| | | * @return ç¨æ·å |
| | | */ |
| | | public String getUsernameFromToken(String token) { |
| | | String username; |
| | | try { |
| | | LoginUserInfo claims = getClaimsFromToken(token); |
| | | username = claims.getUsername(); |
| | | } catch (Exception e) { |
| | | username = null; |
| | | } |
| | | return username; |
| | | } |
| | | public LoginUserInfo getUserInfoByToken(String token) { |
| | | try { |
| | | LoginUserInfo claims = getClaimsFromToken(token); |
| | | return claims; |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | return null; |
| | | } |
| | | |
| | | /** |
| | | * å¤æä»¤çæ¯å¦è¿æ |
| | | * |
| | | * @param token 令ç |
| | | * @return æ¯å¦è¿æ |
| | | */ |
| | | public Boolean isTokenExpired(String token) { |
| | | try { |
| | | LoginUserInfo claims = getClaimsFromToken(token); |
| | | Date expiration = //claims.getLoginDate(); |
| | | new Date(claims.getLoginDate().getTime() + jwtProperties.getExpiration()); |
| | | return expiration.before(new Date()); |
| | | } catch (Exception e) { |
| | | //éªè¯JWTç¾å失败çåäºä»¤çè¿æ |
| | | return true; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * å·æ°ä»¤ç |
| | | * |
| | | * @param token å令ç |
| | | * @return æ°ä»¤ç |
| | | */ |
| | | public String refreshToken(String token) { |
| | | String refreshedToken; |
| | | try { |
| | | LoginUserInfo claims = getClaimsFromToken(token); |
| | | claims.setLoginDate(new Date()); |
| | | refreshedToken = generateTokenDo(claims); |
| | | if(refreshedToken!=null){ |
| | | redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token);//å é¤èçtoken |
| | | } |
| | | } catch (Exception e) { |
| | | refreshedToken = null; |
| | | } |
| | | return refreshedToken; |
| | | } |
| | | /** |
| | | * éåºç»é |
| | | * |
| | | * @param token å令ç |
| | | * @return æ°ä»¤ç |
| | | */ |
| | | public void logout(String token) { |
| | | try { |
| | | //ç»åºæµ·åº·ç³»ç»æ°æ® |
| | | LoginUserInfo loginUserInfo = this.getUserInfoByToken(token); |
| | | String url = systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_HTTPS).getCode() + |
| | | systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.HK_HOST).getCode() + |
| | | systemDictDataBiz.queryByCode(Constants.HK_PARAM,Constants.LOGIN_OUT_URL).getCode(); |
| | | if(StringUtils.isNotBlank(loginUserInfo.getHkMenuToken())){ |
| | | log.info("è°èµ·æµ·åº·éåºç»å½=======================>"+url+"?token="+loginUserInfo.getHkMenuToken()); |
| | | // this.hkLoginOut(url+"?token="+loginUserInfo.getHkMenuToken()); |
| | | HttpsUtil.get(url+"?token="+loginUserInfo.getHkMenuToken(),true); |
| | | } |
| | | //å é¤èçtoken |
| | | redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token); |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | public void logoutForH5(String token) { |
| | | try { |
| | | //ç»åºæµ·åº·ç³»ç»æ°æ® |
| | | LoginUserInfo loginUserInfo = this.getUserInfoByToken(token); |
| | | //å é¤èçtoken |
| | | redisTemplate.delete(Constants.REDIS_TOKEN_KEY+token); |
| | | systemUserMapper.update(null,new UpdateWrapper<SystemUser>().lambda().set(SystemUser::getOpenid,null) |
| | | .eq(SystemUser::getId,loginUserInfo.getId())); |
| | | |
| | | } catch (Exception e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | public void hkLoginOut(String url){ |
| | | try { |
| | | // å建HttpClient对象 |
| | | HttpClient httpClient = HttpClientBuilder.create().build(); |
| | | // å建HttpGetå¯¹è±¡ï¼æå®è¦è®¿é®çURLå°å |
| | | HttpGet httpGet = new HttpGet(url); |
| | | // åéGET请æ±ï¼è·åååº |
| | | HttpResponse response = httpClient.execute(httpGet); |
| | | // è·åååºç¶æç |
| | | int statusCode = response.getStatusLine().getStatusCode(); |
| | | // å¤æè¯·æ±æ¯å¦æå |
| | | if (statusCode == 200) { |
| | | // è·åååºå
容 |
| | | HttpEntity entity = response.getEntity(); |
| | | String responseContent = EntityUtils.toString(entity, "UTF-8"); |
| | | System.out.println(responseContent); |
| | | log.info("è°èµ·æµ·åº·éåºç»å½è¿åä¿¡æ¯=======================>"+responseContent); |
| | | } else { |
| | | System.out.println("请æ±å¤±è´¥ï¼ååºç ï¼" + statusCode); |
| | | } |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | |
| | | |
| | | /** |
| | | * éªè¯ä»¤ç |
| | | * |
| | | * @param token 令ç |
| | | * @param userId ç¨æ·Idç¨æ·å |
| | | * @return æ¯å¦ææ |
| | | */ |
| | | public Boolean validateToken(String token, String userId) { |
| | | |
| | | String username = getUsernameFromToken(token); |
| | | return (username.equals(userId) && !isTokenExpired(token)); |
| | | } |
| | | |
| | | |
| | | /** |
| | | * ä»claimsçæä»¤ç,妿ç䏿就çè°è°ç¨å® |
| | | * |
| | | * @return 令ç |
| | | */ |
| | | private String generateTokenDo(LoginUserInfo userInfo) { |
| | | Map<String, Object> claims = new HashMap<>(); |
| | | claims.put("id",userInfo.getId()); |
| | | Date expirationDate = new Date(System.currentTimeMillis() + jwtProperties.getExpiration()); |
| | | String token = Jwts.builder().setClaims(claims) |
| | | .setExpiration(expirationDate) |
| | | .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret()) |
| | | .compact(); |
| | | redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,JSONObject.toJSONString(userInfo),jwtProperties.getExpiration(), TimeUnit.MILLISECONDS); |
| | | return token; |
| | | } |
| | | |
| | | |
| | | /** |
| | | * ä»ä»¤çä¸è·åæ°æ®å£°æ,éªè¯JWTç¾å |
| | | * |
| | | * @param token 令ç |
| | | * @return æ°æ®å£°æ |
| | | */ |
| | | private LoginUserInfo getClaimsFromToken(String token) { |
| | | LoginUserInfo claims; |
| | | try { |
| | | String userInfo = (String) redisTemplate.opsForValue().get(Constants.REDIS_TOKEN_KEY+token); |
| | | claims = JSONObject.toJavaObject(JSONObject.parseObject(userInfo),LoginUserInfo.class); |
| | | } catch (Exception e) { |
| | | claims = null; |
| | | } |
| | | return claims; |
| | | } |
| | | |
| | | /** |
| | | * ååå»¶ä¼¸æææä¿æä¼è¯ç»§ç» |
| | | * @param token |
| | | */ |
| | | |
| | | public void refreshTokenTime(String token ) { |
| | | redisTemplate.expire(Constants.REDIS_TOKEN_KEY+token,jwtProperties.getExpiration(), TimeUnit.MILLISECONDS); |
| | | // redisTemplate.opsForValue().set(Constants.REDIS_TOKEN_KEY+token,usrerInfo,jwtProperties.getExpiration(), TimeUnit.MILLISECONDS); |
| | | } |
| | | } |