标签: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. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。