spring中用aop,只对其中的一个方法有用,比如所说,权限检查,我想对add方法进行权限检查,在add方法之前进行检查,但是我不知道怎么配置
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor"
>
<property name="transactionManager">
<ref bean="transactionManager"/>
</property>
<property name="transactionAttributes">
<props>
<prop key="add*">
PROPAGATION_REQUIRED,-AccountException
</prop>
</props>
</property>
</bean>
再忘下就不会配置了,有谁能给指点一下啊
[b]问题补充:[/b]
我还想增加日志功能,比如说,可以在add方法之前进行,也可以在add之后进行,用annotation,也可以用下一种方式,
aop:config
/aop:aspect
/aop:config
,我把spring-aop-2.5.xsd导入的时候有错误,我不想用上面的方法,还有更好的方法吗
[b]问题补充:[/b]
我的意思是说,利用动态代理,对service(里面有好多方法)里面的add方法之前增加日志功能,这个代码怎么实现
[code="java"]
import java.lang.reflect.Method;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Logger;
public class LogInterceptor implements MethodInterceptor {
private static Logger log = Logger.getLogger(LogInterceptor.class);
public Object invoke(MethodInvocation invocation) throws Throwable {
Method m = invocation.getMethod();
Class c = m.getDeclaringClass();
StringBuilder sb = new StringBuilder();
sb.append("类名为");
sb.append(c.getName());
sb.append("调用方法名为");
sb.append(m.getName());
log.debug(sb.toString()+"--------开始---------");
Object ret = invocation.proceed();
log.debug(sb.toString()+"--------结束---------");
return ret;
}
}
再到配置文件里
增加
<bean id="logInterceptor"
class="LogInterceptor "
//这里配置你要代理的bean的名称
*service
logInterceptor
transactionInterceptor
[/code]
[code="java"]
beCheckAdd
checkAddAdvisor
</bean>
</property>
<property name="mappedNames">
<list>
<value>add</value>
</list>
</property>
</bean>
[/code]
beCheckAdd: 你在代理哪个bean
xxxx.xxx.xx.CheckInterceptor: check权限的拦截器
mappedNames中的add: 只拦截add方法
你检查权限,只是一个普通的aop拦截,和事务没有多大关系,不需要用到事务拦截
//这里配置你要代理的bean的名称
xxx
transactionInterceptor
你自己的增加日志功能的拦截器,你写好了没有
如果写好了,就配置成一个bean
//这里配置你要代理的bean的名称
xxx
日志功能拦截器的bean名称
transactionInterceptor
记录日志类
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
public class LogInterceptor implements MethodInterceptor {
private static Logger log = Logger.getLogger(LogInterceptor.class);
public Object invoke(MethodInvocation invocation) throws Throwable {
StringBuilder sb = new StringBuilder();
long procTime = System.currentTimeMillis();
log.log(Level.INFO, sb.toString() + "\n" + "--------开始---------");
log.log(Level.INFO,invocation.getArguments()[0] + " 开始执行 "
+ invocation.getMethod() + " 方法");
try {
Object result = invocation.proceed();
return result;
} finally {
procTime = System.currentTimeMillis() - procTime;
log.log(Level.INFO,invocation.getArguments()[0] + " 执行 "
+ invocation.getMethod() + " 方法结束");
log.log(Level.INFO,"执行 " + invocation.getMethod().getName()
+ " 方法共用了 " + procTime + "毫秒");
log.log(Level.INFO,sb.toString() + "\n" + "--------结束---------");
}
}
}
Spring配置文件里添加
<bean
class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="beanNames">
<value>要代理的service名称</value>
</property>
<property name="interceptorNames">
<list>
<value>logInterceptor</value>
</list>
</property>
</bean>
权限控制最好用Spring Security,例如下面的代码
session-fixation-protection="newSession" access-denied-page="/login.jsp">
default-target-url="/jump.do" authentication-failure-url="/login.jsp?login_error=1"
always-use-default-target="true" />
<beans:bean id="httpSessionContextIntegrationFilter"
class="org.springframework.security.context.HttpSessionContextIntegrationFilter" />
<authentication-provider>
<password-encoder hash="sha-256" />
<user-service>
<user name="admin"
password="8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918"
authorities="ROLE_ADMIN" />
</user-service>
</authentication-provider>
也可以从数据库读取用户名和密码