REST风格框架实战:从MVC到前后端分离(附完整Demo)

* 也就是说,每个REST请求将返回相同结构的JSON响应结构。不妨定义一个相对通用的JSON响应结构,其 * @author rico * @author rico * @author rico * @author rico * @author rico * @author rico * @author rico * @author rico *
* @author rico


* @created 2017年7月4日 下午4:32:34
*/
@Component
@Aspect
public class SecurityAspect {
/** Log4j日志处理(@author: rico) */
private static final Logger log = Logger.getLogger(SecurityAspect.class);
private TokenManager tokenManager;
@Resource(name = "tokenManager")
public void setTokenManager(TokenManager tokenManager) {
this.tokenManager = tokenManager;
}
@Around("@annotation(org.springframework.web.bind.annotation.RequestMapping)")
public Object execute(ProceedingJoinPoint pjp) throws Throwable {
// 从切点上获取目标方法
MethodSignature methodSignature = (MethodSignature) pjp.getSignature();
log.debug("methodSignature : " + methodSignature);
Method method = methodSignature.getMethod();
log.debug("Method : " + method.getName() + " : "
+ method.isAnnotationPresent(IgnoreSecurity.class));
// 若目标方法忽略了安全性检查,则直接调用目标方法
if (method.isAnnotationPresent(IgnoreSecurity.class)) {
return pjp.proceed();
}
// 从 request header 中获取当前 token
String token = WebContextUtil.getRequest().getHeader(
Constants.DEFAULT_TOKEN_NAME);
// 检查 token 有效性
if (!tokenManager.checkToken(token)) {
String message = String.format("token [%s] is invalid", token);
log.debug("message : " + message);
throw new TokenException(message);
}
// 调用目标方法
return pjp.proceed();
}
}

若要使SecurityAspect生效,则需要在SpringMVC配置文件中添加如下Spring 配置:

  


use-default-filters="false">

expression="org.springframework.stereotype.Controller" />

expression="org.springframework.web.bind.annotation.ControllerAdvice" />



最后,别忘了在web.xml中添加允许的X-Token响应头,配置如下:

 
allowHeaders
Content-Type,X-Token


四. 关于Demo部署的若干建议

关于REST服务的调试推荐大家使用Postman这款工具,请大家自行下载与安装,具体见《postman的安装与使用(模拟请求)》;


五. 总结

本文从经典的MVC模式开始,对MVC模式是什么以及该模式存在的不足进行了简述。然后引出了如何对MVC模式的改良,让其转变为前后端分离架构,以及解释了为何要进行前后端分离。最后通过REST服务将前后端进行解耦,并提供了一款基于Java的REST框架的主要实现过程,尤其是需要注意的核心技术问题及其解决方案。希望本文对正在探索前后端分离的读者们有所帮助,期待与大家共同探讨。


分享到:


相關文章: