我的原因是使用了authc,由于autuc对应的过滤器FormAuthenticationFilter中onAccessDenied方法返回的值都为false,所以访问url时会一直进行循环重定向,解决方案:重写onAccessDenied方法,并注入到shiroFiter中。
附上shiro配置文件:
<!-- shiroFilter --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <!-- 设定角色的登录链接,这里为cas登录页面的链接可配置回调地址 --> <!-- 登录地址 --> <property name="loginUrl" value="/login.html"/> <!-- 登录后跳转到业务页面 --> <property name="successUrl" value="/index.do"/> <!-- 错误页面 --> <property name="unauthorizedUrl" value="/denied.html"/> <property name="filters"> <map> <!--将重写了的FormAuthenticationFilter.onAccessDenied方法的类注入到其中--> <entry key="authc" value-ref="formAuthenticationFilter"></entry> </map> </property> <property name="filterChainDefinitions"> <value> /login.html=anon <!--配置静态资源--> /js/**=anon /templates/**=anon /assets/**=anon /css/**=anon <!--权限设置--> /index.do=authc /user/login.do=anon /**=authc </value> </property> </bean> <!-- 重写FormAuthenticationFilter的onAccessDenied方法的自定义过滤器 --> <bean id="formAuthenticationFilter" class="com.jd.risk.giasys.service.realm.filter.MyFilter" />
重写onAccessDenied方法:
package com.jd.risk.giasys.service.realm.filter; import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * Created by jianghaisong on 2017/12/17. */ public class MyFilter extends FormAuthenticationFilter{ private Logger log = LoggerFactory.getLogger(MyFilter.class); protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { //进行重写,业务逻辑 } }