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

本文介绍如何在Shiro的自定义LoginFilter中处理Ajax请求。当Ajax请求缺少权限时,不进行页面跳转,而是通过Response返回JSON数据。内容包括判断请求是否为Ajax请求的技巧及前端如何解析并处理这些返回的数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 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;

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');
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值