================================
©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