概述
1、AOP核心概念
1、横切关注点
对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点
2、切面(aspect)
类是对物体特征的抽象,切面就是对横切关注点的抽象
3、连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器
4、切入点(pointcut)
对连接点进行拦截的定义
5、通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
6、目标对象
代理的目标对象
7、织入(weave)
将切面应用到目标对象并导致代理对象创建的过程
8、引入(introduction)
在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段。
2、Spring对AOP的支持
Spring中AOP代理由Spring的IOC容器负责生成、管理,其依赖关系也由IOC容器负责管理。因此,AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IOC容器的依赖注入提供。Spring创建代理的规则为:
1、默认使用Java动态代理来创建AOP代理,这样就可以为任何接口实例创建代理了
2、当需要代理的类不是代理接口的时候,Spring会切换为使用CGLIB代理,也可强制使用CGLIB(这里我使用的就是CGLIB代理)
AOP编程其实是很简单的事情,纵观AOP编程,程序员只需要参与三个部分:
1、定义普通业务组件
2、定义切入点,一个切入点可能横切多个业务组件
3、定义增强处理,增强处理就是在AOP框架为普通业务组件织入的处理动作
所以进行AOP编程的关键就是定义切入点和定义增强处理,一旦定义了合适的切入点和增强处理,AOP框架将自动生成AOP代理,即:代理对象的方法=增强处理+被代理对象的方法。
3、贴代码之前先说明一下,要实现spring aop,必须要有以下jar,
1、aopalliance.jar
2、aspectjweaver.jar
aspect类
//aop身份验证类
@Aspect
@Component
public class UserAuthorizeAspect {
//拦截controller中所有以get方法开头的方法,其实就是每个页面的首页
@Pointcut("execution (public * com.cn.lin.controller.*Controller.get*(..))" )
public void verify(){}
@Before("verify()")
public void doVerify(){
//System.out.print("doVerify");
ServletRequestAttributes attr = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attr.getRequest();
//查询session
if(request.getSession().getAttribute(Const.MANAGER)==null){
//System.out.print("not login yet");
throw new AuthorizeException();
}
}
}
AuthorizeException类
public class AuthorizeException extends RuntimeException{
}
ExceptionResolver全局异常处理类,这里我用@ExceptionHandler指定了AuthorizeException异常类。所以只处理该异常,不加@ExceptionHandler注释的话默认处理所有异常。
@Component
public class ExceptionResolver implements HandlerExceptionResolver{
@ExceptionHandler(value= AuthorizeException.class)
public ModelAndView resolveException(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2,
Exception arg3) {
// TODO Auto-generated method stub
System.out.print("exception");
ModelAndView model = new ModelAndView(new MappingJacksonJsonView());
model.setViewName("login");
return model;
}
}
整个流程就是,当访问后台管理界面时,UserAuthorizeAspect类会判断session是否存在,如果不存在则抛出自定义异常,然后在ExceptionResolver异常处理类中捕获,将页面跳转到登录页面。
下面看看另一个问题。
<dl class="layui-nav-child">
<dd><a href="javascript:location.href='getstudentlist.do'">学员管理</a></dd>
<dd><a href="coachList.jsp" >教练管理</a></dd>
<dd><a href="courselist.jsp" >课程管理</a></dd>
<dd><a href="examlist.jsp" >考试管理</a></dd>
<dd><a href="locationlist.jsp" >场地管理</a></dd>
</dl>
@RequestMapping("getstudentlist")
public ModelAndView getStudentindex(){
return new ModelAndView("memberlist");
}
当nav中跳转时,如果我直接把a标签直接写成<a href="coachList.jsp" >教练管理</a>这样子的话,虽然coachList.jsp页面中layui中填充表格时会请求controller的以get开头的方法,但是呢,拦截只能成功一半,就是拦截到了,但是抛出异常后,不会跳转。
只有把a标签写成<a href="javascript:location.href='getstudentlist.do'">学员管理</a>这样子时,才能达到访问成员列表时就拦截的效果。
通过这个案例呢,可以知道,切点最好不要指定某某方法,最好就指定整个controller类,这里我之所以要指定某某方法,是因为我controller类里面除了get方法之外,还有用户登录登出的接口,更好的做法是把登录登出两个方法单独放在一个controller中,因为登录登出功能不需要进行身份验证。
最后
以上就是年轻盼望为你收集整理的spring aop实现身份认证的全部内容,希望文章能够帮你解决spring aop实现身份认证所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复