最近在shiro+springMvc来控制权限的时候出现没有权限的时候不会跳到指定的固定页面,而是显示错误代码在页面,这其实不是我想要的效果。首先我们要知道为什么会这样,然后再去找解决的方法。
原因:
由于我们架构是用springmvc框架来搭建的所以项目的路径跳转是由springmvc 来控制的,也就是说我们在shiro里面的配置没有用,如下:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager"/>
<property name="loginUrl" value="/"/> //没有用,达不到预期效果
<property name="successUrl" value="/jsp/main"/> //没有用,达不到预期效果
<property name="unauthorizedUrl" value="/rest/page/401"/> //没有用,达不到预期效果
<property name="filterChainDefinitions">
<value>
<!-- 静态资源允许访问 -->
/rs/** = anon
/login = anon
/common/** = anon
<!-- 登录页允许访问 -->
/rest/user/login = anon
/=anon
/login.do=anon
<!-- 其他资源需要认证 -->
/** = authc
</value>
</property>
</bean>
那么我们该怎么解决呢?既然shiro的配置没有用了,那么就要来找找springmvc中能不能解决这个问题了,springmvc中有一个org.springframework.web.servlet.handler.SimpleMappingExceptionResolver类就可以解决这个问题,我们在spring-mvc.xml配置文件中配置一个bean,如下:
<bean
class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="org.apache.shiro.authz.UnauthorizedException"> //表示捕获的异常
/unauthorized //捕获该异常时跳转的路径
</prop>
<prop key="org.apache.shiro.authz.UnauthenticatedException"> //表示捕获的异常
/unauthenticated //捕获该异常时跳转的路径
</prop>
</props>
</property>
</bean>