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

JSON 2016-12-18 21:54:40 33152

shiro demo下载

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




我们知道Ajax不能做页面redirectforward跳转,所以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>
 * 版权所有:© www.sojson.com
 * <p>
 * 博客地址:https://www.sojson.com/blog/
 * <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在线解析

原文地址:https://www.sojson.com/blog/200.html

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

本文主题:

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

关于作者
一个低调而闷骚的男人。
相关文章
Shiro 教程Ajax请求拦截跳转页面方案
CDN 请求返回 connection reset by peer,被拦截请求解决方案
网站页面添加 Google AdSense 后页面加载慢?
百度秒收录教程,怎么做到百度秒收入你的页面,SEO 教程
Shiro教程(四)Shiro + Redis配置
sojson 特效,本站页面“线条”HTML5实现讲解、特效代码下载
网站如何设置404页面、500等错误页面,有什么漏洞?怎么预防?
Shiro教程(八)Shiro Freemarker标签的使用。
JQuery Ajax四种写法,Ajax请求返回JSON 操作Demo
Shiro教程(五)Shiro + Redis实现
最新文章
Flink 在又拍云日志批处理中的实践 8526
个推异常值检测和实战应用-又拍云 1680
TCP 和 UDP协议详细讲解,优缺点分析讲解 8037
URL中乱七八糟的字符讲解,来源以及如何解决 5184
HTTP/3 来了,您真的了解它么? 6215
当我谈 HTTP 时,我谈些什么? 11782
新浪短链(t.cn)最新申请官方API的方法讲解。 72718
QUIC / HTTP3 协议详细分析讲解 10555
恭喜那个做云存储的七牛云完成 F 轮 10 亿人民币的融资,开启新的云旅程 8772
Autojs怎么安全加密?Autojs在线加密工具注意事项。 36788
最热文章
苹果电脑Mac怎么恢复出厂系统?苹果系统怎么重装系统? 653334
最新MyEclipse8.5注册码,有效期到2020年 (已经更新) 603117
我为什么要选择RabbitMQ ,RabbitMQ简介,各种MQ选型对比 495981
Jackson 时间格式化,时间注解 @JsonFormat 用法、时差问题说明 492723
免费天气API,全国天气 JSON API接口,可以获取五天的天气预报 492464
Elasticsearch教程(四) elasticsearch head 插件安装和使用 451829
Java 信任所有SSL证书,HTTPS请求抛错,忽略证书请求完美解决 229757
谈谈斐讯路由器劫持,你用斐讯路由器,你需要知道的事情 203328
Elasticsearch教程(一),全程直播(小白级别) 192682
Jackson 美化输出JSON,优雅的输出JSON数据,格式化输出JSON数据... ... 176556
支付扫码

所有赞助/开支都讲公开明细,用于网站维护:赞助名单查看

查看我的收藏

正在加载... ...