欢迎使用CSDN-markdown编辑器

shiro session 与 ajax的故事

当shiro设置的全局session过期时间将session变为过期的时候,由于shiro需要对每一次请求都进行权限校验,这时候的ajax请求会在过滤器中被拦截。

shiro拦截器配置:
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager"/>
    <property name="filters">
        <map>
            <entry key="authc">
                <bean class="com.interceptors.shiro.RoleAuthorizationFilter" />
            </entry>
        </map>
    </property>
    <property name="filterChainDefinitions">
        <value>
            /static/**                  = anon
            /testControl.do             = anon
            /**                         = authc
        </value>
    </property>
 </bean>

具体解决方案:

配置一个过滤器,用于校验权限,然后在ajax中,使用全局ajax默认设置,对ajax的error结果进行处理。

过滤器配置
public class RoleAuthorizationFilter extends PassThruAuthenticationFilter {
    @Override
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {

        HttpServletRequest httpRequest = (HttpServletRequest)request;
        HttpServletResponse httpResponse = (HttpServletResponse)response;

        Subject subject = getSubject(httpRequest, httpResponse);
        if(subject.isAuthenticated()) {
            return super.onAccessDenied(request, response);
        } else {
            /** 判断请求是否为ajax */
            /** 如果是的话,将未认证权限的ajax请求退回,并返回status状态码为401,表示用户没有权限进行该ajax请求 */
            /** 如果不是ajax请求,就将该次操作交由父类(PassThruAuthenticationFilter)处理 */
            if(isAjaxRequest(httpRequest)) {
                WebUtils.toHttp(httpResponse).sendError(401);
                return false;
            } else {
                return super.onAccessDenied(request, response);
            }
        }
    }

    private Boolean isAjaxRequest(HttpServletRequest httpRequest) {
        /** 判断头部是否包含X-Requested-With来确定是否为ajax请求 */
        if(StringUtils.equalsIgnoreCase("XMLHttpRequest", httpRequest.getHeader("X-Requested-With"))){
            return true;
        }
        return false;
    }
}
ajax配置
// 设置jQuery Ajax全局的参数  
$.ajaxSetup({
    async: true,
    cache: false,
    type: "POST",
    contentType: 'application/x-www-form-urlencoded;charset=utf-8',
    error: function(jqXHR, textStatus, errorThrown){
        switch (jqXHR.status){  
            case(500):  
                console.log(jqXHR);
                layer.alert("服务器系统内部错误",{skin:'layer-ext-seaning',icon: 11});  
                break;  
            case(401):  
                layer.alert("未登录或者登录超时",{skin:'layer-ext-seaning',icon: 11}, function() {
                    window.location.href='loginControl.do?login';
                });
                break;  
            case(403):  
                layer.alert("无权限执行此操作",{skin:'layer-ext-seaning',icon: 11});  
                break;
            case(404):  
                layer.alert("找不到页面",{skin:'layer-ext-seaning',icon: 11});
                break;
            case(408):  
                layer.alert("请求超时",{skin:'layer-ext-seaning',icon: 11});  
                break;
            default:  
                layer.alert("未知错误",{skin:'layer-ext-seaning',icon: 11});  
        }  
    }
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值