: spring中的beannameautoproxycreator进行权限控制
问题背景:本人在使用Struts+Spring+Hibernate进行毕业设计的系统开发,其中“发布悬赏视频任务帖”(对应Action:NewRewardAssignmentAction)这一操作只能够通过验证的企业会员(corpUser)才能够进行操作。我在使用spring AOP中的事务代理,就是用BeanNameAutoProxyCreator来进行拦截控制。
存在问题:当我在spring bean的配置文件(applicationContext.xml)中定义BeanNameAutoProxyCreator,并添加发布悬赏视频任务的拦截器后,所有Action竟然都罢工了?!……(表现:在登录页面提交后提示:HTTP Status 404 - Servlet action is not available)
相关代码如下:
一、applicationContext.xml中的相关代码如下
<!-- 配置dataSource数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/dowe"> </property>
<property name="username" value="root"> </property>
<property name="password" value="root"> </property>
</bean>
<!-- 配置Hibernate的SessionFactory Bean -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">
true
</prop>
</props>
</property>
<!--mappingResources属性用来列出全部PO映射文件 -->
<property name="mappingResources">
<list>
<value>com/dowe/pojo/User.hbm.xml </value>
<value>com/dowe/pojo/Note.hbm.xml </value>
</list>
</property>
</bean>
<!-- 定义事务管理器,使用适用于Hibernte的局部事务管理策略-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- HibernateTransactionManager bean需要依赖注入一个SessionFactory bean的引用-->
<property name="sessionFactory" ref="sessionFactory"/>
<!-- 注意:下边这个属性一定不要少,把嵌套事务的开关打开-->
<property name="nestedTransactionAllowed" value="true" />
</bean>
<!--配置事务拦截器-->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!--事务拦截器bean需要依赖注入一个事务管理器 -->
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<!--下面定义事务传播属性-->
<props>
<prop key="get*">PROPAGATION_REQUIRED </prop>
<prop key="*">PROPAGATION_REQUIRED </prop>
</props>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator,该bean是个bean后处理器,无需被引用,因此
没有id属性这个bean后处理器,根据事务拦截器为目标bean自动创建事务代理指定对满
足哪些bean name的bean自动生成业务代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 下面列出所有需要生成权限检查代理的控制器 -->
<property name="beanNames">
<list>
<value>adminService </value>
<value>userService </value>
</list>
</property>
<!-- 下面列出所有需要生成权限检查代理的控制器 -->
<property name="interceptorNames">
<list>
<value>transactionInterceptor </value>
</list>
</property>
</bean>
<!--企业用户发布悬赏视频任务帖链接 -->
<bean name="/newRewardAssignmentLink"
class="com.dowe.struts.action.NewRewardAssignmentLinkAction">
<property name="userService">
<ref bean="userService" />
</property>
</bean>
<!-- 添加发布悬赏视频任务的拦截器 -->
<!-- <bean id="newRewardAssignmentInterceptor" class="com.dowe.tools.NewRewardAssignmentInterceptor"/>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
下面列出所有需要生成权限检查代理的控制器
<property name="beanNames">
<list>
<value>/newRewardAssignmentLink </value>
</list>
</property>-->
<!-- 下面列出所有需要生成权限检查代理的控制器
<property name="interceptorNames">
<list>
<value>newRewardAssignmentInterceptor </value>
</list>
</property>
</bean>
二、拦截器(NewRewardAssignmentInterceptor)全部代码如下
package com.dowe.tools;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionMapping;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import com.dowe.pojo.User;
/**
* 权限管理拦截器代码:发布悬赏视频任务帖权限控制
*
* 只有通过审核的企业用户才可以发布悬赏视频任务帖
*
* @author Wallace Lan
*
*/
public class NewRewardAssignmentInterceptor implements MethodInterceptor{
//实现invoke方法
public Object invoke(MethodInvocation invocation)
throws Throwable{
//原有参数
HttpServletRequest request = null;
ActionMapping mapping = null;
//获取目标方法全部参数
Object[] args = invocation.getArguments();
//遍历每个参数,解析出request和mapping
for(int i = 0 ; i < args.length; i++){
if(args[i] instanceof HttpServletRequest){
request = (HttpServletRequest)args[i];
}
if(args[i] instanceof ActionMapping){
mapping = (ActionMapping)args[i];
}
}
//取得用户Session
HttpSession session = request.getSession();
//从Session中取得用户信息
User user = (User)session.getAttribute("userInfo");
Byte cropUser = user.getCorpUser();
Byte passPort = user.getPassPort();
//如果用户为企业用户,且通过审核
if(cropUser.equals((byte)1) && passPort.equals((byte)1)){
//调用目标方法,继续前进
return invocation.proceed();
}else if (cropUser.equals((byte)1) && !passPort.equals((byte)1)) {
//如果是企业用户,但未通过验证
String noPassPort = "对不起,您没有通过验证,暂无权发布悬赏视频任务!";
session.setAttribute("noPassPort", noPassPort);
return invocation.proceed();
}else{
//如果不是企业用户
String notCorpUser = "对不起,只有企业用户才能发布悬赏视频任务!";
session.setAttribute("notCorpUser", notCorpUser);
return invocation.proceed();
}
}
}
仔细看了一下,在applicationContext.xml这个配置文件中没有找到adminService,userService 的BEAN不知你在其它文件有没有配置,
拦截器代码
//取得用户Session
HttpSession session = request.getSession();
//从Session中取得用户信息
User user = (User)session.getAttribute("userInfo");
Byte cropUser = user.getCorpUser();
Byte passPort = user.getPassPort();
//如果用户为企业用户,且通过审核
if(cropUser.equals((byte)1) && passPort.equals((byte)1)){
//调用目标方法,继续前进
return invocation.proceed();
}else if (cropUser.equals((byte)1) && !passPort.equals((byte)1)) {
//如果是企业用户,但未通过验证
String noPassPort = "对不起,您没有通过验证,暂无权发布悬赏视频任务!";
session.setAttribute("noPassPort", noPassPort);
return invocation.proceed(); //这里是否应该是用mapping.forward("");进行转发到
}else{
//如果不是企业用户
String notCorpUser = "对不起,只有企业用户才能发布悬赏视频任务!";
session.setAttribute("notCorpUser", notCorpUser);
return invocation.proceed(); 这里是否应该是用mapping.forward("");进行转发到
存在问题:当我在spring bean的配置文件(applicationContext.xml)中定义BeanNameAutoProxyCreator,并添加发布悬赏视频任务的拦截器后,所有Action竟然都罢工了?!……(表现:在登录页面提交后提示:HTTP Status 404 - Servlet action is not available)
相关代码如下:
一、applicationContext.xml中的相关代码如下
<!-- 配置dataSource数据源 -->
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"
value="com.mysql.jdbc.Driver">
</property>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/dowe"> </property>
<property name="username" value="root"> </property>
<property name="password" value="root"> </property>
</bean>
<!-- 配置Hibernate的SessionFactory Bean -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</prop>
<prop key="hibernate.show_sql">
true
</prop>
</props>
</property>
<!--mappingResources属性用来列出全部PO映射文件 -->
<property name="mappingResources">
<list>
<value>com/dowe/pojo/User.hbm.xml </value>
<value>com/dowe/pojo/Note.hbm.xml </value>
</list>
</property>
</bean>
<!-- 定义事务管理器,使用适用于Hibernte的局部事务管理策略-->
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- HibernateTransactionManager bean需要依赖注入一个SessionFactory bean的引用-->
<property name="sessionFactory" ref="sessionFactory"/>
<!-- 注意:下边这个属性一定不要少,把嵌套事务的开关打开-->
<property name="nestedTransactionAllowed" value="true" />
</bean>
<!--配置事务拦截器-->
<bean id="transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<!--事务拦截器bean需要依赖注入一个事务管理器 -->
<property name="transactionManager" ref="transactionManager"/>
<property name="transactionAttributes">
<!--下面定义事务传播属性-->
<props>
<prop key="get*">PROPAGATION_REQUIRED </prop>
<prop key="*">PROPAGATION_REQUIRED </prop>
</props>
</property>
</bean>
<!-- 定义BeanNameAutoProxyCreator,该bean是个bean后处理器,无需被引用,因此
没有id属性这个bean后处理器,根据事务拦截器为目标bean自动创建事务代理指定对满
足哪些bean name的bean自动生成业务代理 -->
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<!-- 下面列出所有需要生成权限检查代理的控制器 -->
<property name="beanNames">
<list>
<value>adminService </value>
<value>userService </value>
</list>
</property>
<!-- 下面列出所有需要生成权限检查代理的控制器 -->
<property name="interceptorNames">
<list>
<value>transactionInterceptor </value>
</list>
</property>
</bean>
<!--企业用户发布悬赏视频任务帖链接 -->
<bean name="/newRewardAssignmentLink"
class="com.dowe.struts.action.NewRewardAssignmentLinkAction">
<property name="userService">
<ref bean="userService" />
</property>
</bean>
<!-- 添加发布悬赏视频任务的拦截器 -->
<!-- <bean id="newRewardAssignmentInterceptor" class="com.dowe.tools.NewRewardAssignmentInterceptor"/>
<bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
下面列出所有需要生成权限检查代理的控制器
<property name="beanNames">
<list>
<value>/newRewardAssignmentLink </value>
</list>
</property>-->
<!-- 下面列出所有需要生成权限检查代理的控制器
<property name="interceptorNames">
<list>
<value>newRewardAssignmentInterceptor </value>
</list>
</property>
</bean>
二、拦截器(NewRewardAssignmentInterceptor)全部代码如下
package com.dowe.tools;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import org.apache.struts.action.ActionMapping;
import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import com.dowe.pojo.User;
/**
* 权限管理拦截器代码:发布悬赏视频任务帖权限控制
*
* 只有通过审核的企业用户才可以发布悬赏视频任务帖
*
* @author Wallace Lan
*
*/
public class NewRewardAssignmentInterceptor implements MethodInterceptor{
//实现invoke方法
public Object invoke(MethodInvocation invocation)
throws Throwable{
//原有参数
HttpServletRequest request = null;
ActionMapping mapping = null;
//获取目标方法全部参数
Object[] args = invocation.getArguments();
//遍历每个参数,解析出request和mapping
for(int i = 0 ; i < args.length; i++){
if(args[i] instanceof HttpServletRequest){
request = (HttpServletRequest)args[i];
}
if(args[i] instanceof ActionMapping){
mapping = (ActionMapping)args[i];
}
}
//取得用户Session
HttpSession session = request.getSession();
//从Session中取得用户信息
User user = (User)session.getAttribute("userInfo");
Byte cropUser = user.getCorpUser();
Byte passPort = user.getPassPort();
//如果用户为企业用户,且通过审核
if(cropUser.equals((byte)1) && passPort.equals((byte)1)){
//调用目标方法,继续前进
return invocation.proceed();
}else if (cropUser.equals((byte)1) && !passPort.equals((byte)1)) {
//如果是企业用户,但未通过验证
String noPassPort = "对不起,您没有通过验证,暂无权发布悬赏视频任务!";
session.setAttribute("noPassPort", noPassPort);
return invocation.proceed();
}else{
//如果不是企业用户
String notCorpUser = "对不起,只有企业用户才能发布悬赏视频任务!";
session.setAttribute("notCorpUser", notCorpUser);
return invocation.proceed();
}
}
}
仔细看了一下,在applicationContext.xml这个配置文件中没有找到adminService,userService 的BEAN不知你在其它文件有没有配置,
拦截器代码
//取得用户Session
HttpSession session = request.getSession();
//从Session中取得用户信息
User user = (User)session.getAttribute("userInfo");
Byte cropUser = user.getCorpUser();
Byte passPort = user.getPassPort();
//如果用户为企业用户,且通过审核
if(cropUser.equals((byte)1) && passPort.equals((byte)1)){
//调用目标方法,继续前进
return invocation.proceed();
}else if (cropUser.equals((byte)1) && !passPort.equals((byte)1)) {
//如果是企业用户,但未通过验证
String noPassPort = "对不起,您没有通过验证,暂无权发布悬赏视频任务!";
session.setAttribute("noPassPort", noPassPort);
return invocation.proceed(); //这里是否应该是用mapping.forward("");进行转发到
}else{
//如果不是企业用户
String notCorpUser = "对不起,只有企业用户才能发布悬赏视频任务!";
session.setAttribute("notCorpUser", notCorpUser);
return invocation.proceed(); 这里是否应该是用mapping.forward("");进行转发到