要想全面快速学习Spring的内容,最好的方法肯定是先去Spring官网去查阅文档,在Spring官网中找到了适合新手了解的官网Guides,一共68篇,打算全部过一遍,能尽量全面的了解Spring框架的每个特性和功能。
接着上篇看过的guide15,接着往下看。
guide16、Consuming a RESTful Web Service with AngularJS
主要讲的编写一个angularJS的客户端,该客户端使用基于restful web服务。
略过。
guide17、Enabling Cross Origin Requests for a RESTful Web Service
跨域是什么意思?https://segmentfault.com/a/1190000040485198
首先一个url是由:协议、域名、端口 三部分组成。(一般端口默认80)
如:https://blog.moonlet.cn:80
当一个请求url的协议、域名、端口三者之间的任意一个与当前页面url不同即为跨域。
跨源资源共享(CORS)是由大多数浏览器实现的W3C规范,允许您灵活地指定什么样的跨域请求被授权,而不是使用一些不太安全和不太强大的策略,如IFRAME或JSONP。详细可见:https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS
Guide涉及注解:
@CrossOrigin:是用来处理跨源资源共享(CORS)的注解。
注解参数解析:
1、 value:指定允许请求源列表,例如:value=“http://example.com”。*表示允许来自任意请求源的请求。
其值存储在响应标头Access-Control-Allow-Origin中。默认情况下,其值为*,允许来自任意请求源的请求。注意:CORS处理时,从Forwarded、X-Forwarded-Host、X-Forwarded-Port、X-Forwarded-Proto取请求源值。
2、origins:value与origins含义相同,可以任选value和origins进行设置。value与origins若同时存在,两者的值需一致,否则启动时会出现异常。
3、allowedHeaders:指定允许实际请求标头列表,例如:allowedHeaders=“Content-Type,Access-Token”。表示允许实际请求带有任意标头。其值存储在响应标头Access-Control-Allow-Headers中。
若为Cache-Control、Content-Language、Expires、Last-Modified、Pragma,则无需设置。默认情况下,其值为,允许实际请求带有任意标头
4、exposedHeaders:指定允许客户端(如浏览器)访问的响应标头列表,例如:exposedHeaders=“Content-Length”。其值存储在实际CORS请求的响应头Access-Control-Expose-Headers中。默认情况下,只允许客户端访问:Cache-Control、Content-Language、Content-Type、Expires、Last-Modified、Pragma。
5、methods 指定允许请求的HTTP方法。默认情况下,允许请求的HTTP方法与@RequestMapping相同。
6、allowCredentials:指定其值,表示客户端(如浏览器)是否应将凭证(如Cookies)和跨域请求一起发送到服务器。其值存储在预处理响应标头Access-Control-Allow-Credentials中。注意:此选项与配置域建立了高级别的信任,由于公开敏感的信息(如Cookies或CSRF令牌),会增加Web应用程序受攻击的概率。
默认情况下,此值不设置,因此不允许使用任何凭证。
7、maxAge:指定预处理响应的最大缓存期限,单位为秒。其值存储在预处理响应标头Access-Control-Max-Age中。其值设置合理可以有效减少客户端与服务器预处理请求的交互次数。其值为负,表示未定义。
默认情况下,其值为1800秒(30分钟)。
补充:
@CrossOrigin 表示所有的URL均可访问此资源
@CrossOrigin(origins = “http://127.0.0.1:8080”)//表示只允许这一个url可以跨域访问这个
controller
代码说明:@CrossOrigin这个注解用起来很方便,这个可以用在方法上,也可以用在类上。如果你不设置他的value属性,或者是origins属性,就默认是可以允许所有的URL/域访问。
两种使用方法:
一种是直接在controller上加该注解,在类上加,则该类所有的接口方法都被配置:
@CrossOrigin(origins = "http://localhost:8080")
@GetMapping("/greeting")
public Greeting greeting(@RequestParam(required = false, defaultValue = "World") String name) {
System.out.println("==== get greeting ====");
return new Greeting(counter.incrementAndGet(), String.format(template, name));
第二种是全局CROS,可以更改其中的任何跨域属性:
@Configuration
public class MyConfiguration {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurerAdapter() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**");
}
};
}
}
guide18、Accessing JPA Data with REST
主要讲的是使用 Spring Data REST 创建和检索存储在数据库中的对象。Spring Data REST 采用了Spring HATEOAS和Spring Data JPA的特性,并将它们组合在一起。Spring Data REST 还支持Spring Data Neo4j、Spring Data Gemfire和Spring Data MongoDB作为后端数据存储。
Guide涉及注解:
@RepositoryRestResource: https://docs.spring.io/spring-data/rest/docs/current/api/org/springframework/data/rest/core/annotation/RepositoryRestResource.html
@RepositoryRestResource注解让编程人员可以直接通过repository提供数据接口,在这个“前端负责V和C,后端负责提供数据”的时代,非常方便;并且,可以通过给该注解传入参数’path’来改变URL。
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>, CrudRepository<Person,Long> {
List<Person> findByLastName(@Param("name") String name);
}
总的来说,spring DATA REST通过简单的代码配置,就可以实现对对象的CURD/分页排序等功能,而不需要编写对应的Controller.
Spring Data JPA 为 Jakarta Persistence API (JPA) 提供存储库支持。它简化了需要访问 JPA
数据源的应用程序的开发
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/
guide19、Accessing MongoDB Data with REST
讲的是基于hypermedia-based(超媒体)的restful 服务访问基于文档的数据。
Spring Data REST 还支持Spring Data JPA、Spring Data Gemfire和Spring Data Neo4j作为后端数据存储。
和上个guide讲的内容差不多,就是数据存放的地方变成了mongoDB.
@RepositoryRestResource(collectionResourceRel = "people", path = "people")
public interface PersonRepository extends MongoRepository<Person, String> {
List<Person> findByLastName(@Param("name") String name);
}
继承的存储库接口变为了MongoRepository,内部提供了各种操作数据对象的方法。
Spring Data REST 使用HAL 格式进行 JSON 输出。它很灵活,并提供了一种方便的方式来提供与所服务的数据相邻的链接。
guide20、Producing a SOAP web service
主要讲的是基于WSDL的SOAP web服务区公开不同欧洲国家的数据。
SOAP(原为Simple Object Access Protocol的首字母缩写,即简单对象访问协议)是交换数据的一种协议规范,使用在计算机网络Web服务(web service)中,交换带结构的信息。
WSDL 是基于 XML 的用于描述 Web Services 以及如何访问 Web Services 的语言。
Guide涉及注解:
@PostConstruct:该注解的功能:当依赖注入完成后用于执行初始化的方法,并且只会被执行一次。该注解是Java jdk提供的注解,而不是Spring框架提供的。
官方文档:https://docs.oracle.com/javase/8/docs/api/javax/annotation/PostConstruct.html
@Endpoint
public class AnnotationOrderEndpoint {
private final OrderService orderService;
@Autowired
public AnnotationOrderEndpoint(OrderService orderService) {
this.orderService = orderService;
}
@PayloadRoot(localPart = "order", namespace = "http://samples")
public void order(@RequestPayload Element orderElement) {
Order order = createOrder(orderElement);
orderService.createOrder(order);
}
@PayloadRoot(localPart = "orderRequest", namespace = "http://samples")
@ResponsePayload
public Order getOrder(@RequestPayload OrderRequest orderRequest, SoapHeader header) {
checkSoapHeaderForSomething(header);
return orderService.getOrder(orderRequest.getId());
}
}
SpringWebServices(Spring-WS)是Spring社区的一个产品,专注于创建文档驱动的Web服务。SpringWebServices旨在促进契约优先的SOAP服务开发,允许使用多种操作XML有效负载的方式之一创建灵活的Web服务。
@Endpoint: 此注解告诉Spring注解这是个类有资格处理soap请求。是spring-ws服务端的核心概念,spring-ws通过Endpoints来定义服务端动作,来接收处理XML请求,并生成响应XML。可以通过@Endpoint注解来创建endpoint,每一个endpoint都可以定义多个处理请求的方法。
@PayloadRoot:一般通过@PayloadRoot可以指定每一个方法处理哪一类的消息
@RequestPayload: 指传入消息将映射到该方法的参数请求对象。
@ResponsePayload: 使Spring WS将返回值映射到响应Order。
可以类比Spring MVC的Controller做个类比,有点相似。