• 黑马头条项目环境搭建


     

     

    注册中心网关配置

    1. spring:
    2. cloud:
    3. gateway:
    4. globalcors:
    5. add-to-simple-url-handler-mapping: true
    6. corsConfigurations:
    7. '[/**]':
    8. allowedHeaders: "*"
    9. allowedOrigins: "*"
    10. allowedMethods:
    11. - GET
    12. - POST
    13. - DELETE
    14. - PUT
    15. - OPTION
    16. routes:
    17. # 平台管理
    18. - id: user
    19. uri: lb://leadnews-user
    20. predicates:
    21. - Path=/user/**
    22. filters:
    23. - StripPrefix= 1

    gateway网关校验token

    1. package com.heima.app.gateway.filter;
    2. import com.alibaba.cloud.commons.lang.StringUtils;
    3. import com.heima.app.gateway.utils.AppJwtUtil;
    4. import io.jsonwebtoken.Claims;
    5. import lombok.extern.slf4j.Slf4j;
    6. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    7. import org.springframework.cloud.gateway.filter.GlobalFilter;
    8. import org.springframework.core.Ordered;
    9. import org.springframework.http.HttpStatus;
    10. import org.springframework.http.server.reactive.ServerHttpRequest;
    11. import org.springframework.http.server.reactive.ServerHttpResponse;
    12. import org.springframework.stereotype.Component;
    13. import org.springframework.web.server.ServerWebExchange;
    14. import reactor.core.publisher.Mono;
    15. @Component
    16. @Slf4j
    17. public class AuthorizeFilter implements Ordered, GlobalFilter {
    18. @Override
    19. public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    20. //1.拿到request和response对象
    21. ServerHttpRequest request = exchange.getRequest();
    22. ServerHttpResponse response = exchange.getResponse();
    23. //2.判断是否登录微服务
    24. boolean contains = request.getURI().getPath().contains("/login");
    25. if (contains){
    26. //放行
    27. return chain.filter(exchange);
    28. }
    29. //3.获取token
    30. String token = request.getHeaders().getFirst("token");
    31. //4.判断token是否存在
    32. //不能为null,"" 和" ";有一个就是true否则false
    33. if (StringUtils.isBlank(token)){
    34. //为空 返回校验失败401
    35. response.setStatusCode(HttpStatus.UNAUTHORIZED);
    36. //结束当前请求,不放行
    37. return response.setComplete();
    38. }
    39. //5.判断token是否有效
    40. try {
    41. Claims claimsBody = AppJwtUtil.getClaimsBody(token);
    42. int result = AppJwtUtil.verifyToken(claimsBody);
    43. //-1:有效,0:有效,1:过期,2:过期
    44. if (result==1||result==2){
    45. //过期
    46. response.setStatusCode(HttpStatus.UNAUTHORIZED);
    47. return response.setComplete();
    48. }
    49. } catch (Exception e) {
    50. //解析token失败
    51. e.printStackTrace();
    52. response.setStatusCode(HttpStatus.UNAUTHORIZED);
    53. return response.setComplete();
    54. }
    55. //6.放行,解析成功了,验证成功,放行
    56. return chain.filter(exchange);
    57. }
    58. /**
    59. * 优先级设置,值越小优先级越高
    60. * @return
    61. */
    62. @Override
    63. public int getOrder() {
    64. return 0;
    65. }
    66. }

    导入的jwt依赖

    1. io.jsonwebtoken
    2. jjwt
    3. 0.9.1

    token封装工具类

    1. package com.heima.utils.common;
    2. import io.jsonwebtoken.*;
    3. import javax.crypto.SecretKey;
    4. import javax.crypto.spec.SecretKeySpec;
    5. import java.util.*;
    6. public class AppJwtUtil {
    7. // TOKEN的有效期一天(S)
    8. private static final int TOKEN_TIME_OUT = 3_600;
    9. // 加密KEY
    10. private static final String TOKEN_ENCRY_KEY = "MDk4ZjZiY2Q0NjIxZDM3M2NhZGU0ZTgzMjYyN2I0ZjY";
    11. // 最小刷新间隔(S)
    12. private static final int REFRESH_TIME = 300;
    13. // 生产ID
    14. public static String getToken(Long id){
    15. Map claimMaps = new HashMap<>();
    16. claimMaps.put("id",id);
    17. long currentTime = System.currentTimeMillis();
    18. return Jwts.builder()
    19. .setId(UUID.randomUUID().toString())
    20. .setIssuedAt(new Date(currentTime)) //签发时间
    21. .setSubject("system") //说明
    22. .setIssuer("heima") //签发者信息
    23. .setAudience("app") //接收用户
    24. .compressWith(CompressionCodecs.GZIP) //数据压缩方式
    25. .signWith(SignatureAlgorithm.HS512, generalKey()) //加密方式
    26. .setExpiration(new Date(currentTime + TOKEN_TIME_OUT * 1000)) //过期时间戳
    27. .addClaims(claimMaps) //cla信息
    28. .compact();
    29. }
    30. /**
    31. * 获取token中的claims信息
    32. *
    33. * @param token
    34. * @return
    35. */
    36. private static Jws getJws(String token) {
    37. return Jwts.parser()
    38. .setSigningKey(generalKey())
    39. .parseClaimsJws(token);
    40. }
    41. /**
    42. * 获取payload body信息
    43. *
    44. * @param token
    45. * @return
    46. */
    47. public static Claims getClaimsBody(String token) {
    48. try {
    49. return getJws(token).getBody();
    50. }catch (ExpiredJwtException e){
    51. return null;
    52. }
    53. }
    54. /**
    55. * 获取hearder body信息
    56. *
    57. * @param token
    58. * @return
    59. */
    60. public static JwsHeader getHeaderBody(String token) {
    61. return getJws(token).getHeader();
    62. }
    63. /**
    64. * 是否过期
    65. *
    66. * @param claims
    67. * @return -1:有效,0:有效,1:过期,2:过期
    68. */
    69. public static int verifyToken(Claims claims) {
    70. if(claims==null){
    71. return 1;
    72. }
    73. try {
    74. claims.getExpiration()
    75. .before(new Date());
    76. // 需要自动刷新TOKEN
    77. if((claims.getExpiration().getTime()-System.currentTimeMillis())>REFRESH_TIME*1000){
    78. return -1;
    79. }else {
    80. return 0;
    81. }
    82. } catch (ExpiredJwtException ex) {
    83. return 1;
    84. }catch (Exception e){
    85. return 2;
    86. }
    87. }
    88. /**
    89. * 由字符串生成加密key
    90. *
    91. * @return
    92. */
    93. public static SecretKey generalKey() {
    94. byte[] encodedKey = Base64.getEncoder().encode(TOKEN_ENCRY_KEY.getBytes());
    95. SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");
    96. return key;
    97. }
    98. public static void main(String[] args) {
    99. /* Map map = new HashMap();
    100. map.put("id","11");*/
    101. System.out.println(AppJwtUtil.getToken(1102L));
    102. Jws jws = AppJwtUtil.getJws("eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQqEMAwA_5KzhURNt_qb1KZYQSi0wi6Lf9942NsMw3zh6AVW2DYmDGl2WabkZgreCaM6VXzhFBfJMcMARTqsxIG9Z888QLui3e3Tup5Pb81013KKmVzJTGo11nf9n8v4nMUaEY73DzTabjmDAAAA.4SuqQ42IGqCgBai6qd4RaVpVxTlZIWC826QA9kLvt9d-yVUw82gU47HDaSfOzgAcloZedYNNpUcd18Ne8vvjQA");
    103. Claims claims = jws.getBody();
    104. System.out.println(claims.get("id"));
    105. }
    106. }

  • 相关阅读:
    【Kubernetes快速实战】
    Day131.MySQL高级:索引、Explain索引分析、索引优化 | 失效情况
    计算机毕业设计 | SpringBoot+vue的家庭理财 财务管理系统(附源码)
    【MapStruct】对象转换
    代碼隨想錄算法訓練營|第四十五天|1049. 最后一块石头的重量 II、494. 目标和、474.一和零。刷题心得(c++)
    hive-学习微博日志分析
    【Verilog基础】【总线协议】AHB和AHB-Lite的区别?AMBA2.0和AMBA3.0的区别?
    图像主题颜色提取(Median cut)
    pandas学习笔记
    自然语言处理(NLP)
  • 原文地址:https://blog.csdn.net/qq_53374893/article/details/133468619