欢迎使用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}); } } });
相关文章推荐
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器ss
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器
- 欢迎使用CSDN-markdown编辑器