SpringCloud利用网关拦截做Token验证(JWT方式)

2023-11-10

关于JWT的内容,请看以下链接,主要看它的原理,以及缺点!

https://blog.csdn.net/memmsc/article/details/78122931

步骤1:前端传userName+password到后端,后端为springcloud架构,经过网关的拦截器拦截请求,拦截器在项目启动的时候@Component进行加载。

步骤2:如果是第一次登陆,放行,进入JWT的加密生成Token阶段(还可以写入登陆用户的其他信息放在JWTmap中,之后可以利用Token来获取该用户信息),加密token需要一个随机数作为加密字段,将token的失效时间设置为一天,并且放到reids里面,设置该redis里面的token过期时间为30分钟,最后将Token返回给前端。

步骤3:以后任何的请求都带Token到后端去请求。

步骤4:拦截到非登陆请求,进行解密,鉴权,如果鉴权通过,更新redis里面token字段的失效时间,如果还有5分钟失效,再设置还有30分钟,目的就是让密码的过期时间变的活跃。

大致就是以上的过程,核心代码主要在网关拦截器解密鉴权和登陆接口的加密两部分

0,controller层的将得到的token做保存redis和设置过期时间的操作


 
 
  1. compactJws = authService.generateJwt(username, password, userBean);
  2. //将token存在redis里
  3. stringRedisTemplate.opsForValue(). set( "token", compactJws);
  4. //设置redis里面的数据失效时间为半小时
  5. stringRedisTemplate.expire( "token", 1800, TimeUnit. SECONDS);

1,登陆接口的加密:


 
 
  1. package com.movitech.user.service.imp;
  2. import com.movitech.commons.entity.UserBean;
  3. import com.movitech.commons.utils.CommonConstants;
  4. import com.movitech.user.service.AuthService;
  5. import io.jsonwebtoken.Jwts;
  6. import io.jsonwebtoken.SignatureAlgorithm;
  7. import org.joda.time.DateTime;
  8. import org.springframework.stereotype.Service;
  9. import java.util.Base64;
  10. import java.util.HashMap;
  11. import java.util.Map;
  12. /**
  13. * 用户身份验证Service
  14. */
  15. @ Service(value = "authService")
  16. public class AuthServiceImpl implements AuthService {
  17. @ Override
  18. public String generateJwt( String userName, String userPassword, UserBean userBean) {
  19. // Base64编码后的secretKey
  20. byte[] secretKey = Base64.getEncoder().encode( CommonConstants. SECURITY_KEY.getBytes());
  21. // 设置失效时间
  22. DateTime expirationDate = new DateTime().plusDays( 1);
  23. //DateTime expirationDate = new DateTime().plusMinutes(30);
  24. // Claims是需要保存到token中的信息,可以自定义,需要存什么就放什么,会保存到token的payload中
  25. Map< String, Object> claims = new HashMap<>();
  26. // 用户角色
  27. claims.put( "role", "user");
  28. // 用户名
  29. claims.put( "userName", userName);
  30. claims.put( CommonConstants. USER_ID, userBean.getId());
  31. claims.put( "uuid", UUID.randomUUID(). toString());
  32. String compactJws = Jwts.builder()
  33. // 设置subject,一般是用户的唯一标识,比如用户对象的ID,用户名等,目前设置的是userCode
  34. .setSubject(userName)
  35. // 设置失效时间
  36. .setExpiration(expirationDate.toDate())
  37. .addClaims(claims)
  38. // 加密算法是HS512,加密解密统一就可以
  39. .signWith( SignatureAlgorithm. HS512, secretKey)
  40. .compact();
  41. return compactJws;
  42. }
  43. }

以上常量类和pojo此处省略。。。。

2,网关拦截器解密鉴权:


 
 
  1. package com.movitech.gateway.filter;
  2. import com.movitech.commons.dto.ErrorResponseMap;
  3. import com.movitech.commons.enums.ErrorCode;
  4. import com.movitech.commons.utils.CommonConstants;
  5. import com.movitech.commons.utils.JsonUtil;
  6. import com.movitech.commons.utils.ResponseUtil;
  7. import com.netflix.zuul.ZuulFilter;
  8. import com.netflix.zuul.context.RequestContext;
  9. import io.jsonwebtoken.*;
  10. import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
  11. import org.springframework.http.HttpHeaders;
  12. import org.springframework.http.HttpMethod;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.util.StringUtils;
  15. import javax.servlet.http.HttpServletRequest;
  16. import java.util.Base64;
  17. @Component
  18. public class SecurityFilter extends ZuulFilter {
  19. @Override
  20. public String filterType() {
  21. return FilterConstants.PRE_TYPE;
  22. }
  23. @Override
  24. public int filterOrder() {
  25. return FilterConstants.PRE_DECORATION_FILTER_ORDER - 1;
  26. }
  27. @Override
  28. public boolean shouldFilter() {
  29. RequestContext ctx = RequestContext.getCurrentContext();
  30. HttpServletRequest request = ctx.getRequest();
  31. if (request.getRequestURL().toString().contains( "loginInfo") || request.getRequestURL().toString().contains( "info")) {
  32. return false;
  33. }
  34. // TODO
  35. return true;
  36. }
  37. @Override
  38. public Object run() {
  39. RequestContext ctx = RequestContext.getCurrentContext();
  40. HttpServletRequest request = ctx.getRequest();
  41. final String authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
  42. if (HttpMethod.OPTIONS.name().equals(request.getMethod())) {
  43. return null;
  44. } else {
  45. if (StringUtils.isEmpty(authorizationHeader) || !authorizationHeader.startsWith(CommonConstants.BEARER)) {
  46. // Missing or invalid Authorization header
  47. ErrorResponseMap errorResponseMap = ResponseUtil.createErrorResponse( null, "Missing or invalid Authorization header!",
  48. ErrorCode.INVALID_AUTHORIZATION_HEADER, request, null);
  49. denyAccess(ctx,errorResponseMap);
  50. return JsonUtil.serializeToString(errorResponseMap);
  51. }
  52. final String token = authorizationHeader.substring( 7);
  53. try {
  54. byte[] secretKey = Base64.getEncoder().encode(CommonConstants.SECURITY_KEY.getBytes());
  55. Claims claims = Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
  56. if (claims != null) {
  57. //获取redis里面数据的存活时间
  58. Long expirationDate = stringRedisTemplate.getExpire( "token",TimeUnit.SECONDS);
  59. //如果还剩余5分钟,重置redis里面数据的存活时间
  60. if(expirationDate > 300){
  61. stringRedisTemplate.expire( "token", 1800,TimeUnit.SECONDS);
  62. } else {
  63. ErrorResponseMap errorResponseMap = new ErrorResponseMap();
  64. Error error = new Error( null, "Token expired!", "", 1003, "");
  65. errorResponseMap.setSuccess( false);
  66. errorResponseMap.setMessage( null);
  67. errorResponseMap.setError(error);
  68. denyAccess(ctx,errorResponseMap);
  69. return JsonUtil.serializeToString(errorResponseMap);
  70. }
  71. String userName = (String) claims. get(CommonConstants.USER_CODE);
  72. Integer userId = (Integer) claims. get(CommonConstants.USER_ID);
  73. ctx.addZuulRequestHeader(CommonConstants.USER_CODE, userName);
  74. ctx.addZuulRequestHeader(CommonConstants.USER_ID, String.valueOf(userId));
  75. }
  76. } catch (MalformedJwtException ex) {
  77. ErrorResponseMap errorResponseMap = ResponseUtil.createErrorResponse( null, "Invalid token!",
  78. ErrorCode.INVALID_AUTHORIZATION_HEADER, request, ex);
  79. denyAccess(ctx,errorResponseMap);
  80. return JsonUtil.serializeToString(errorResponseMap);
  81. } catch (SignatureException ex) {
  82. ErrorResponseMap errorResponseMap = ResponseUtil.createErrorResponse( null, "Token Signature error!",
  83. ErrorCode.SIGNATURE_EXCEPTION, request, ex);
  84. denyAccess(ctx,errorResponseMap);
  85. return JsonUtil.serializeToString(errorResponseMap);
  86. } catch (ExpiredJwtException ex) {
  87. ErrorResponseMap errorResponseMap = ResponseUtil.createErrorResponse( null, "Token expired!",
  88. ErrorCode.EXPIRED_JWT_EXCEPTION, request, ex);
  89. denyAccess(ctx,errorResponseMap);
  90. return JsonUtil.serializeToString(errorResponseMap);
  91. }
  92. }
  93. return null;
  94. }
  95. private void denyAccess(RequestContext ctx, ErrorResponseMap authResult) {
  96. String result = JsonUtil.serializeToString(authResult);
  97. ctx.setSendZuulResponse( false);
  98. ctx.setResponseStatusCode( 401);
  99. try {
  100. ctx.getResponse().getWriter().write(result);
  101. } catch (Exception e){}
  102. }
  103. }

以上代码是核心代码,下面是自己项目中涉及到的异常包装类,以及util类,可以不管下面的,直接去封装

 

以上涉及到的类:

(1)ErrorResponseMap


 
 
  1. package com .movitech .commons .dto;
  2. import com .fasterxml .jackson .annotation .JsonProperty;
  3. import com .movitech .commons .exception .Error;
  4. import lombok .Getter;
  5. import lombok .Setter;
  6. @ Getter
  7. @Setter
  8. public class ErrorResponseMap extends ResponseMap {
  9. @ JsonProperty( value = "error")
  10. private Error error;
  11. @ JsonProperty( value = "stackTrace")
  12. private String stackTrace;
  13. }

(1.1)Error


 
 
  1. package com.movitech.commons.exception;
  2. import lombok.AllArgsConstructor;
  3. import lombok.Getter;
  4. import lombok.NoArgsConstructor;
  5. import lombok.Setter;
  6. @Getter
  7. @Setter
  8. @NoArgsConstructor
  9. @AllArgsConstructor
  10. public class Error {
  11. // 标准的 Http status code
  12. private Integer httpStatusCode;
  13. // 自定义的错误说明
  14. private String errorMsg;
  15. // 异常信息
  16. private String exceptionMsg;
  17. // 自定义的错误代码
  18. private Integer errorCode;
  19. // 异常的类名
  20. private String exceptionClassName;
  21. }

(2)ErrorCode


 
 
  1. package com.movitech.commons.enums;
  2. /**
  3. * 自定义的错误代码的枚举
  4. */
  5. public enum ErrorCode {
  6. // Token 签名错误
  7. SIGNATURE_EXCEPTION( 1000),
  8. // Token 过期
  9. EXPIRED_JWT_EXCEPTION( 1001),
  10. // 无效的Authorization header
  11. INVALID_AUTHORIZATION_HEADER( 1002);
  12. private Integer errorCode;
  13. ErrorCode(Integer errorCode) {
  14. this.errorCode = errorCode;
  15. }
  16. @Override
  17. public String toString() {
  18. return errorCode.toString();
  19. }
  20. public Integer value() {
  21. return errorCode;
  22. }
  23. }

(3)JsonUtil


 
 
  1. package com.movitech.commons.utils;
  2. import com.fasterxml.jackson.core.JsonProcessingException;
  3. import com.fasterxml.jackson.databind.*;
  4. import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.util.StringUtils;
  7. import java.io.IOException;
  8. /**
  9. * Json序列化和反序列化
  10. */
  11. @Component
  12. public class JsonUtil
  13. {
  14. public static ObjectMapper mapper;
  15. /* static {
  16. dao = new ObjectMapper();
  17. dao.configure(SerializationFeature.WRAP_ROOT_VALUE,true);
  18. dao.configure(DeserializationFeature.UNWRAP_ROOT_VALUE, true);
  19. }*/
  20. public JsonUtil(Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder) {
  21. mapper = jackson2ObjectMapperBuilder.build();
  22. }
  23. public static String serializeToString(Object object) {
  24. return serializeToString( object, false);
  25. }
  26. public static String serializeToString(Object object, Boolean rootValueState) {
  27. SerializationConfig serializationConfig = mapper.getSerializationConfig();
  28. mapper.configure(SerializationFeature.WRAP_ROOT_VALUE,rootValueState);
  29. if ( object != null) {
  30. try {
  31. return mapper.writeValueAsString( object);
  32. } catch (JsonProcessingException e) {
  33. e.printStackTrace();
  34. } finally {
  35. mapper.setConfig(serializationConfig);
  36. }
  37. }
  38. return "";
  39. }
  40. public static byte[] serializeToBytes(Object object) {
  41. if ( object != null) {
  42. try {
  43. return mapper.writeValueAsBytes( object);
  44. } catch (JsonProcessingException e) {
  45. e.printStackTrace();
  46. }
  47. }
  48. return null;
  49. }
  50. /**
  51. * 反序列化Json数据
  52. * @param jsonData Json数据字符串
  53. * @param valueType 反序列化的类型
  54. * @param rootValueState 是否解析Json root name
  55. * @param <T>
  56. * @return 反序列化后的POJO
  57. */
  58. public static <T> T deserialize(String jsonData,Class<T> valueType, Boolean rootValueState) {
  59. if (StringUtils.isEmpty(jsonData) || rootValueState == null) {
  60. return null;
  61. }
  62. DeserializationConfig deserializationConfig = mapper.getDeserializationConfig();
  63. mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE,rootValueState);
  64. try {
  65. return mapper.readValue(jsonData, valueType);
  66. } catch (IOException e) {
  67. e.printStackTrace();
  68. } finally {
  69. mapper.setConfig(deserializationConfig);
  70. }
  71. return null;
  72. }
  73. /**
  74. * 反序列化Json数据,默认解析Json root name
  75. * @param jsonData Json数据字符串
  76. * @param valueType 反序列化的类型
  77. * @param <T>
  78. * @return 反序列化后的POJO
  79. */
  80. public static <T> T deserialize(String jsonData,Class<T> valueType) {
  81. return deserialize(jsonData, valueType, true);
  82. }
  83. public static JavaType getCollectionType(Class<?> collectionClass, Class<?>... elementClasses) {
  84. return mapper.getTypeFactory().constructParametricType(collectionClass, elementClasses);
  85. }
  86. /**
  87. * 用Json数据中的key获取对应的value
  88. * @param jsonString json数据字符串
  89. * @param field 需要取值的字段
  90. * @param rootValueState 是否解析Json root name
  91. * @return 字段对应的值
  92. */
  93. public static String getValue(String jsonString,String field, Boolean rootValueState) {
  94. JsonNode node = getJsonNode(jsonString,field,rootValueState);
  95. return node == null ? "" : node.toString();
  96. }
  97. /**
  98. * 用Json数据中的key获取对应的value, 默认解析Json root name
  99. * @param jsonString json数据字符串
  100. * @param field 需要取值的字段
  101. * @return 字段对应的值
  102. */
  103. public static String getValue(String jsonString,String field) {
  104. return getValue(jsonString,field, true);
  105. }
  106. /**
  107. * 用Json数据中的key获取对应的value
  108. * @param jsonString json数据字符串
  109. * @param field 需要取值的字段
  110. * @param rootValueState 是否解析Json root name
  111. * @return 字段对应的值
  112. */
  113. public static JsonNode getJsonNode(String jsonString, String field, Boolean rootValueState) {
  114. if (StringUtils.isEmpty(jsonString) || StringUtils.isEmpty(field) || rootValueState == null) {
  115. return null;
  116. }
  117. // 准备工作 传入vo请参照第一篇里面的实体。此处不再重新贴上代码 浪费大家时间
  118. JsonNode node = null; // 这里的JsonNode和XML里面的Node很像
  119. // 默认的反序列化配置
  120. DeserializationConfig deserializationConfig = mapper.getDeserializationConfig();
  121. mapper.configure(DeserializationFeature.UNWRAP_ROOT_VALUE,rootValueState);
  122. try {
  123. node = mapper.readTree(jsonString);
  124. } catch (IOException e) {
  125. e.printStackTrace();
  126. return null;
  127. } finally {
  128. mapper.setConfig(deserializationConfig);
  129. }
  130. return node. get(field) == null ? null : node. get(field);
  131. }
  132. }

(4)ResponseUtil


 
 
  1. package com.movitech.commons.utils;
  2. import com.movitech.commons.dto.ErrorResponseMap;
  3. import com.movitech.commons.enums.ErrorCode;
  4. import com.movitech.commons.exception.Error;
  5. import org.springframework.http.HttpStatus;
  6. import org.springframework.http.ResponseEntity;
  7. import javax.servlet.http.HttpServletRequest;
  8. public class ResponseUtil {
  9. public static ResponseEntity createResponseEntity(String errorMsg, ErrorCode errorCode, HttpServletRequest request, Throwable ex) {
  10. HttpStatus status = getStatus(request);
  11. ErrorResponseMap errorResponseMap = createErrorResponse(status, errorMsg, errorCode, request, ex);
  12. return new ResponseEntity<>(errorResponseMap, status);
  13. }
  14. public static ErrorResponseMap createErrorResponse(HttpStatus status, String errorMsg, ErrorCode errorCode, HttpServletRequest request, Throwable ex) {
  15. if (status == null) {
  16. status = getStatus(request);
  17. }
  18. ErrorResponseMap errorResponseMap = new ErrorResponseMap();
  19. Error error = new Error(status.value(), errorMsg, ex == null ? "" : ex.getMessage(),
  20. errorCode == null ? HttpStatus.INTERNAL_SERVER_ERROR.value() : errorCode.value(), ex == null ? "" : ex.getClass().getCanonicalName());
  21. errorResponseMap.setSuccess( false);
  22. errorResponseMap.setMessage(ex.getMessage());
  23. errorResponseMap.setError(error);
  24. // String stackTrace = StringUtils.arrayToDelimitedString(ex.getStackTrace(), "hahaha");
  25. // errorResponseMap.setStackTrace(stackTrace);
  26. return errorResponseMap;
  27. }
  28. public static HttpStatus getStatus(HttpServletRequest request) {
  29. Integer statusCode = (Integer) request.getAttribute( "javax.servlet.error.status_code");
  30. if (statusCode == null) {
  31. return HttpStatus.INTERNAL_SERVER_ERROR;
  32. }
  33. return HttpStatus.valueOf(statusCode);
  34. }
  35. }

 

文章转载自:https://blog.csdn.net/qq_34707991/article/details/82898187

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringCloud利用网关拦截做Token验证(JWT方式) 的相关文章

  • 如果测试用例失败,Selenium Web 驱动程序无法关闭 Firefox 实例

    我各位 我正在使用 junit 和 selenium web 驱动程序 2 28 问题是 如果我运行成功的测试用例 Web 驱动器能够关闭 Firefox 实例 但是当测试用例失败时 Selenium Web 驱动器无法关闭 Firefox
  • 如何将 Java 赋值表达式转换为 Kotlin

    java中的一些东西就像 int a 1 b 2 c 1 if a b c System out print true 现在它应该转换为 kotlin 就像 var a Int 1 var b Int 2 var c Int 1 if a
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • 如何查找 Android 设备中的所有文件并将它们放入列表中?

    我正在寻求帮助来列出 Android 外部存储设备中的所有文件 我想查找所有文件夹 包括主文件夹的子文件夹 有办法吗 我已经做了一个基本的工作 但我仍然没有得到想要的结果 这不起作用 这是我的代码 File files array file
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • 使用 ANTLR 为 java 源代码生成抽象语法树

    如何使用 ANTLR 从 java src 代码生成 AST 有什么帮助吗 好的 步骤如下 前往ANTLR站点 http www antlr org 并下载最新版本 下载Java g和JavaTreeParser g文件来自here htt
  • Convert.FromBase64String 方法的 Java 等效项

    Java 中是否有相当于Convert FromBase64String http msdn microsoft com en us library system convert frombase64string aspx which 将指
  • 如何为 Gson 编写自定义 JSON 反序列化器?

    我有一个 Java 类 用户 public class User int id String name Timestamp updateDate 我收到一个包含来自 Web 服务的用户对象的 JSON 列表 id 1 name Jonas
  • 一种使用 Java Robot API 和 Selenium WebDriver by Java 进行文件上传的解决方案

    我看到很多人在使用 Selenium WebDriver 的测试环境中上传文件时遇到问题 我使用 selenium WebDriver 和 java 也遇到了同样的问题 我终于找到了解决方案 所以我将其发布在这里希望对其他人有所帮助 当我需
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 使用 Flyway 和 Hibernate 的 hbm2ddl 在应用程序的生命周期中管理数据库模式

    我正在开发 Spring Hibernate MySql 应用程序 该应用程序尚未投入生产 我目前使用 Hibernatehbm2ddl该功能对于管理域上的更改非常方便 我也打算用Flyway用于数据库迁移 在未来的某个时候 该应用程序将首
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • 使用 SAX 进行 XML 解析 |如何处理特殊字符?

    我们有一个 JAVA 应用程序 可以从 SAP 系统中提取数据 解析数据并呈现给用户 使用 SAP JCo 连接器提取数据 最近我们抛出了一个异常 org xml sax SAXParseException 字符引用 是无效的 XML 字符
  • Keycloak - 自定义 SPI 未出现在列表中

    我为我的 keycloak 服务器制作了一个自定义 SPI 现在我必须在管理控制台上配置它 我将 SPI 添加为模块 并手动安装 因此我将其放在 module package name main 中 并包含 module xml 我还将其放
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • java迭代器内部是如何工作的? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个员工列表 List
  • 中断连接套接字

    我有一个 GUI 其中包含要连接的服务器列表 如果用户单击服务器 则会连接到该服务器 如果用户单击第二个服务器 它将断开第一个服务器的连接并连接到第二个服务器 每个新连接都在一个新线程中运行 以便程序可以执行其他任务 但是 如果用户在第一个

随机推荐

  • 记一次容器环境下出现 Address not available

    困惑的源地址 pod 创建后一段时间一直是正常运行 突然有一天发现没有新的连接创建了 业务上是通过 pod A 访问 svc B 的 svc name 的方式 进入 pod 手动去 wget 一下 发现报错了 Address not ava
  • 思科 计算机网络 第2章测试&考试 答案

    拓展 思科交换机常用命令及配置 测验 当通过 Cisco CLI 配置主机名时 哪三项命名约定将作为指南的一部分 选择三项 A 主机名的长度应少于 64 个字符 B 主机名应全部用小写字符表示 C 主机名应不包含空格 D 主机名应该以一个特
  • 球面如何切分成多个扇面?

    近期在研究使用D3D开发三维显示场景 发现D3D支持的纹理图的大小有限制 这种限制一般由D3D引擎 显卡驱动和显卡硬件共同决定 使用如下代码可以获取当前系统能支持最大纹理大小 D3DCAPS9 caps m pd3dDevice gt Ge
  • Linux 下计算圆周率

    转自 http blog csdn net zhuying linux article details 7298465 oracle sor sys time echo scale 5000 4 a 1 bc l q 输出的是小数点后 位的
  • 防治交换机窃听技术_等保2.0建设基本要求(技术部分)解读(下)

    网御星云对等保2 0基本要求技术部分 以四级为例 对安全计算环境 安全管理中心的控制点逐项解读内容如下 01 安全计算环境 1 1 身份鉴别 a 应对登录的用户进行身份标识和鉴别 身份标识具有唯一性 身份鉴别信息具有复杂度要求并定期更换 b
  • rpgmv存档修改html_使用HTML5存档网站内容更改

    rpgmv存档修改html The majority of web content today exists in a state of retrograde amnesia Created in a moment content is c
  • 从GAN到WGAN及WGAN-GP

    20200910 0 引言 最近看了PassGAN的代码 他是使用了WGAN GP的代码作为GAN的框架 来进行密码生成 由此引出了对GAN的学习 在GAN的研究中 有一个方向就是研究如何使GAN更加稳定的训练 在此之中 WGAN和WGAN
  • 多维时序

    多维时序 Matlab实现LSTM Adaboost和LSTM多变量时间序列预测对比 目录 多维时序 Matlab实现LSTM Adaboost和LSTM多变量时间序列预测对比 预测效果 基本介绍 模型描述 程序设计 参考资料 预测效果 基
  • 【linux线程(壹)】——初识线程(区分线程和进程,线程创建的基本操作)

    作者 努力学习的少年 个人简介 双非大二 一个正在自学c 和linux操作系统 写博客是总结知识 方便复习 目标 进大厂 如果你觉得文章可以的话 麻烦你给我点个赞和关注 感谢你的关注 目录 1 线程和进程 1 1 进程的基本概念 1 2 线
  • JAVA多线程的三种创建方式

    一 概述 在JAVA中 用Thread类代表线程 所有线程对象 都必须是Thread类或者Thread类子类的实例 每个线程的任务就是执行一段顺序执行的代码 JAVA使用线程执行体来容纳这段代码 所以 我们创建线程时 主要是根据实际需求 编
  • FPGA设计:如何用半加器和全加器构成四位全加器

    今天来分享一下关于FPGA设计的文章 如何用半加器和全加器构成四位全加器 首先 我们看一位半加器的代码 1 一位半加器的程序代码及 图 library ieee use ieee std logic 1164 all entity half
  • linux串口编程 gsm,linux 中用n_gsm实现3gpp MUX协议

    n gsm 是一种tty设备上的线路规程 line discipline 来实现3gpp MUX协议 n gsm 实现方法如下 1 kernel配置文件中 打开 CONFIG N GSM y 编译内核 2 cat proc device g
  • KMP算法中next数组的理解

    下面我们对着严老师的代码来一步步分析 next 数组理解 void creat next sstring T int next i 1 next 1 0 j 0 while i
  • MySQL SHOW命令

    文章目录 SHOW命令介绍 SHOW命令用法 常用SHOW命令汇总 常用命令汇总表 服务器运行状态信息 支持的字符集信息 支持的校对规则信息 上一个执行语句的告警信息 上一个执行语句的错误信息 服务器线程信息 用户权限信息 支持的权限列表
  • Android疑难解决-Duplicate class xxx.xxx.xxx found in modules xxx.xxx.xxx

    Duplicate class top zibin luban BuildConfig found in modules jetified Luban 1 1 8 runtime top zibin Luban 1 1 8 and jeti
  • System.Text.Encoding不同字符编码之间进行转换

    System Text Encoding 是 C 中用于处理字符编码和字符串与字节之间转换的类 它提供了各种静态方法和属性 用于在不同字符编码之间进行转换 以及将字符串转换为字节数组或反之 在处理多语言文本 文件 网络通信以及其他字符数据的
  • 每日一道算法题(3)--戳气球问题

    题目 戳气球问题 输入一个包含非负数整数的数组nums代表一排气球 nums i 代表第i个气球的分数 现在 你要戳破所有的气球 请计算出最高的分数 分数的计算规则比较特别 当戳破第i个气球时 可以获得nums left nums righ
  • Python自定义函数的综合应用

    第1关 求最大值函数 编写程序 利用可变长度参数定义一个求任意个数数值的最大值的函数max n a b c 并进行测试 例如 当传入6 9时 输出两个数的最大值 当传入3 9 5 1 12 33 2 10时 输出多个数的最大值 输入任意若干
  • 【经典】环境切换——SpringBoot配置不同环境启用不同的配置文件

    不同环境下切换数据库配置文件 环境切换配置一般在数据库 存储等需要在开发环境和正式环境中进行切换时 避免出错而常用的方式 以下内容以yml文件来举例 我们需要创建两个application文件 application dev yml app
  • SpringCloud利用网关拦截做Token验证(JWT方式)

    关于JWT的内容 请看以下链接 主要看它的原理 以及缺点 https blog csdn net memmsc article details 78122931 步骤1 前端传userName password到后端 后端为springcl