spring中的beannameautoproxycreator进行权限控制 学到很多

: 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("");进行转发到
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值