ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Shiro logout 302重定向,shiro 302解决方案

2022-04-09 10:02:48  阅读:162  来源: 互联网

标签:302 request logout org import response shiro


 

================================

©Copyright 蕃薯耀 2022-04-09

https://www.cnblogs.com/fanshuyao/

 

一、问题描述

当登录退出为Ajax请求时,使用Shiro的logout退出登录,会发生302重定向,导致不能正常退出。

 

 

二、解决方案

 

1、重写LogoutFilter 过滤器

 
import java.util.Locale;
 
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.shiro.session.SessionException;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authc.LogoutFilter;
import org.apache.shiro.web.util.WebUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
import com.lqy.shiro.bean.Result;
import com.lqy.shiro.utils.RequestUtils;
 
/**
 * 重写shiro logout逻辑,避免是Ajax请求发生302重定向问题
 * @author islee
 *
 */
public class ShiroLogoutFilter extends LogoutFilter {
 
    private static final Logger log = LoggerFactory.getLogger(ShiroLogoutFilter.class);
    
    @Override
    protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
 
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        
        Subject subject = getSubject(request, response);
 
        // Check if POST only logout is enabled
        if (isPostOnlyLogout()) {
 
            // check if the current request's method is a POST, if not redirect
            if (!WebUtils.toHttp(request).getMethod().toUpperCase(Locale.ENGLISH).equals("POST")) {
               return onLogoutRequestNotAPost(request, response);
            }
        }
 
        String redirectUrl = getRedirectUrl(request, response, subject);
        
        try {
            subject.logout();
            
        } catch (SessionException ise) {
            
            log.debug("Encountered session exception during logout.  This can generally safely be ignored.", ise);
        }
        
        if(RequestUtils.isAjaxOrJsonRequest(req)) {
            RequestUtils.write(res, Result.ok("退出登录"));
            
        }else {
            issueRedirect(request, response, redirectUrl);
        }
        
        return false;
    }
    
}

 

 

核心代码是:

if(RequestUtils.isAjaxOrJsonRequest(req)) {
    RequestUtils.write(res, Result.ok("退出登录"));
            
}else {
    issueRedirect(request, response, redirectUrl);
}

判断是否为Ajax请求或者是Json请求,如果是,返回json字符串,否则默认进行登录跳转,即302重定向。

 

 

2、配置LogoutFilter 过滤器(ShiroLogoutFilter)

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean () {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        
        
        //自定义过滤器
        LinkedHashMap<String, Filter> filtsMap=new LinkedHashMap<String, Filter>();
        filtsMap.put("logout",new ShiroLogoutFilter() );
        
        shiroFilterFactoryBean.setFilters(filtsMap);
        
        
        return shiroFilterFactoryBean;
    }

 

 

 

(时间宝贵,分享不易,捐赠回馈,^_^)

 

================================

©Copyright 蕃薯耀 2022-04-09

https://www.cnblogs.com/fanshuyao/

标签:302,request,logout,org,import,response,shiro
来源: https://www.cnblogs.com/fanshuyao/p/16120940.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有