diff --git a/docs/chapter07.md b/docs/chapter07.md index 4ebf3b7..544d94e 100644 --- a/docs/chapter07.md +++ b/docs/chapter07.md @@ -119,7 +119,7 @@ nginx中部署 [paopao-web-ui.zip](../examples/chapter07/paopao-web-ui.zip) ### 7.2 用户注册功能开发 -基本上按照层次结构创建系统的包结构, 在`com.lk.paopao`包下创建子包`controllers`、`services`、`entities`、`repositories`。 +基本上按照层次结构创建系统的包结构, 在`com.lk.paopao`包下创建子包`controller`、`service`、`entity`、`repository`、`config`。 #### 7.2.1 API设计 @@ -158,19 +158,89 @@ spring: ``` yml配置文件的格式需要注意:缩进和空格是敏感的,需要严格遵循格式。 -#### 7.2.3 实体类和Repository接口 +#### 7.2.3 实体类User和UserRepository接口 -设计和实现实体类User +创建实体类User -对应的数据库接口: UserRepository +创建User对应的数据库接口: UserRepository +#### 7.2.3 创建服务类AuthService -#### 7.2.3 Controller和service -#### 7.2.4 解决跨域问题 +创建service类,处理用户注册和登录逻辑: AuthService + +#### 7.2.4 创建AuthController类 + +创建controller类,处理用户注册和登录请求: AuthController + +#### 7.2.5 解决跨域问题 + +跨域问题‌是指在使用AJAX进行跨域请求时,浏览器阻止访问不同源的Web资源的问题。跨域问题的本质是浏览器的一种安全机制,称为同源策略(Same-Origin Policy)。同源策略限制了来自不同源的文档或脚本间的交互,以防止恶意网站窃取数据或进行其他恶意操作‌。 + +跨域问题的原因 + +跨域问题主要由以下几种情况引起: + + ‌协议不同‌:例如,http和https。 + ‌域名不同‌:例如,example.com和test.com。 + ‌端口不同‌:例如,80和8080。 + +目前最常用的解决方案: + +> CORS(Cross-Origin Resource Sharing)‌:服务器端设置CORS头部信息,允许特定的域名或所有域名进行跨域请求。 + +在spring boot中可使用自己创建CorsFilter的bean实例的方式解决。 + +在项目`config`包中创建类`CorsConfig`,添加如下代码: + +```java +package com.lk.paopao.config; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +import java.util.List; + +/** + * 配置类,用于设置跨域请求 + */ +@Configuration +public class CorsConfig { + + /** + * 创建并配置CorsFilter bean + * + * @return CorsFilter bean实例,用于处理跨域请求 + */ + @Bean + public CorsFilter corsFilter() { + // 创建URL基于的Cors配置源 + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + // 创建Cors配置实例 + CorsConfiguration config = new CorsConfiguration(); + + // 配置允许的源 + config.setAllowedOrigins(List.of("http://localhost")); + // 配置允许的方法 + config.setAllowedMethods(List.of("GET", "POST", "PUT", "DELETE")); + // 配置允许的头部 + config.setAllowedHeaders(List.of("*")); + // 允许凭据 + config.setAllowCredentials(true); + + // 在配置源中注册全局跨域配置 + source.registerCorsConfiguration("/**", config); + // 返回CorsFilter实例 + return new CorsFilter(source); + } +} + +``` ### 7.3 发布文章功能开发 diff --git a/examples/chapter07/paopao/src/main/resources/application.yml b/examples/chapter07/paopao/src/main/resources/application.yml new file mode 100644 index 0000000..096af03 --- /dev/null +++ b/examples/chapter07/paopao/src/main/resources/application.yml @@ -0,0 +1,23 @@ + +spring: + jackson: + property-naming-strategy: SNAKE_CASE # 驼峰转下划线 + datasource: + url: jdbc:h2:file:./db.h2 # 使用文件存储 + driverClassName: org.h2.Driver + username: root + password: root + h2: + console: # 开启console访问 默认false + enabled: true + settings: + trace: true # 开启h2 console 跟踪 方便调试 默认 false + web-allow-others: true # 允许console 远程访问 默认false + path: /h2 # h2 访问路径上下文 + jpa: + show-sql: true + open-in-view: false + defer-datasource-initialization: true + database-platform: org.hibernate.dialect.H2Dialect + hibernate: + ddl-auto: update \ No newline at end of file