AJax技术

Shiro 教程,Ajax请求拦截跳转页面方案

字号+ 作者:H5之家 来源:H5之家 2017-02-12 18:01 我要评论( )

Shiro 教程,Ajax请求拦截跳转页面方案

Shiro 教程,Ajax请求拦截跳转页面方案

shiro demo下载

Shiro + SSM(框架) + Freemarker(jsp)讲解的权限控制Demo,还不赶快去下载?

我们知道Ajax不能做页面redirect和forward跳转,所以Ajax请求假如没登录,那么这个请求给用户的感觉就是没有任何反应,而用户又不知道用户已经退出或是  Session  超时了。这个时候如何解决?

Shiro 教程,Ajax请求拦截跳转页面方案

在登录拦截器中,如我们自己定义的LoginFilter中,先行判断下,是否为  Ajax  请求,如果是  Ajax  请求并且没有相关权限,采用Response输出一段  JSON  数据返回即可。

判断请求是否为Ajax请求
/** * 是否是Ajax请求 * @param request * @return */ public static boolean isAjax(ServletRequest request){ String header = ((HttpServletRequest) request).getHeader("X-Requested-With"); if("XMLHttpRequest".equalsIgnoreCase(header)){ LoggerUtils.debug(CLAZZ, "当前请求为Ajax请求"); return Boolean.TRUE; } LoggerUtils.debug(CLAZZ, "当前请求非Ajax请求"); return Boolean.FALSE; }Response 输出JSON数据
/** * 使用 response 输出JSON * @param hresponse * @param resultMap * @throws IOException */ public static void out(ServletResponse response, Map<String, String> resultMap){ PrintWriter out = null; try { response.setCharacterEncoding("UTF-8");//设置编码 response.setContentType("application/json");//设置返回类型 out = response.getWriter(); out.println(JSONObject.fromObject(resultMap).toString());//输出 } catch (Exception e) { LoggerUtils.fmtError(CLAZZ, e, "输出JSON报错。"); }finally{ if(null != out){ out.flush(); out.close(); } } }Shiro Filter 判断Ajax 请求并且处理package com.sojson.core.shiro.filter; import java.util.HashMap; import java.util.Map; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.apache.shiro.web.filter.AccessControlFilter; import com.sojson.common.model.UUser; import com.sojson.common.utils.LoggerUtils; import com.sojson.core.shiro.CustomShiroSessionDAO; import com.sojson.core.shiro.token.manager.TokenManager; /** * * 开发公司:SOJSON在线工具 * <p> * 版权所有: * <p> * 博客地址: * <p> * <p> * * 判断登录 * * <p> * * 区分 责任人 日期    说明<br/> * 创建 周柏成 2016年6月2日  <br/> * * @author zhou-baicheng * @email so@sojson.com * @version 1.0,2016年6月2日 <br/> * */ public class LoginFilter extends AccessControlFilter { final static Class<LoginFilter> CLASS = LoginFilter.class; // session获取 CustomShiroSessionDAO customShiroSessionDAO; @Override protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception { UUser token = TokenManager.getToken(); if (null != token || isLoginRequest(request, response)) {// &&// isEnabled() return Boolean.TRUE; } if (ShiroFilterUtils.isAjax(request)) {// ajax请求 Map<String, String> resultMap = new HashMap<String, String>(); LoggerUtils.debug(getClass(), "当前用户没有登录,并且是Ajax请求!"); resultMap.put("login_status", "300"); resultMap.put("message", "\u5F53\u524D\u7528\u6237\u6CA1\u6709\u767B\u5F55\uFF01");// 当前用户没有登录! ShiroFilterUtils.out(response, resultMap); } return Boolean.FALSE; } @Override protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception { // 保存Request和Response 到登录后的链接 saveRequestAndRedirectToLogin(request, response); return Boolean.FALSE; } public void setCustomShiroSessionDAO( CustomShiroSessionDAO customShiroSessionDAO) { this.customShiroSessionDAO = customShiroSessionDAO; } } 前端Javascript处理Ajax请求返回值

首先提供一个判断方法:

/** * 判断是否登录,没登录刷新当前页,促使Shiro拦截后跳转登录页 * @param result ajax请求返回的值 * @returns {如果没登录,刷新当前页} */ function isLogin(result){ if(result && result.login_status && result.login_status == 300){ window.location.reload(true);//刷新当前页 } return !0;//返回true }

然后来一个栗子:

//改变状态 function changeSessionStatus(sessionIds,status,self){ status = !parseInt(status); //loading var load = layer.load(); $.post("${basePath}/member/changeSessionStatus.shtml",{status:status,sessionIds:sessionIds},function(result){ layer.close(load); if(isLogin(result)){//判断是否登录 if(result && result.status == 200){ return self.text(result.sessionStatusText), self.attr('status',result.sessionStatus), self.parent().prev().text(result.sessionStatusTextTd); layer.msg('操作成功'),!1; }else{ return layer.msg(result.message,function(){}),!1; } } },'json'); }

这样你应该明白了怎么处理吧。如果还不明白,加群@群主。


本文主题

如果本文对你有帮助,那么请你赞助我,让我更有激情的写下去,帮助更多的人。

版权所属:SO JSON 在线工具

原文地址:

转载时必须以链接形式注明原始出处及本声明。

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • shiro 教程

    shiro 教程

    2017-01-14 14:01

  • 关于shiro权限框架AJAX请求的问题

    关于shiro权限框架AJAX请求的问题

    2015-11-11 09:44

网友点评