* 也就是说,每个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框架的主要实现过程,尤其是需要注意的核心技术问题及其解决方案。希望本文对正在探索前后端分离的读者们有所帮助,期待与大家共同探讨。
閱讀更多 Java的小本家 的文章