Organizations

56 results for Java
  • WebSocket挂载 后续 SpringBoot 引入了 WebScoket 组件, 可以直接引入提供了 H5 游戏当做简单服务端, 主要选型基于以下考虑: WebSocket直接集成 SpringBoot 可以直接复用Java经验开发 H5/微信小游戏端基本上弱交互性, 大部分不需要复杂不停机热更, 可以直接重启服务 Netty 需要从底层开发许多附加模块且需要 Socket 方面知识 有的 H5 只需要简单 JSON 格式处理, 后续集成 Protobuf 处理 这里引入基础 Websocket 库: <dependencies> <!-- WebSocket库 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-websocket</artifactId> </dependency> </dependencies> 这里先编写个 echo 挂载服务测试: package com.app.ford; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.lang.NonNull; import org.springframework.stereotype.Component; import org.springframework.web.socket.CloseStatus; import org.springframework.web.socket.TextMessage; import org.springframework.web.socket.WebSocketSession; import org.springframework.web.socket.handler.TextWebSocketHandler; /** * 全局 WebSocket 挂载服务 * BinaryWebSocketHandler 代表了二进制传输数据 * TextWebSocketHandler 代表了文本流传输数据 */ @Component public class FordWebSocketHandler extends TextWebSocketHandler { /** * 日志库 */ Logger logger = LoggerFactory.
    Java Created Mon, 01 Jan 2024 22:53:21 +0800
  • JPA日期时间转化 之前讲过可以 JPA 通过内部转化实现自动映射, 如以下情况: @Entity @Table(name = "tbl_admin_info") public class AdminInfoModel { /** * 自定义时间转化器 */ @Convert(converter = ConvertDateAndTimestamp.class) @Column(nullable = false, columnDefinition = "INT COMMENT '最后更新时间'") private Date updateTime = new Date(0L); } 但是如果响应 JSON 数据的时候就带来麻烦了, 默认响应 JSON 的情况会直接将 new Date(0) 格式转化为默认时间戳时间, 也就是 1900-xx-xx xx:xx:xx 格式. 在多次实践后发现自定义转化的问题特别多, 包括 JSON 格式的转化没办法通过 JPA 进行精准|模糊查询等(因为内部转化 Map|List 是没办法加入 CrudRepository 作为条件检索, MySQL|MariaDB后续更新的JSON查询语法都没法调用). 也就是这种情况之下开始回过头来审视 Convert 自定义转化利弊. AttributeConverter 功与过 类似于 JSON 格式当中解构, 如下面的 JSON 数组解析器:
    Java Created Fri, 29 Dec 2023 15:56:09 +0800
  • Java转发请求库 日常接入第三方需要转发 HTTP 请求, 这种在 SpringBoot 当中有个 RestTemplate 请求工具, 但是日常使用过程当中这个原始库编写十分麻烦, 所以不推荐直接集成编写. 这里推荐用 SpringBoot 内部另外的类库: webflux, 这里先引入下依赖: <dependencies> <!-- HTTP转发请求 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- Netty工具,依赖异步转发等工具 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-reactor-netty</artifactId> </dependency> </dependencies> 之后就是编写具体请求库功能: package com.app.fox.utils; import com.fasterxml.jackson.databind.JsonNode; import io.netty.handler.ssl.SslContext; import io.netty.handler.ssl.SslContextBuilder; import io.netty.handler.ssl.util.InsecureTrustManagerFactory; import org.springframework.http.client.reactive.ReactorClientHttpConnector; import org.springframework.util.MultiValueMap; import org.springframework.web.reactive.function.BodyInserters; import org.springframework.web.reactive.function.client.WebClient; import org.springframework.web.util.UriComponentsBuilder; import reactor.core.publisher.Mono; import javax.net.ssl.SSLException; import reactor.netty.http.client.HttpClient; import java.time.Duration; import java.util.Map; import java.util.function.Consumer; /** * 构建转发请求工具 */ public class RequestUtils { /** * 将URL和参数构建 example.
    Java Created Wed, 13 Dec 2023 12:48:54 +0800
  • 权限认证 采用 SpringBoot3 拦截其权限认证, 来做到接口安全保密防护, 在日常授权当中是以类似 authorization: xxx 来做凭证提交, 以下类似: Authorization: Basic xxx: 基本认证头 Authorization: Bearer xxx: JWT认证头 Authorization: Digest xxx: MD5 哈希的 http-basic 认证(目前已弃用) Authorization: AWS4-HMAC-SHA256 xxx: 相对更加复杂的 HMAC-SHA256 加密方式 具体实现: Authorization 常见来说 Authorization: Basic 方式最简单和常见, 包括 Nginx 默认的 auth_basic 配置就是基于这种方式, 但是安全方面也是最差的. 注意: Authorization: Basic 的用户名和密码的值可以容易地编码和解码, 所以除非相对简单场景否则不要把敏感信息写入. 而 Authorization: Bearer 则是最近兴起必须基于 HTTPS 进行授权通信方式, 利用 HTTPS+JWT 来加密授权凭据, 目前这种方式相对采用比较多. JWT 这是目前相对广泛采用的 Bearer 加密方案, 如果是 api 授权可以推荐用此方式进行返回 token 授权. 官方说明: JSON Web Tokens
    Java Created Tue, 05 Dec 2023 22:42:06 +0800
  • 格式化JSON响应 带有 HTTP 状态 + JSON 内容响应结构体: package com.app.fox.utils; import lombok.Getter; import java.util.HashMap; import java.util.Map; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; @Getter public class JsonResponse { /** * 预定义空结构 */ public static Map<String, Object> EMPTY = new HashMap<>(0); private final String message; private final Object data; private final Integer time; private JsonResponse(String message, Object data) { this.message = message; this.data = data == null ? EMPTY : data; this.time = Math.toIntExact(System.currentTimeMillis() / 1000L); } public static ResponseEntity<JsonResponse> response(HttpStatus status, String message, Object data) { return new ResponseEntity<>(new JsonResponse(message, data), status); } public static ResponseEntity<JsonResponse> success(String message, Object data) { return response(HttpStatus.
    Java Created Sun, 03 Dec 2023 18:35:22 +0800
  • Java的API初始化 这里用来初始化 API 接口项目, 具体用来做简单 JSON 请求响应, 初始化项目集成 MariaDB/Redis 做数据落地和缓存. pom.xml 配置先配置下组件: <!-- 主要的安装部件包 --> <dependencies> <!-- Web访问组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 提交数据传入验证 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> <!-- JPA的ORM组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <!-- Redis组件 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!-- MariaDB驱动 --> <dependency> <groupId>org.mariadb.jdbc</groupId> <artifactId>mariadb-java-client</artifactId> <scope>runtime</scope> </dependency> <!-- 快速Get/Set工具 --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 主要配置启动方法入口, 这个最好配置防止打包之后找不到启动入口 --> <mainClass>com.
    Java Created Thu, 09 Nov 2023 23:13:12 +0800
Previous