RESTful开发风格 与 SpringMVC跨域访问
创始人
2024-05-15 17:46:59

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/1URI 必须使用名词POST/article/1
GET/articles/author/1URI 扁平化,不超两级GET/articles/author?id=1
DELETE/articles/1URI 名词区分 单复数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>:
    • name>:formContentFilter
    • class>:org.springframework.web.filter.FormContentFilter
  • mapping>:
    • name>:formContentFilter
    • <url-pattern>:/*
formContentFilterorg.springframework.web.filter.FormContentFilter

formContentFilter/*

非简单请求 的客户端请求方式:

  • 常用 ajax 作为请求方式,只需指定 ajax 的 type 属性即可。
  • 表单提交方式 只支持 GET 和 POST。解决步骤: - 1、在 里把 method 改为 post,然后添加一个隐藏域: - < input type="**hidden**" name="**_method**" value="put 或 delete"/> - 2、在 web.xml 中添加 **HiddenHttpMethodFilter** 过滤器

hiddenHttpMethodFilterorg.springframework.web.filter.HiddenHttpMethodFilter

hiddenHttpMethodFilter/*

跨域访问

浏览器的同源策略:

  • 同源策略阻止从一个域加载的脚本去获取另一个域上的资源。

  • 只要 协议、域名、端口 有任何一个不同,都被当作是不同的域。

  • 因此在不同域名下,即使能够成功获得响应数据,但因为同源策略的阻挡,在 浏览器 这里也不会对数据进行处理。

  • 浏览器 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请添加图片描述

      • 此时,浏览器 就可以正常的对数据进行处理。
二、 全局跨域配置
  • 在 springmvc.xml 中设置
  • <mvc:cors>:SpringMVC 全局跨域配置
    • <mvc:mapping>:映射
      • path:允许被跨域访问的地址;/restful/** 代表 /restful 下的所有
      • allowed-origins:设置允许访问的域名,多个用逗号分隔。
      • max-age:设置 预检请求 处理结果 的缓存时间。



相关内容

热门资讯

人大代表关注“文化赋能科技”:... 新京报讯(记者陈琳)1月24日,参加北京市十六届人大四次会议的代表陆续到会场报到。市人大代表,中国美...
中菲两国联手抓获并遣返施纯芳、... 北京青年报2026-01-24 13:38:11中国驻菲律宾大使井泉1月22日会见菲总统反有组织犯罪...
尹力参加市政协界别联组会,与委... 1月24日下午,中共北京市委书记尹力看望了参加市政协十四届四次会议的部分委员,并参加界别联组会,听取...
创历史新高!白银冲上100美元 澎湃新闻记者 孙铭蔚白银价格冲上100美元。1月23日,白银现货、期货价格双双站上100美元,创历史...
前券商分析师的愤怒!1年半2次...   炒股就看金麒麟分析师研报,权威,专业,及时,全面,助您挖掘潜力主题机会! (来源:五道口江湖)...