Liuqichun's Blog

分享|后端常见技术名词

这是给三月的学弟学妹的一次分享,科普后端常见技术名词。

一、Token

Token 是什么? Token 是服务端生成的一个标识客户端的字符串,具有唯一性,作为访问服务端的凭证。特殊的 Token(如 JWT)可以携带信息。

为什么要用 Token?

为了解决 HTTP 无状态的问题 无状态指每次的请求都是独立的,它的执行情况和结果与前面的请求和之后的请求是无直接关系的,它不会受前面的请求应答情况直接影响,也不会直接影响后面的请求应答情况。

反之有状态就是请求之间可以建立关系,服务端能够区分请求是谁发送的。

为了使之有状态,HTTP 加入了 Cookie 和 Session 机制。

基于 Session 会话的缺点

Session 是基于 Cookie 实现的。服务端将用户信息存放到 Session 中,客户端在 Cookie 中存放 session id,客户端每次请求在 HTTP Header 中带上 session id,服务端从 HTTP Header 拿到 session id 后查对应的 Session 以获取用户信息;得到用户信息后,服务端就可以对请求做拦截判断,对请求资源进行鉴权。

image.png

image.png

使用 Session 做状态管理的缺点:

Token 改进 Session 会话方式

token 实现无状态服务

二、Redis

Redis 是非关系型内存数据库,常用来做缓存,处在 DAO 与数据库中间。

image.png

常用场景:

三、RESTful API 规范

RESTful 是目前最流行的 API 设计规范,用于 Web 数据接口的设计。

为什么要使用这套规范?

1、协议 (Protocol)

接口之间的通信总是使用 HTTPS。

HTTPS:在 HTTP 传输过程中使用公私钥对传输进行加密(TLS/SSL)

2、域名 (Domain)

作为第三方服务 API 的域名。

https://api.example.com

如果 API 很简单,推荐这种方式。

https://example.com/api/

3、版本 (Version)

通常将版本号放在 URL 中。通常默认 API 为第 1 版,不加 v1,到第 2 版时加 v2。

https://api.example.com/v1/

4、路径 (Endpoint)

路径表示访问 API 的具体网址。一般来说,数据库中的表都是同种记录的“集合”(collection),所以 API 中的名词也应该使用复数。

举例来说,有一个 API 提供动物园(zoo)的信息,还包括各种动物和雇员的信息,则它的路径应该设计成下面这样。

在 RESTful 架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。

5、HTTP 动词

对于资源的具体操作类型,由 HTTP 动词表示。

常用的 HTTP 动词有下面五个(括号里是对应的 SQL 命令)。

不常用的 HTTP 动词。

示例:

推荐文章: http://www.ruanyifeng.com/blog/2011/09/restful.html http://www.ruanyifeng.com/blog/2014/05/restful_api.html http://www.ruanyifeng.com/blog/2018/10/restful-api-best-practices.html

6、过滤信息(Filtering)

如果记录数量很多,服务器不可能都将它们返回给用户,通常用查询字符串过滤。

7、状态码(Status Codes)

每次客户端请求,服务器都给出回应。回应即 HTTP 状态码和数据。

常见状态码

数据对象

image.png

DTO(Data Transfer Object) 这个传输通常指的是前后端之间的传输。 DTO 是一个比较特殊的对象,它有两种存在形式:

PS:项目中 Service 和 Controller 层一般入参是 DTO 对象,返回参数是 BO 或者 BO 的集合(Collection)。

BO(Business Object):业务对象,组装多个 entity(PO),一般会继承一个 entity(PO)并对其扩展。BO 通常是在 Service 方法中组装完成的。

1//entity
2class User{
3    private String name;
4    private Integer age;
5}
1class UserBO extends User{
2    List<Dept> depts;
3    List<Role> roles;
4}

VO(View Object):视图对象,用于展示层,它的作用是把某个指定页面(或组件)的所有数据封装起来给前端使用。

推荐文章:https://zhuanlan.zhihu.com/p/102389552

跨域问题

跨域问题是由于浏览器的同源策略引起的,同源策略是浏览器安全措施的一种约定。同源策略会阻止一个域的 JavaScript 脚本和另一个域的内容进行交互。

同源就是一个域,即协议、域名(主机)、端口号相同则认为同源。出现任意一个不同就认为不同源,即出现跨域。

出现跨域引起的问题

解决跨域的方法

根本解决办法是通过 CORS(Cross-Origin Resource Sharing)解决,它是 W3C 标准,也是跨源 AJAX 请求的根本解决方法。

JSONP 方式

1、JSONP JSONP 是服务器与客户端跨源通信的常用方法。最大特点就是简单适用,兼容性好(兼容低版本 IE),缺点是只支持 GET 请求,不支持 POST 请求。 核心思想:网页通过添加一个 script 元素,向服务器请求 JSON 数据,服务器收到请求后,将数据放在一个指定名字的回调函数的参数位置传回来。

 1<script src="http://test.com/data.php?callback=dosomething"></script>
 2//
 3向服务器test.com发出请求,该请求的查询字符串有一个callback参数,用来指定回调函数的名字
 4// 处理服务器返回回调函数的数据
 5<script type="text/javascript">
 6  function dosomething(res) {
 7    // 处理获得的数据
 8    console.log(res.data);
 9  }
10</script>
1$.ajax({
2  url: "http://www.test.com:8080/login",
3  type: "get",
4  dataType: "jsonp", // 请求方式为jsonp
5  jsonpCallback: "handleCallback", // 自定义回调函数名
6  data: {},
7});
1this.$http
2  .jsonp("http://www.domain2.com:8080/login", {
3    params: {},
4    jsonp: "handleCallback",
5  })
6  .then((res) => {
7    console.log(res);
8  });
后端处理

服务器端对于 CORS 的支持,主要是通过设置 Access-Control-Allow-Origin 来进行的。如果浏览器检测到相应的设置,就可以允许 Ajax 进行跨域的访问。

1、普通跨域请求:只需服务器端设置 Access-Control-Allow-Origin 2、带 Cookie 的跨域请求:前后端都需要进行设置

项目中 Spring Security 使用 CORS 处理跨域

 1@Configuration
 2public class GlobalCorsConfig {
 3    @Bean
 4    public CorsFilter corsFilter() {
 5        //1.添加CORS配置信息
 6        CorsConfiguration config = new CorsConfiguration();
 7        //1) *默认所有ip和端口都可以访问,也可以设置固定
 8        config.addAllowedOrigin("*");
 9        //2) 是否发送Cookie信息
10        config.setAllowCredentials(true);
11        //3) 允许的请求方式
12        config.addAllowedMethod("OPTIONS");
13        config.addAllowedMethod("HEAD");
14        config.addAllowedMethod("GET");
15        config.addAllowedMethod("PUT");
16        config.addAllowedMethod("POST");
17        config.addAllowedMethod("DELETE");
18        config.addAllowedMethod("PATCH");
19        // 4)允许的头信息
20        config.addAllowedHeader("*");
21        // 5)有效时长
22        config.setMaxAge(3600L);
23        //2.添加映射路径,我们拦截一切请求
24        UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
25        configSource.registerCorsConfiguration("/**", config);
26
27        //3.返回新的CorsFilter.
28        return new CorsFilter(configSource);
29    }
30}

普通处理跨域。

 1/*
 2 * 导入包:import javax.servlet.http.HttpServletResponse;
 3 * 接口参数中定义:HttpServletResponse response
 4 */
 5
 6// 允许跨域访问的域名:若有端口需写全(协议+域名+端口),若没有端口末尾不用加'/'
 7response.setHeader("Access-Control-Allow-Origin", "http://www.domain1.com");
 8
 9// 允许前端带认证cookie:启用此项后,上面的域名不能为'*',必须指定具体的域名,否则浏览器会提示
10response.setHeader("Access-Control-Allow-Credentials", "true");
11
12// 提示OPTIONS预检时,后端需要设置的两个常用自定义头
13response.setHeader("Access-Control-Allow-Headers", "Content-Type,X-Requested-With");

水平越权,垂直越权

水平越权指权限相同的用户发生了相互操作。如:两个不同的管理部门(都对用户管理),一个部门的管理员可以管理另一个部门的员工;一个管理员可以把另一个管理员删除。

垂直越权指不同权限的用户发生相互操作(一般是低权限操作高权限的)。如:普通用户删除管理员。

对于这些问题,一般在 service 的业务层通过逻辑判断解决,例如:对于出现跨部门操作的水平越权问题可以在操作前判断管理员与被操作者是否属于同一部门解决。

EOF

<< Previous Post

|

Next Post >>

#分享