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。