您的位置:首页 > 其它

欢迎使用CSDN-markdown编辑器

2016-08-30 11:45 155 查看

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});
}
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ajax session shiro