【第22期】观点:IT 行业加班,到底有没有价值?

欢迎使用CSDN-markdown编辑器

原创 2016年08月30日 11:45:14

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});  
        }  
    }
});
版权声明:本文为博主原创文章,未经博主允许不得转载。 举报

相关文章推荐

欢迎使用CSDN-markdown编辑器

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

欢迎使用CSDN-markdown编辑器

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

欢迎使用CSDN-markdown编辑器

欢迎使用Markdown编辑器写博客我们使用斜体文字的方式倾斜文字,加粗的文字的方式加粗文字,使用加粗的斜体字同时加粗和倾斜文字。类Atx形式则是在行首插入1到6个#,对应到标题1到标题6.一号标题二...

欢迎使用CSDN-markdown编辑器

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...

输出才更有价值——欢迎使用CSDN-markdown编辑器

欢迎使用Markdown编辑器写博客本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)