springboot,springmvc 中通过   熟悉Swagger测试api接口
    Swagger是当前最好用的Restful API文档生成的开源项目
      //里面有中文文档和英文文档
    调用和可视化 RESTful 风格的 Web 服务
    A: 加載 maven springfox-swagger2  springfox-swagger-ui
    B:
    @Configuration注解,让springboot来加载该类的配置。在通过@EnableSwagger2注解来
    启用Swagger2。再通过@Bean注入Docket实体类, apiInfo()用来创建该api的基本信息,这些信息将会展现在文档页面中。
    
    https://www.jianshu.com/p/5716c1cdf7f4     

extends WebMvcConfigurerAdapter  重寫的方法
     addResourceHandlers: 此方法是用来添加静态资源映射的
     addInterceptors  此方法是用来注册拦截器的
     
     public Docket defaultApi() //swagger 基本配置比如扫描的包等等
     private ApiInfo apiInfo()  //pi文档的详细信息在文档页面展示
     
     
     
     @Api(description = "购物车接口"):修饰整个类
     @ApiOperation("获取购物车"):描述一个类的一个方法,或者说一个接口
     @ApiParam(required = true, name = "cartId", value = "cartId"):单个参数描述
     @ApiModel:用对象来接收参数 
     @ApiProperty:用对象接收参数时,描述对象的一个字段
     @ApiResponse:HTTP响应其中1个描述
     @ApiResponses:HTTP响应整体描述
     @ApiIgnore:使用该注解忽略这个API
     @ApiError :发生错误返回的信息
     @ApiImplicitParam:一个请求参数
     @ApiImplicitParams:多个请求参数    
     @AppLogin
     @GetMapping("/getUserInfo")
     @ApiOperation("获取用户信息")
     public R userInfo(HttpServletRequest request
     ){
         // 前台可以传递一个token 作为参数 也可以通过在请求头中获取
         // 在登录创建token 的时候 传入登录用户的id 设置token 的有效时间
         //  在有效时间内可以获取到登录用户的id 来使用
         String headValue = request.getHeader("APPToken");
         Claims claims = jwtUtils.getClaimByToken(headValue);
         String usersId = claims.getSubject().toString();
         User user = userService.findByPrimaryKey(usersId);
         return R.ok().put("users", user);
     }


A: JWT概念
     
    使用JWT我我们首先设置三个参数  Header 自定义头部, token 的有效时长,以及秘钥
    生成的token 主要是检查是否过期,获取登录用户的信息
    
    是一种用户双方之间传递安全信息的规范,跨域身份验证解决方案
    JWT组成 JSON WEB Token
    头信息(header):Token类型以及采用加密的算法
    消息体(payload :它包含了Claim,一般是一些实体(一般都是用户)的状态和额外数据组成
    签名(signature):使用编码后的header和payload以及一个秘钥
    
    JWT 保护服务器端的资源, 客户端通过http 的header 发送给服务器
    由于前后端的分离 放弃了传统的 cookie-session认证机制, 使用JWT来管理session
    token = header + payload + signature
B: 易于水平扩展
    cookie内仅包含一个session标识符,session 作用服务器端,
    把session中的认证信息都保存在JWT中,在服务端就没有session存在的必要了。当服务端水平扩展的时候,
    就不用处理session复制(session replication)/ session黏连(sticky session)或是引入外部session存储了

基于Token的身份验证以及基于服务器的身份验证
    传统的做法是将已经认证过的用户信息存储在服务器上,比如Session。用户下次请求的时候带着Session ID,
    然后服务器以此检查用户是否认证过。这种基于服务器的身份认证方式存在一些问题:
    Sessions : 每次用户认证通过以后,服务器需要创建一条记录保存用户信息,通常是在内存中,随着认证通过的用户越来越多,服务器的在这里的开销就会越来越大。
    Scalability : 由于Session是在内存中的,这就带来一些扩展性的问题。
    CORS : 当我们想要扩展我们的应用,让我们的数据被多个移动设备使用时,我们必须考虑跨资源共享问题。当使用AJAX调用从另一个域名下获取资源时,我们可能会遇到禁止请求的问题。
    CSRF : 用户很容易受到CSRF攻击。

5.3. 基于Token的身份认证是如何工作的
           基于Token的身份认证是无状态的,服务器或者Session中不会存储任何用户信息。
    没有会话信息意味着应用程序可以根据需要扩展和添加更多的机器,而不必担心用户登录的位置。
    但其主要流程如下:
    用户携带用户名和密码请求访问
    服务器校验用户凭据
    应用提供一个token给客户端
    客户端存储token,并且在随后的每一次请求中都带着它
    服务器校验token并返回数据
    注意:

    每一次请求都需要token
    Token应该放在请求header中
5.4. 用Token的好处
    无状态和可扩展性:Tokens存储在客户端。完全无状态,可扩展。我们的负载均衡器可以将用户传递到任意服务器,因为在任何地方都没有状态或会话信息。
    安全:,token在一段时间以后会过期,这个时候用户需要重新登录    
5.2. JWT与Session的差异
    相同点是,它们都是存储用户信息;然而,Session是在服务器端的,而JWT是在客户端的。
    Session方式存储用户信息的最大问题在于要占用大量服务器内存,增加服务器的开销。
    而JWT方式将用户状态分散到了客户端中,可以明显减轻服务端的内存压力。
    Session的状态是存储在服务器端,客户端只有session id;而Token的状态是存储在客户端
    
32 cookie和session 的区别
  cookie是服务器传递到浏览器,保存在浏览器中的数据,然后浏览器每次请求都带上cookie,
  这样就可以标识用哪一个用户发起的请求, 比如说把用户登录的用户名和密码保存在cookie中, 
  只要cookie没有过期,以后用户每次登录都可以自动登录了,不需要在此输入用户名和密码,
  因为浏览器在发起请求的时候已经把cookie中的用户名和密码传递给服务器了。

  session是什么呢?session把用户的信息保存在服务器上面,
 浏览器第一次访问的时候服务器把sessionID传递到浏览器,
 然后浏览器把Session_id保存在cookie中, 每次访问把session_id带上,
 服务器就可以标识这个请求来自于那个用户,然后根据session_id查这个这个用户的seesion
 里面记录了哪些数据