我的原因是使用了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 {
//进行重写,业务逻辑
}
}