我是靠谱客的博主 年轻盼望,最近开发中收集的这篇文章主要介绍spring aop实现身份认证,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

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实现身份认证所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部