shiro登录超时后发起ajax异步请求,跳到登录界面

本文介绍如何使用Shiro权限框架创建自定义过滤器ShiroPermissionsFilter,包括配置Shiro及实现用户未登录状态下的不同场景处理,如重定向到登录页面或返回特定数据给Ajax请求。

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

1:创建过滤器ShiroPermissionsFilter



import org.apache.commons.lang.StringUtils;
import org.apache.shiro.web.servlet.AdviceFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class ShiroPermissionsFilter extends AdviceFilter {

    private static final Logger logger = LoggerFactory
            .getLogger(ShiroPermissionsFilter.class);

    @Override
    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;
        Object sysUser = httpServletRequest.getSession().getAttribute("user");
        String url = httpServletRequest.getRequestURI();

        if (null == sysUser && !url.equals("/")) {
            String requestedWith = httpServletRequest.getHeader("X-Requested-With");
            if (StringUtils.isNotEmpty(requestedWith) && StringUtils.equals(requestedWith, "XMLHttpRequest")) {//如果是ajax返回指定数据
                // 重定向
                String path = httpServletRequest.getContextPath();
                String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/";
                // ajax请求
                httpServletResponse.setHeader("sessionstatus", "TIMEOUT");
                httpServletResponse.setHeader("content_path", basePath + "login");
                httpServletResponse.setStatus(HttpServletResponse.SC_FORBIDDEN);//403 禁止
                return false;
            } else {//不是ajax进行重定向处理
                logger.info( url+"重定向到了登录界面");
                httpServletResponse.sendRedirect("/login");
                return false;
            }
        }
        return true;
    }
}
             

2:在shiro配置文件xml中定义bean

<bean id="loginFilter" class="com.xcd.bpc.shiro.ShiroPermissionsFilter"></bean>

3:在shiro配置文件的shiroFilter配置bean中设置filters

<property name="filters" >
   <map>
      <entry key="authc" value-ref="loginFilter"></entry>
   </map>
</property>

4:创建一个js文件ajaxSetup.js

$(function() {
    $.ajaxSetup({
        complete: function (XMLHttpRequest, textStatus) {
            console.log(textStatus)
            // 通过XMLHttpRequest取得响应头,sessionstatus
            var sessionstatus = XMLHttpRequest.getResponseHeader("sessionstatus");
            if (sessionstatus == "TIMEOUT") {
                var win = window;
                while (win != win.top) {
                    win = win.top;
                }
                win.location.href = XMLHttpRequest.getResponseHeader("content_path");
            }
        }
    });
})

5:在调用ajax的文件中引入4中的js文件ajaxSetup.js

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值