Qing Blog - Java
type: channel
link: http://qingcloud.fun/index.php/category/Java/
description: Java
items: JAVA的Rome库解析的RSS内容
items: Redis学习指南
items: RESTful接口设计
items: JWT安全认证
items: Springboot快速入门

JAVA的Rome库解析的RSS内容
type: item
date: 2025-03-30T03:00:00+00:00
description: Rome库解析的RSS内容详解1. 顶级Feed信息Rome库通过SyndFeed对象解析整个RSS源的基本信息：SyndFeed feed = input.build(new XmlReader(feedUrl)); // 基本信息 String title = feed.getTitle(); // 标题 String description = feed.getDescription(); // 描述 String link = feed.getLink(); // 链接 String language = feed.getLanguage(); // 语言 Date publishedDate = feed.getPublishedDate(); // 发布日期 String copyright = feed.getCopyright(); // 版权信息 String author = feed.getAuthor(); // 作者 String feedType = feed.getFeedType(); // 源类型(RSS_0.9, RSS_1.0, RSS_2.0, ATOM_0.3, ATOM_1.0等) // 图片信息 SyndImage image = feed.getImage(); if (image != null) { String imageUrl = image.getUrl(); // 图片URL String imageTitle = image.getTitle(); // 图片标题 String imageLink = image.getLink(); // 图片链接 } // 分类信息 List<SyndCategory> categories = feed.getCategories(); for (SyndCategory category : categories) { String categoryName = category.getName(); // 分类名称 String taxonomyUri = category.getTaxonomyUri(); // 分类URI }2. 条目信息Rome库通过SyndEntry对象解析每个RSS条目的详细信息：List<SyndEntry> entries = feed.getEntries(); for (SyndEntry entry : entries) { // 基本信息 String entryTitle = entry.getTitle(); // 标题 String entryLink = entry.getLink(); // 链接 Date entryPublishedDate = entry.getPublishedDate(); // 发布日期 Date entryUpdatedDate = entry.getUpdatedDate(); // 更新日期 String entryAuthor = entry.getAuthor(); // 作者 String entryUri = entry.getUri(); // 唯一标识符(GUID) // 描述信息 SyndContent description = entry.getDescription(); if (description != null) { String descriptionType = description.getType(); // 内容类型(text/plain, text/html等) String descriptionValue = description.getValue(); // 内容值 } // 完整内容 List<SyndContent> contents = entry.getContents(); for (SyndContent content : contents) { String contentType = content.getType(); // 内容类型 String contentValue = content.getValue(); // 内容值 String contentMode = content.getMode(); // 内容模式 } // 分类信息 List<SyndCategory> entryCategories = entry.getCategories(); for (SyndCategory category : entryCategories) { String categoryName = category.getName(); // 分类名称 String ta…

Redis学习指南
type: item
date: 2025-03-29T02:57:00+00:00
description: Redis学习指南1. NoSQL概述什么是 NoSQLNoSQL（Not Only SQL）是一类非关系型数据库，设计初衷是解决传统关系型数据库在处理大规模数据、高并发和灵活性需求时的局限性。它通常不依赖固定的表结构，适合分布式系统和高性能场景。NoSQL 与传统关系型数据库的区别数据模型：NoSQL 使用键值对、文档、列族、图等模型，而传统数据库使用二维表结构。扩展性：NoSQL 支持水平扩展，通过增加节点提升性能；传统数据库多为垂直扩展。一致性：NoSQL 通常提供最终一致性，而传统数据库强调强一致性（ACID）。NoSQL 的分类键值存储：如 Redis、DynamoDB文档存储：如 MongoDB、CouchDB列族存储：如 Cassandra、HBase图数据库：如 Neo4j、ArangoDB2. Redis介绍什么是 RedisRedis（Remote Dictionary Server）是一个开源的、高性能的键值对数据库。它将数据存储在内存中，支持多种数据结构，常用于缓存、消息队列等场景。Redis 的特点和优势高性能：数据存储在内存，读写速度极快。丰富的数据结构：支持字符串、哈希、列表、集合、有序集合等。持久化：提供 RDB 和 AOF 两种方式将数据保存到磁盘。多功能：支持事务、发布/订阅、Lua 脚本等。Redis 的应用场景缓存系统：加速数据访问排行榜：如游戏积分榜消息队列：实现异步任务处理会话管理：存储用户登录状态3. Redis-CLI常用命令3.1 基础操作# 连接Redis redis-cli # 测试连接 ping # 切换数据库（默认16个） select 0 # 查看所有key keys * # 删除key del key_name # 设置key过期时间 expire key_name seconds #检查键是否存在 exists key3.2 数据类型操作字符串操作# 设置值 set key value # 获取值 get key # 批量设置 mset key1 value1 key2 value2 # 数值增减 incr key decr key列表操作# 从左边插入 lpush list_name value # 从右边插入 rpush list_name value # 获取列表范围 lrange list_name 0 -1哈希操作# 设置哈希值 hset user:1 name zhangsan hset user:1 age 20 # 获取哈希值 hget user:1 name集合操作# 添加集合元素 sadd myset value1 value2 # 查看集合成员 smembers myset有序集合操作# 添加元素和分数 zadd scoreboard 100 user1 zadd scoreboard 200 user24. Redis数据结构详解4.1 String（字符串）最基本的数据类型存储单个字符串、整数、浮点数最大存储512MB使用场景：缓存用户信息计数器分布式锁代码示例：// 设置字符串 redisTemplate.opsForValue().set("user:1:name", "张三"); // 获取字符串 String name = (String) redisTemplate.opsForValue().get("user:1:name");4.2 List（列表）有序集合支持从两端添加和弹出元素底层是双向链表使用场景：消息队列最新消息排行异步任务处理代码示例：// 左侧推入 redisTemplate.opsForList().leftPush("tasks", "task1"); // 右侧弹出 Object task = redisTemplate.opsForList().rightPop("tasks");4.3 Hash（哈希）存储对象类似Map结构字段和值都是字符串使用场景：存储对象用户信息存储购物车代码示例：// 存储用户信息 redisTemplate.opsForHash().put("user:1", "name", "张三"); redisTemplate.opsForHash().put("user:1", "age", "25"); // 获取用户信息 String name = (String) redisTemplate.opsForHash().get("user:1", "name");4.4 Set（集合）无序集合元素唯一支持集合运算使用场景：去重标签系统社交关系代码示例：// 添加元素 redisTemplate.opsForSet().add("tags", "Java", "Redis", "分…

RESTful接口设计
type: item
date: 2025-03-20T03:01:00+00:00
description: HTTP协议及Spring Boot RESTful接口设计1. HTTP协议概述HTTP（HyperText Transfer Protocol）是一个无状态的应用层协议，主要用于客户端与服务器之间的数据传输。2. 常见HTTP请求方法GET用于获取资源。请求的数据附加在URL中。POST用于提交数据，数据包含在请求体中。适用于表单提交、文件上传等。PUT用于更新资源。将请求体中的数据替换服务器上的资源。DELETE用于删除资源。3. HTTP状态码2xx - 请求成功200 OK201 Created3xx - 重定向301 Moved Permanently302 Found4xx - 客户端错误400 Bad Request404 Not Found5xx - 服务器错误500 Internal Server ErrorHTTP 方法HTTP 协议中常见的请求方法有：GET: 请求获取资源，通常用于查询操作。POST: 请求提交数据，通常用于创建资源。PUT: 请求更新资源，通常用于替换指定的资源。DELETE: 请求删除资源。HTTP 状态码200 OK: 请求成功，响应内容在消息体中。201 Created: 请求成功，资源已被创建。400 Bad Request: 请求格式错误。404 Not Found: 请求的资源未找到。500 Internal Server Error: 服务器内部错误。请求与响应的结构请求：包含方法、URL、头部、请求体。响应：包含状态码、头部、响应体。4. RESTful架构原则资源通过URI唯一标识请求无状态使用标准HTTP方法（GET、POST、PUT、DELETE等）1. RESTful API 的设计原则资源（Resource）: 在REST中，资源是系统中的对象，如用户、商品、订单等。每个资源通过URL唯一标识。无状态（Stateless）: 客户端与服务器之间的通信是无状态的，每次请求都必须包含处理请求所需的所有信息。统一接口（Uniform Interface）: RESTful API使用统一的URL和HTTP方法操作资源。2. 常见RESTful设计模式GET /users: 获取所有用户。GET /users/{id}: 根据ID获取单个用户。POST /users: 创建新用户。PUT /users/{id}: 更新用户信息。DELETE /users/{id}: 删除指定用户。5. Spring Boot中HTTP方法示例@RestController @RequestMapping("/api/products") public class ProductController { @GetMapping public List<Product> getAllProducts() { return productService.getAllProducts(); } @GetMapping("/{id}") public Product getProductById(@PathVariable Long id) { return productService.getProductById(id); } @PostMapping public Product createProduct(@RequestBody Product product) { return productService.createProduct(product); } @PutMapping("/{id}") public Product updateProduct(@PathVariable Long id, @RequestBody Product product) { return productService.updateProduct(id, product); } @DeleteMapping("/{id}") public void deleteProduct(@PathVariable Long id) { productService.deleteProduct(id); } }6.Spring Boot 实现 RESTful API实体类定义：User定义用户实体类，用来接收和返回用户数据。java复制编辑package com.example.usermanagement.model; public class User { private Long id; private String name; private String email; // 构造方法、Getter 和 Setter public User(Long id, String name, Strin…

JWT安全认证
type: item
date: 2025-03-18T02:59:00+00:00
description: SpringBoot JWT安全认证指南JWT概述什么是JWT？JSON Web Token (JWT) 是一种紧凑、自包含的方式，用于在各方之间安全地传输信息主要用于身份验证和信息交换由三部分组成：Header、Payload、SignatureJWT的优势无状态认证轻量级跨语言支持可扩展性强项目依赖配置Maven依赖<dependencies> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>0.11.5</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-jackson</artifactId> <version>0.11.5</version> <scope>runtime</scope> </dependency> </dependencies>JWT配置属性类import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration @ConfigurationProperties(prefix = "jwt") public class JwtProperties { private String secret; private Long expiration; // Getter and Setter public String getSecret() { return secret; } public void setSecret(String secret) { this.secret = secret; } public Long getExpiration() { return expiration; } public void setExpiration(Long expiration) { this.expiration = expiration; } }application.ymljwt: secret: your_secure_secret_key_here expiration: 3600000 # 1小时过期时间配置启动类import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.context.annotation.Configuration; @Configuration @EnableConfigurationProperties(JwtProperties.class) public class AppConfig { }JwtUtil工具类package com.cq.rssdemo.utils; import com.cq.rssdemo.config.JwtProperties; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.nio.charset.StandardCharsets; import java.security.Key; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.function.Function; @Component public …

Springboot快速入门
type: item
date: 2025-03-13T03:02:00+00:00
description: Springboot快速入门第一章.Springboot基本介绍Spring Boot倡导约定优于配置，将简化开发发挥到极致。使用Spring Boot框架可以快速构建Spring应用，再也不需要大量的繁琐的的各种配置。Spring Boot框架设计的目标是：程序员关注业务逻辑就行了，环境方面的事儿交给Spring Boot就行。Spring Boot特性：快速创建独立的Spring应用程序。（Spring支持的SpringBoot都支持，也就是说SpringBoot全方位支持IoC，AOP等）嵌入式的Tomcat、Jetty、Undertow容器。（web服务器本身就是几个jar包，Spring Boot框架自动嵌入了。）需要什么功能时只需要引入对应的starter启动器即可。（启动器可以自动管理这个功能相关的依赖，自动管理依赖版本的控制）尽最大努力，最大可能的自动配置Spring应用和第三方库。（例如：如果要进行事务的控制，不用做任何事务相关的配置，只需要在service类上添加@Transactional注解即可。）没有代码生成，没有XML配置。（Spring Boot的应用程序在启动后不会动态地创建新的Java类，所有逻辑都是在编译期就已经确定好的）提供了生产监控的支持，例如健康检查，度量信息，跟踪信息，审计信息等。也支持集成外部监控系统。Spring Boot的开箱即用和约定优于配置：开箱即用：Spring Boot框架设计得非常便捷，开发者能够在几乎不需要任何复杂的配置的情况下，快速搭建并运行一个功能完备的Spring应用。约定优于配置：“约定优于配置”（Convention Over Configuration, CoC）是一种软件设计哲学，核心思想是通过提供一组合理的默认行为来减少配置的数量，从而简化开发流程。例如：Spring Boot默认约定了使用某个事务管理器，在事务方面不需要做任何配置，只需要在对应代码的位置上使用@Transactional注解即可。Starter-启动器在 Spring Boot 中，启动器（Starter）本质上是一个简化依赖管理的概念。Spring Boot 的启动器本质上就是一组预定义的依赖集合，它们被组织成一个个 Maven的依赖，以方便开发者快速集成特定的功能模块。如果你想做web开发，只需要引入web启动器。web启动器会自动引入web开发所需要的子依赖。依赖聚合： 每个启动器通常对应一个特定的功能集或者一个完整的应用模块，如 spring-boot-starter-web 就包含了构建 Web 应用所需的所有基本依赖项，如 Spring MVC, Tomcat 嵌入式容器等。依赖传递： 当你在项目中引入一个启动器时，它不仅会把自身作为依赖加入到你的项目中，还会把它的所有直接依赖项（transitive dependencies）也加入进来。这意味着你不需要单独声明这些依赖项，它们会自动成为项目的一部分。版本管理： 启动器内部已经指定了所有依赖项的具体版本，这些版本信息存储在一个公共的 BOM（Bill of Materials，物料清单）文件中，通常是 spring-boot-dependencies。当引入启动器时，实际上也间接引用了这个 BOM，从而确保了所有依赖项版本的一致性。自动配置： 许多启动器还提供了自动配置（Auto-configuration），这是一种机制，允许 Spring Boot 根据类路径上的可用组件自动设置你的应用程序。例如，如果类路径上有 Spring MVC 和嵌入式 Tomcat，则 Spring Boot 会自动配置它们，并准备好一个 web 应用程序。官方启动器命名特点：spring-boot-starter-*非官方启动器命名特点：*-spring-boot-starterSpring Boot核心注解@SpringBootApplication注解Spring Boot的主入口程序被@SpringBootApplication注解标注，可见这个注解的重要性，查看它的源码：可以看出这个注解属于组合注解。拥有@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan的功能。@SpringBootConfiguration注解@SpringBootConfiguration注解的源码如下：可以看到这个注解的被@Configuration标注，说明主入口程序是一个配置类。也就是说主入口中的方法可以被@Bean注解标注，被@Bean注解的标注的方法会被Spring容器自动调用，并且将该方法的返回对象纳入IoC容器的管理。测试一下：@SpringBootApplicati…