什么是REST API

RESTful是什么?

RESTful(Representational State Transfer 表现层状态转移)是一种架构风格,底层主要基于HTTP协议,无状态的,表现为请求-响应的形式,区别传统session/cookie会话管理架构。

** 理解REST有五点:**

1.资源(一个url就是一个资源)

2.资源的表述 (接口访问时,请求数据必须包含所有必要信息,比如身份认证)

3.状态的转移 (访问是无状态的,可以有多台计算机提供相同的服务,可以部署集群)

4.统一接口 (统一访问路径)

5.超文本驱动(json,xml数据交互)

** 什么是REST API?**

基于RESTful架构的一套互联网分布式的API设计理论。和上面资源,状态和统一接口有着密切的关系。

RESTul API并没有强制性的要求,只要满足RESTful约束和设计原则都可以称之为REST API

为啥分布式互联网架构很常见呢?请看下面两个模式

MVC模式:

在这里插入图片描述
传统mvc架构基于session和cookie会话管理,网页浏览形式呈现数据。

REST API模式:
在这里插入图片描述
基于REST API 接口提供数据,前端调用者不用关注实现细节,实现前后端分离,比如现在的App就是这种架构。

为什么会用REST API这种架构:

互联网1.0时代

只有PC终端,基于sesssion和cookie会话管理,通过http协议传输数据,浏览器网页端呈现数据。

互联网2.0时代
移动互联网(PC,手机,电视,物联网,可穿戴设置等等),有不同的终端,而采用REST API 架构,统一接口服务所有终端,就大大减少了后端的开发,减少了维护的工作量。同时终端调用者不用关注后台接口实现的逻辑,方便做扩展,服务接口的扩展性和可用性都会大大的提高。

RESTAPI权限控制

RESTful是无状态的,所以每次请求就需要对起进行认证和授权。

1认证
身份认证,即登录验证用户是否拥有相应的身份。简单的说就是一个Web页面点击登录后,服务端进行用户密码的校验。

权限验证(授权)
也可以说成授权,就是在身份认证后,验证该身份具体拥有某种权限。即针对于某种资源的CRUD,不同用户的操作权限是不同的。

一般简单项目:做个sign(加密加盐参数)+ 针对用户的access_token

复杂的话,加入 SLL ,并使用OAuth2进行对token的安全传输。

** AccessToken权限解决**

/**
 * Access Token拦截器
 * <p/>
 * Created by bysocket on 16/4/18.
 */
@Component
public class AccessTokenVerifyInterceptor extends HandlerInterceptorAdapter {
    @Autowired
    ValidationService validationService;
    private final static Logger LOG = LoggerFactory.getLogger(AccessTokenVerifyInterceptor.class);
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        LOG.info("AccessToken executing ...");
        boolean flag = false;
        // token
        String accessToken = request.getParameter("token");
        if (StringUtils.isNotBlank(accessToken)) {
            // 验证
            ValidationModel v = validationService.verifyAccessToken(accessToken);
            // 时间过期
            // 用户验证
            if (v != null) {
                User user = userService.findById(v.getUid());
                if(user != null) {
                    request.setAttribute(CommonConst.PARAM_USER, user);
                    LOG.info("AccessToken SUCCESS ...  user:" + user.getUserName() + " - " + accessToken);
                    flag = true;
                }
            }
        }
        if (!flag) {
            response.setStatus(HttpStatus.FORBIDDEN.value());
            response.getWriter().print("AccessToken ERROR");
        }
        return flag;
    }
}

第一步:从request获取token

第二步:根据token获取校验对象信息(也可以加入过期时间校验,简单)

第三步:通过校验信息获取用户信息

** 配置拦截**

/**
 * MVC 设置
 *
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
    @Bean
    public AccessTokenVerifyInterceptor tokenVerifyInterceptor() {
        return new AccessTokenVerifyInterceptor();
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(tokenVerifyInterceptor()).addPathPatterns("/test");
        super.addInterceptors(registry);
    }
}

第一步:将拦截器配置成Bean
第二步:拦截器注册注入该拦截器,并配置拦截的URL

token存哪里?

ehcache,redis,db都可以。自然简单的当然是db。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值