文档章节

前后端分离:使用spring的Aop实现Token验证

k
 keeperv
发布于 2016/08/21 11:40
字数 1004
阅读 568
收藏 4

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

关于token的生成与验证可以参考前一篇文章 利用Redis和Jwt实现Token生成,存储,验证方法

#思考

首先我们的token是在登录后才生成的用于交换信息的凭证,在一个应用中也并不是所有的地方都需要进行token验证,比如:首页,登录页等,而一般用到token验证的都是属于后台管理部分(只是举个大概),那么这就产生了一个问题,我们需要在验证token的时候再验证,不需要的时候就不管。

##解决方案一 :拦截器(不推荐)

下面是springmvc的拦截器代码,我采用的是直接实现的handlerInterceptor接口的形式

public class TokenInterceptor implements HandlerInterceptor{
    @Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
	    //此处实现拦截逻辑
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}
}

可以想象直接在拦截器实现的话,代码量是很大的,而且耦合程度过高,一般情况下是利用request获取请求uri,然后判断该uri是否需要进行Token验证,要的话进行token验证,根据结果判断是否放行,否则直接放行。 当然我们也可以实现多个拦截器,起一个链式调用的作用,不过我这儿就不在赘述了,因为我们有更好的方案。

##解决方案二:Aop(推荐)

关于Aop,我这儿有一个例子:我们可以想象一个食品工厂对不同的食品进行包装,包装上都会打印生产日期,保质期等,尽管是不同的食品,不同的包装,但是它都会打印这些数据,而我们的Aop也类似这样,不同的代码,我们需要统一处理他们执行前或者执行后的一些逻辑代码,而这些逻辑代码都是一样的,我们就把他们封装起来,利用Aop来减少重复的代码。

回归正题,我们这儿利用Spring本身的aop特性来实现Token验证,采用注解的方式实现。

###定义@Token注解

该注解用于标注需要进行Token验证的方法

/*
*Target指定注解的目标为方法级
*Retention指定注解可以在运行时被获取(利用反射)
*/
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Token {

}

###实现TokenAspect

实现spring的aop,统一处理token验证

@Aspect
public class TokenAspect{
    //pjp参数由spring注入
    public Object execute(ProceedingJoinPoint pjp) throws  Throwable{
            MethodSignature ms = (MethodSignature) pjp.getSignature();
	    //获取当前正在执行的方法
            Method method = ms.getMethod();
            //判断该方法是否被注解@Token标记
            if(method.isAnnotationPresent(Token.class)){
                //执行token验证
            }

            //继续执行方法
            return pjp.proceed();
    }
}

###配置spring配置文件

此处配置的时候,如果是使用了spring+springMVC的模式下,需要注意spring和springMVC父子容器的问题,如果我们的@Token是标注于Controller(被@Controller或者@RestController注解标记)层的话,由于controller层是由springMVC容器来管理的,若此时我们的TokenAspect是由Spring来管理的话,由于在方法调用的时候,spring无法获取子容器的管理对象,aop就不起作用,自然@Token注解也就失效了。 所以这儿我们的aop也需要配置再springMVC的配置文件中,由SpringMVC来管理。

####springMVC.xml的Aop配置

    <!--bean配置-->
    <bean id="tokenAspect" class="cc.cc1234.aspect.TokenAspect">
    <aop:config>
		<aop:aspect ref="tokenAspect">
                    <!--切入表达式,代表了对那些地方需要执行切入
                    ,此处我们对被注解@Token标注的方法执行切入,执行方法为 execute();
                    -->
			<aop:around method="execute" pointcut="@annotation(com.example.annotation.Token)"/>
		</aop:aspect>
    </aop:config>

##结语 上面我只是列出了个大概,具体的业务代码并没有写出来,关于spring的aop可以百度或者google可以了解其更多的作用,当然平常我们也利用其来实现日志的记录。

© 著作权归作者所有

k
粉丝 1
博文 4
码字总数 3385
作品 0
渝北
私信 提问
分布式系统 - iBase4J

Spring boot,Spring,SpringMVC,Mybatis,mybatis-plus,motan/dubbo分布式,Redis缓存,Shiro权限管理,Spring-Session单点登录,Quartz分布式集群调度,Restful服务,QQ/微信登录,App t...

iBase4J
2016/05/04
140.7K
77
如何将自己创建的对象注入Spring中?

背景说明 我的系统是一个Java Web服务,现在我想前后端进行分离,所有接口都API化,请求接口的参数必须加密。为了适应当前Spring MVC的开发风格,我通过使用AOP,在进入接口方法之前先对传入...

FunGa
2018/05/02
1K
4
前后端分离-从MVC到前后端分离

摘要:MVC模式早在上个世纪70年代就诞生了,直到今天它依然存在,可见生命力相当之强。MVC模式最早用于Smalltalk语言中,最后在其它许多开发语言中都得到了很好的应用,例如,Java中的Strut...

郭恩洲_OSC博客
2016/11/21
185
0
在Javascript中进行面向切面编程

什么是面向切面编程? 面向切面编程(Aspect-oriented programming,AOP)是一种编程范式。做后端 Java web 的同学,特别是用过 Spring 的同学肯定对它非常熟悉。AOP 是 Spring 框架里面其中...

samciu
04/27
0
0
Spring Security 实战干货: 登录后返回 JWT Token

前言 欢迎阅读 Spring Security 实战干货 系列文章,上一文 我们实现了 JWT 工具。本篇我们将一起探讨如何将 JWT 与 Spring Security 结合起来,在认证成功后不再跳转到指定页面而是直接返回...

码农小胖哥
10/28
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

一篇文章教你轻松使用fastjson

前言 只有光头才能变强。 文本已收录至我的GitHub精选文章,欢迎Star:https://github.com/ZhongFuCheng3y/3y JSON相信大家对他也不陌生了,前后端交互中常常就以JSON来进行数据交换。而有的...

Java3y
31分钟前
4
1
分组功能(tapply,by,aggregate)和* apply系列

每当我想在R中做“ map” py任务时,我通常都会尝试在apply系列中使用一个函数。 但是,我从未完全理解它们之间的区别-{ sapply , lapply等}如何将函数应用于输入/分组输入,输出将是什么样...

javail
31分钟前
4
0
PHP环境搭建之单独安装

还在使用PHP集成环境吗?教你自定义搭建配置PHP开发环境,按照需求进行安装,安装的版本可以自己选择,灵活性更大。 目录: 1. 安装Apache 2. 安装PHP 3. 安装MySQL 4. 安装Composer 观看:h...

不冷的大叔
43分钟前
4
0
为什么JavaScript变量会以美元符号开头?

我经常看到JavaScript带有以美元符号开头的变量。 您何时/为什么选择以这种方式为变量添加前缀? (我不是在问您在jQuery和其他语言中看到的$('p.foo')语法,而是普通变量,例如$name和$orde...

技术盛宴
47分钟前
4
0
TCP 三次握手

https://my.oschina.net/u/4198159/blog/3141874

奋斗的小牛
56分钟前
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部