Shiro logout 302 redirect, shiro 302 solution

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

©Copyright Sweet Potato Yao2022-04-09

Sweet Potato Yao's Blog - CSDN Blog

1. Problem description

When logging in and logging out is an Ajax request, using Shiro's logout to log out, a 302 redirect will occur, resulting in failure to log out normally.

2. Solutions

1. Rewrite the LogoutFilter filter


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

The core code is:

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

Determine whether it is an Ajax request or a Json request, and if so, return a json string, otherwise, the login jump is performed by default, that is, a 302 redirection.

2. Configure the LogoutFilter filter (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;
	}

 (Time is precious, sharing is not easy, donate and give back, ^_^)

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

©Copyright Sweet Potato Yao2022-04-09

Sweet Potato Yao's Blog - CSDN Blog

Guess you like

Origin blog.csdn.net/w995223851/article/details/124055540