shiro过滤器与ajax访问

本文介绍了如何在Shiro框架中实现自定义session管理,包括登录成功后生成sessionID并传递给前端。同时,详细讲解了自定义的身份认证过滤器,针对登录验证和options请求的处理。此外,还讨论了权限认证过滤器,处理无权限访问的ajax请求。通过FilterChainDefinitionMapBuilder配置资源权限,并结合Shiro的XML配置和自定义realm,实现了全面的权限控制。
摘要由CSDN通过智能技术生成

1.shiro自定义sessionManager

当登录成功时后端生成一个sessionid并返回给前端,前端当前每次请求时携带此次sessionid

/**
 *
 * 传统结构项目中,shiro从cookie中读取sessionId以此来维持会话,
 * 在前后端分离的项目中(也可在移动APP项目使用),我们选择在ajax的请求头中传递sessionId,
 * 因此需要重写shiro获取sessionId的方式。
 * 自定义CrmSessionManager类继承DefaultWebSessionManager类,重写getSessionId方法
 *  前端服务器通过在cookie中携带sessionid告诉后端服务器,本次访问的用户是谁
 */

public class MySessionManager extends DefaultWebSessionManager {
   
    private static final String AUTHORIZATION = "X-TOKEN";

    private static final String REFERENCED_SESSION_ID_SOURCE = "Stateless request";

    public MySessionManager() {
   
        super();
    }

    @Override
    public Serializable getSessionId(ServletRequest request, ServletResponse response) {
   
        //取到sessionid
        String id = WebUtils.toHttp(request).getHeader(AUTHORIZATION);
        HttpServletRequest request1 = (HttpServletRequest) request;

        //如果请求头中有 X-TOKEN 则其值为sessionId
        if (!StringUtils.isEmpty(id)) {
   
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE, REFERENCED_SESSION_ID_SOURCE);
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID, id);
            request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_IS_VALID, Boolean.TRUE);
            return id;
        } else {
   
            //否则按默认规则从cookie取sessionId
            return super.getSessionId(request, response);
        }
    }

}

2.自定义身份认证过滤器

对登录用户进行登录认证,对前端的options请求放行,ajax请求session失效时的处理

/**
 * 身份验证过滤器
 */
public class MyAuthenticationFilter extends FormAuthenticationFilter {
   
    @Override
    //前端options请求放行
    protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
   
        HttpServletRequest request1 = (HttpServletRequest) request;
        //获取请求方式
        String method = request1.getMethod();
        //如果是options请求方式,则放行
        if("OPTIONS".equalsIgnoreCase(method)){
   
            return true;
        }

        return super.isAccessAllowed(request, response, mappedValue);
    }

    @Override
    //身份认证没有通过是的执行方法
    protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
   
        HttpServletRequest req = (HttpServletRequest)request;
        HttpServletResponse resp = (HttpServletResponse) response;
        if (this.isLoginRequest(request, response)) {
   
            if (this.isLoginSubmission(request, response)) {
   
                return this.executeLogin(request, response);
            } else {
   
                return true;
            }
        } else {
   
            String ajaxHeader = req.getHeader("X-Requested-With");
            if (ajaxHeader != null || req.getHeader("X-TOKEN") 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值