RESTful
- REST:表现层状态转换,资源在网络中以某种表现形式进行状态转移
- RESTful 是基于 REST理念 的一套开发风格,是具体的开发规则,如果一个架构符合REST 原则,就称为 RESTful 架构。
RESTful 开发规范:
- 使用 URL 作为用户交互入口
- 明确的语义规范(GET | POST | PUT | DELETE)
- Web 环境下只支持 GET 和 POST
- GET:用来获取资源
- POST:用来新建资源(也可以用于更新资源)
- PUT:用来更新资源
- DELETE:用来删除资源
- 只返回数据(JSON | XML),不包含任何展现
RESTful 命名要求:
URI | 说明 | 修改建议 |
---|---|---|
GET/articles?au=lily | 正确用法 | |
GET/a/1 URI | 必须具有语义 | GET/student/1 |
POST/createArticle/1 | URI 必须使用名词 | POST/article/1 |
GET/articles/author/1 | URI 扁平化,不超两级 | GET/articles/author?id=1 |
DELETE/articles/1 | URI 名词区分 单复数 | GET/articles?au=lily DELETE/article/1 |
Spring MVC 支持 RESTful
- @RestController:这是一个组合注解,用来代替 @Controller
- 默认拥有 @ResponseBody
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {}
-
请求注解:
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
-
路径变量:放在 uri 中的变量。
- 在请求映射注解的 uri 后面添加:/{name}
- 别名能够通过 SpringMVC 自动获取到 路径变量值。
-
@PathVariable(“name”):将 路径变量 按照别名 自动注入到 所修饰的参数中,(可省略)
@GetMapping("user/{id}")
public String user(@PathVariable("id") int alias) {}
此时 http:localhost:8080/test01/1 ;alias 值为 1
简单/非简单 请求
-
简单请求是指标准结构的 HTTP 请求,对应 GET / POST 请求。
-
非简单请求是复杂要求的 HTTP 请求,指 PUT / DELETE / 扩展标准请求。
-
两者最大区别是 非简单请求 发送前需要 发送 预检请求 。
- 对于 不符合要求 的请求,服务器通过 预检请求 预先发现,便会中断请求。
- 能够减轻 网络传输以及服务器 的压力。
- 对于 不符合要求 的请求,服务器通过 预检请求 预先发现,便会中断请求。
Spring MVC 中使用非简单请求,想要完美支持 参数的获取,需要 在 web.xml 中配置 过滤器 进行支持。
- <filter>:
- <filter-name>:formContentFilter
- <filter-class>:org.springframework.web.filter.FormContentFilter
- <filter-mapping>:
- <filter-name>:formContentFilter
- <url-pattern>:/*
<filter>
<filter-name>formContentFilter</filter-name>
<filter-class>org.springframework.web.filter.FormContentFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>formContentFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
非简单请求 的客户端请求方式:
- 常用 ajax 作为请求方式,只需指定 ajax 的 type 属性即可。
- 表单提交方式 只支持 GET 和 POST。解决步骤: - 1、在 里把 method 改为 post,然后添加一个隐藏域: - < input type="**hidden**" name="**_method**" value="put 或 delete"/> - 2、在 web.xml 中添加 **HiddenHttpMethodFilter** 过滤器
<!-- 使支持 RESTFul 风格,delete转换为标准的http delete方法 -->
<filter>
<filter-name>hiddenHttpMethodFilter</filter-name>
<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>hiddenHttpMethodFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
跨域访问
浏览器的同源策略:
-
同源策略阻止从一个域加载的脚本去获取另一个域上的资源。
-
只要 协议、域名、端口 有任何一个不同,都被当作是不同的域。
-
因此在不同域名下,即使能够成功获得响应数据,但因为同源策略的阻挡,在 浏览器 这里也不会对数据进行处理。
-
浏览器 Console 看到 Access-Control-Allow-Origin 就代表跨域了
- 注意:本机 http://localhost 和 http://127.0.0.1 也属于跨域。
HTML中允许跨域的标签:
- : 显示远程 图片
CORS跨域资源访问:
- CORS 是—种机制,使用额外的 HTTP头 通知浏览器可以访问其他域。
- URL 响应头包含 Access-Control-* 指明请求允许跨域。
SpringMVC 解决跨域访问:
一、@CrossOrigin 注解
- 修饰 Controller类,允许被指定范围域的网站 跨域访问。
- origins:设置允许访问的域名,多个用{}括着,逗号分隔。
- * 代表所有(不建议)
- maxAge = seconds:设置 预检请求 处理结果 的缓存时间。
-
在缓存时间内 同样的请求就能直接根据结果来 同意 / 中断 请求。能够降低服务器的压力。
-
其原理就是在 响应标头中增加了 Vary: Access-Control-Request-Method 与 Vary: Access-Control-Request-Headers
- 此时,浏览器 就可以正常的对数据进行处理。
-
二、<mvc:cors > 全局跨域配置
- 在 springmvc.xml 中设置
- <mvc:cors>:SpringMVC 全局跨域配置
- <mvc:mapping>:映射
- path:允许被跨域访问的地址;/restful/** 代表 /restful 下的所有
- allowed-origins:设置允许访问的域名,多个用逗号分隔。
- max-age:设置 预检请求 处理结果 的缓存时间。
- <mvc:mapping>:映射
<!-- 全局跨域配置 -->
<mvc:cors>
<mvc:mapping path="/restful/**" allowed-origins="http://127.0.0.1:8080" max-age="3600"/>
</mvc:cors>