阿尔法色色之屋 - 后端
type: channel
link: https://www.alphah.top/index.php/category/study/
description: 后端の学习之路
items: 【Spring】Spring Security 入门原理及实战
items: 【Json】Jackson 常用注解 详解
items: 【Lombok】注解 传送门
items: 【Lombok】基础注解 之 @RequiredArgsConstructor

【Spring】Spring Security 入门原理及实战
type: item
date: 2023-03-09T10:40:00+08:00
description: 1. 基础概述Spring Security 是 Spring 项目之中的一个安全模块，可以非常方便与spring项目无缝集成。在 Spring Boot 项目中 Spring Security 的集成也十分方便。本文主要介绍 Spring Security，以及其在 Web 应用中的使用。2. 快速入门2.1 创建项目现在我们创建一个基本的 SpringBoot 的 Web 应用项目，首先引入依赖：<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> </dependencies>然后创建启动类 SpringSecurityApplication：@SpringBootApplication public class SpringSecurityApplication { public static void main(String[] args) { SpringApplication.run(SpringSecurityApplication.class, args); } }然后在项目目录中新建包Controller用于表示控制层，在里面新建类AppController并编写代码:@RestController public class AppController { @RequestMapping("/hello") String home() { return "Hello,Spring Security!"; } }这时候我们启动项目，并访问http://localohost:8080/hello在页面中看到：Hello,Spring Security!2.2 加入依赖这个时候我们给 SpringBoot 项目添加 SpringScurity 依赖，在pom.xml的<dependencies>标签中添加如下依赖：<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency>此时我们再一次访问http://localhost:8080/hello就会跳转到 Spring Security 的登录界面：说明 Spring Security 已经起作用了，但我们需要登陆才能继续访问。我们可以查看下这个页面的源代码，是这样： Please sign in Username Password Sign in 上面的div容器中包含了一个form，表单提交了三个数据：username【用户名】、 password【密码】、_csrf【CSRF安全防护相关】。Spring Security 默认的用户名是user，而默认密码则会在添加了 Spring Security 依赖后的项目启动时会随机生成。我们可以去控制台看下日志，会看到如下信息：在输入用户名和密码后成功登录，并能访问http://localhost:8080/hello的内容。2.2 自定义配置上面演示了默认情况下登录 Spring Security 的系统。如果我们想用自己的定义的账号密码，则需要改配置。我们新建包Config并在其中创建类MySecurityConfiguration，并添加如下代码：@Configuration @EnableWebSecurity public class MySecurityConfiguration extends WebSecurityConfigurerAdapter …

【Json】Jackson 常用注解 详解
type: item
date: 2023-02-09T17:46:00+08:00
description: 本文所写注解位于com.fasterxml.jackson.annotation包中相关依赖<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.5.3</version> </dependency>基本使用java代码中常常用到jackson的注解，主要用到的有：@JsonProperty、@JsonIgnore、@JsonIgnoreProperties、@JsonFormat举例：实体类Student@JsonIgnoreProperties(value = { "address", "score" }) public class Student implements Serializable { private static final long serialVersionUID = 1L; @JsonProperty(value = "name", required = true) private String trueName; @JsonIgnore private int age; @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GTM+8") private Date birthday; private String address; private String score; public String getTrueName() { return trueName; } public void setTrueName(String trueName) { this.trueName = trueName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getScore() { return score; } public void setScore(String score) { this.score = score; } @Override public String toString() { return "name: " + this.trueName + ", address: " + this.address + ", age：" + this.age + ", birthday：" + this.birthday + ", score：" + this.score; } }测试注解：public class TestJsonProperty { public static void main(String[] args) throws IOException { Student student = new Student(); student.setTrueName("张三"); student.setAge(20); student.setBirthday(new Date()); student.setAddress("上海市"); student.setScore("90"); // 使用writeValuesAsString把对象转化成json字符串。 String stuJson = new ObjectMapper().writeValueAsString(student); System.out.println(stuJson); //使用readValue把字符串转化为对象 Student stu = new ObjectMapper().readValue(stuJson, Student.class); System.out.println(stu.toString()); } }结果：{"birthday":"2020-04-16 03:57:06","name":"张三"} name: 张三, address: null, age：, …

【Lombok】注解 传送门
type: item
date: 2023-02-07T15:44:00+08:00
description: 这是关于 Lombok 相关的注解知识整理的传送帖，方便读者定位阅读。[timeline-item][btn href="" type="default"]@Data[/btn][/timeline-item][timeline-item][btn href="" type="default"]@NonNull[/btn][/timeline-item][timeline-item][btn href="https://www.alphah.top/index.php/archives/20/" type="default"]@RequiredArgsConstructor[/btn][/timeline-item]

【Lombok】基础注解 之 @RequiredArgsConstructor
type: item
date: 2023-02-07T10:02:00+08:00
description: 一、基本介绍@RequiredArgsConstructor 作用于类，用于生成包含 final 和 @NonNull 注解的成员变量的构造方法二、属性介绍staticName：使生成的构造方法是私有的 并且生成一个参数为 final 变量和 @NonNull 注解变量，返回类型为当前对象的静态方法，方法名为 staticName 值access：设置构造方法的访问修饰符，如果设置了 staticName，那么将设置静态工厂方法的访问修饰符 共有 PUBLIC、MODULE、PROTECTED、PACKAGE、PRIVATE、NONE MODULE 是 Java 9 的新特性，NONE 表示不生成构造方法也不生成静态方法，即停用注解功能onConstructor：列出的所有注解都放在生成的构造方法上 JDK 7 之前的写法是 onConstructor = @__({@Deprecated})，而 JDK 8 之后的写法是 onConstructor_ = {@Deprecated}三、实战演练@RequiredArgsConstructor(staticName = "newInstance", access = AccessLevel.PROTECTED, onConstructor_ = {@Deprecated}) public class ChengXiao { private String name; private final int age; @NonNull private String phone; }public class ChengXiao { private String name; private final int age; @NonNull private String phone; @Deprecated private ChengXiao(int age, @NonNull String phone) { if (phone == null) throw new NullPointerException("phone is marked non-null but is null"); this.age = age; this.phone = phone; } protected static ChengXiao newInstance(int age, @NonNull String phone) { return new ChengXiao(age, phone); } }四、注意当类中没有 final 和 @NonNull 注解的成员变量时会生成一个无参构造方法（因为没有符合要求的参数），而很多人认为 @Data 会生成无参构造方法就是此导致的