`
weinan
  • 浏览: 39484 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

spring中AOP实现方式

阅读更多
1.通知

import java.lang.reflect.Method;
import java.util.Map;

import javax.annotation.Resource;

import org.springframework.aop.AfterReturningAdvice;

import person.wjt.base.auth.model.User;
import person.wjt.base.auth.model.UserType;
import person.wjt.base.auth.runtime.AuthService;

import com.trunkbow.audit.base.dao.ManagerDao;
import com.trunkbow.audit.base.model.Manager;

public class ManagerLogin implements AfterReturningAdvice{
	@Resource
	private ManagerDao managerDao;

	@SuppressWarnings("unchecked")
	@Override
	public void afterReturning(Object returnValue, Method method,
			Object[] args, Object target) throws Throwable {
		if (null==returnValue) {
			return;
		}
		Map<String, Object> returnMap=(Map<String, Object>)returnValue;
		User user=(User) returnMap.get(AuthService.CURRENT_USER);
		if (UserType.MANAGER.equals(user.getType())) {
			Manager manager=managerDao.getById(user.getId());
			returnMap.put(AuthService.CURRENT_USER, manager);
		}
		
	}

}

2.service接口

/**
 * 权限执行时Service
 * @author wangjintao
 *
 */
public interface AuthService {
	/**
	 * 当前用户,当前登陆的用户
	 */
	public final static String CURRENT_USER="_current_user_";
	/**
	 * 当前用户所属的组
	 */
	public final static String CURRENT_GROUPS="_current_groups_";
	/**
	 * 当前用户可用的组
	 */
	public final static String CURRENT_AVAILABLE_GROUPS="_current_available_groups_";
	/**
	 * 当前用户所属组的id
	 */
	public final static String CURRENT_GROUP_IDS="_current_group_ids_";
	/**
	 * 当前用户所属组的code
	 */
	public final static String CURRENT_GROUP_CODES="_current_group_codes_";
	/**
	 * 当前用户拥有的功能
	 */
	public final static String CURRENT_PERMS="_current_perms_";
	/**
	 * 当前用户可用的权限
	 */
	public final static String CURRENT_AVAILABLE_PERMS="_current_available_perms_";
	/**
	 * 当前用户拥有的功能id
	 */
	public final static String CURRENT_PERM_IDS="_current_perm_ids_";
	/**
	 * 当前用户拥有的功能code
	 */
	public final static String CURRENT_PERM_CODES="_current_perm_codes_";
	
	
	/**
	 * 登陆方法
	 * @param username	用户名
	 * @param password		密码
	 * @return 	需要记在session中的键值对,ru
	 */
	public Map<String,Object> login(String username,String password);
	/**
	 * 登出
	 */
	public void logout();
	

3.service实现
import org.apache.log4j.Logger;

import java.util.HashMap;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.ExcessiveAttemptsException;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.LockedAccountException;
import org.apache.shiro.authc.UnknownAccountException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;

import person.wjt.base.auth.dao.UserDao;
import person.wjt.base.auth.model.User;
import person.wjt.base.auth.runtime.AuthService;

/**
 * 基于shiro的AuthService实现
 * @author wangjintao
 *
 */
public class ShiroAuthService implements AuthService{
	/**
	 * Logger for this class
	 */
	private static final Logger logger = Logger
			.getLogger(ShiroAuthService.class);

	@Resource
	private UserDao userDao;
	

	@Override
	public Map<String, Object> login(String username, String password) {
		if (logger.isDebugEnabled()) {
			logger.debug("login(String, String) - start");
		}

		Subject subject= SecurityUtils.getSubject();  
		UsernamePasswordToken token = new UsernamePasswordToken(username, password);
		try{
			subject.login(token);
		}catch ( UnknownAccountException uae ) {
			logger.warn("login(String, String)", uae);
		} catch ( IncorrectCredentialsException ice ) {
			logger.warn("login(String, String)", ice);
		} catch ( LockedAccountException lae ) {
			logger.warn("login(String, String)", lae);
		} catch ( ExcessiveAttemptsException eae ) {
			logger.warn("login(String, String)", eae);
		} catch ( AuthenticationException ae ) {
			logger.warn("login(String, String)", ae);
		}
		if (subject.isAuthenticated()) {
			Map<String, Object> loginResult=new HashMap<String, Object>();
			loginResult.put(CURRENT_USER,subject.getPrincipals().oneByType(User.class));
			return loginResult;
		}

		if (logger.isDebugEnabled()) {
			logger.debug("login(String, String) - end");
		}
		return null;
	}


	@Override
	public void logout() {
		Subject subject= SecurityUtils.getSubject();  
		if (null!=subject&&subject.isAuthenticated()) {
			subject.logout();
		}
	}

}



2.配置

<bean id="authServiceImpl" class="person.wjt.base.auth.runtime.shiro.ShiroAuthService" />
	
<bean id="managerLoginAdvisor"
class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor">
		<property name="advice" ref="managerLogin" />
		<property name="mappedNames">
			<array value-type="java.lang.String">
				<value>login</value>
			</array>
		</property>
	</bean>

	<bean id="authService" class="org.springframework.aop.framework.ProxyFactoryBean">
		<property name="proxyInterfaces" value="person.wjt.base.auth.runtime.AuthService" />
		<property name="target" ref="authServiceImpl" />
		<property name="interceptorNames">
			<list>
				<value>managerLoginAdvisor</value>
			</list>
		</property>
	</bean>


分享到:
评论

相关推荐

    spring-aop-jar

    它被许多AOP框架使用,包括Spring,使得不同的AOP实现可以互相协作。它包含如`org.aopalliance.intercept.MethodInterceptor`和`org.aopalliance.aop.Advice`等核心接口。 2. spring-aop-4.1.6.RELEASE.jar:这是...

    Spring实现AOP的4种方式

    本篇文章将详细探讨Spring实现AOP的四种主要方法:基于代理的方式、基于AspectJ的注解方式、基于XML的AOP配置以及基于Java的AOP配置。 1. 基于代理的实现 Spring的AOP支持两种代理类型:JDK动态代理和CGLIB代理。...

    基于注解实现SpringAop

    基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop

    Spring AOP实现机制

    Spring AOP主要通过两种方式实现:JDK动态代理和CGLIB代理。 - **JDK动态代理**: - 当目标对象实现了至少一个接口时,Spring会使用JDK的java.lang.reflect.Proxy类创建一个代理对象。 - 代理对象在调用实际方法...

    使用Spring的注解方式实现AOP的细节

    本篇文章将深入探讨如何通过Spring的注解方式实现AOP的细节。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或责任。切点(Pointcut)定义了哪些方法会被通知(Advice...

    Spring实现AOP的4种方式 - Java -

    在实际开发中,理解并掌握这四种AOP实现方式对于编写高效、灵活的代码至关重要。Spring的AOP特性使得我们能够更好地组织代码,将横切关注点与业务逻辑分离,从而提升代码的可重用性和可测试性。在学习和应用这些知识...

    研究下Spring中AOP的实现?

    本篇文章将深入探讨Spring AOP的实现原理,并通过一个名为`myAOPExample`的示例来阐述其工作方式。 首先,理解AOP的基本概念至关重要。AOP的核心是切面(Aspect)、通知(Advice)、连接点(Join Point)、切点...

    spring基于AOP实现事务

    总结一下,Spring基于AOP实现的事务管理通过TransactionProxyFactoryBean,结合声明式事务配置,能够提供一种高效且易于维护的事务解决方案。它允许我们在不修改业务逻辑的情况下,统一管理和控制事务,提升了代码的...

    spring aop实现原理

    NULL 博文链接:https://zhang-yingjie-qq-com.iteye.com/blog/319927

    spring的aop实现

    Spring AOP(面向切面编程)是Spring框架的核心特性之一,它允许开发者在不修改源代码的情况下,...在压缩包文件"springAop"中,可能包含了示例代码和配置文件,通过学习这些内容,你可以更好地理解和实践Spring AOP。

    Spring实现AOP的多种方式 切点函数

    里面包括4个例子:(1)Spring实现AOP方式之一:基于XML配置的Spring AOP (2)Spring实现AOP方式之二:使用注解配置 Spring AOP (3)Spring AOP : AspectJ Pointcut 切点 (4)Spring AOP : Advice 声明 (通知注解)

    spring-boot aop

    本示例是关于如何在Spring Boot项目中实现AOP功能的一个简单演示。 首先,我们需要了解AOP的基本概念。AOP的核心是切面(Aspect),它封装了跨越多个对象的行为或关注点,如日志记录。切点(Pointcut)定义了在何处...

    spring aop注解方式、xml方式示例

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它提供了一种强大的方式来实现横切关注点,如日志、事务管理、性能监控等,而无需侵入业务代码。下面将详细介绍Spring AOP的注解方式和XML配置方式。 ### ...

    初探spring aop内部实现 java

    Spring AOP(面向切面编程)是Spring框架中的一个重要组件,它允许我们在不修改源代码的情况下,对程序的行为进行统一的管理和控制。本篇文章将深入探讨Spring AOP的内部实现,以及如何通过源代码理解其DataSource...

    Spring AOP的简单实现

    在这个场景中,我们将使用Spring AOP来实现一个日志记录的功能,以追踪系统中各个方法的调用情况,包括访问时间以及传递的参数。下面将详细阐述如何实现这一目标。 首先,我们需要了解AOP的基本概念。AOP的核心是切...

    Spring实现AOP的四种方式

    本文将详细介绍Spring实现AOP的四种方式,包括基于代理的经典方式、@AspectJ注解驱动、纯POJO切面以及注入式AspectJ切面。 首先,理解AOP的基本概念: 1. **通知(Advice)**:通知定义了切面在何时执行,Spring支持...

    反射实现 AOP 动态代理模式(Spring AOP 的实现原理)

    Spring框架中的AOP模块使用了动态代理来实现AOP概念。Spring AOP允许开发者定义切面,并在这些切面中指定拦截的方法。Spring AOP支持不同的代理策略,包括JDK动态代理和CGLIB代理。如果被代理的类没有实现接口,...

    Spring 2.5 AOP 例子

    Spring AOP提供了一种模块化和声明式的方式来实现横切关注点,如日志记录、事务管理、性能监控等。它通过切面(Aspect)将这些关注点与业务逻辑分离,降低了系统的耦合度。 二、类扫描功能 在Spring 2.5中,引入了...

    Spring使用AOP的三个jar包

    在实际开发中,你可以根据需求选择合适的织入方式(如Spring的代理模式或AspectJ的字节码织入),并结合这三个jar包,灵活地使用AOP来编写解耦、模块化的代码。同时,了解这些基础组件的工作原理,将有助于你更好地...

    Spring中AOP实现EHCache的整合(一)

    在本文中,我们将深入探讨如何在Spring框架中集成并使用AOP(面向切面编程)来实现对EHCache的高效管理。Spring是一个广泛使用的Java应用框架,它提供了强大的依赖注入和面向切面编程功能。而EHCache是一款流行、高...

Global site tag (gtag.js) - Google Analytics