package com.javaweb.framework.shiro.web.filter; import java.io.Serializable; import java.util.Deque; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import org.apache.shiro.cache.Cache; import org.apache.shiro.cache.CacheManager; import org.apache.shiro.session.SessionException; import org.apache.shiro.subject.Subject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.javaweb.common.constant.Constants; import com.javaweb.common.constant.ShiroConstants; import com.javaweb.common.utils.MessageUtils; import com.javaweb.common.utils.StringUtils; import com.javaweb.framework.manager.AsyncManager; import com.javaweb.framework.manager.factory.AsyncFactory; import com.javaweb.framework.util.ShiroUtils; import com.javaweb.system.domain.SysUser; /** * 退出过滤器 * * @author ruoyi */ public class LogoutFilter extends org.apache.shiro.web.filter.authc.LogoutFilter { private static final Logger log = LoggerFactory.getLogger(LogoutFilter.class); /** * 退出后重定向的地址 */ private String loginUrl; private Cache> cache; public String getLoginUrl() { return loginUrl; } public void setLoginUrl(String loginUrl) { this.loginUrl = loginUrl; } @Override protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { try { Subject subject = getSubject(request, response); String redirectUrl = getRedirectUrl(request, response, subject); try { SysUser user = ShiroUtils.getSysUser(); if (StringUtils.isNotNull(user)) { String loginName = user.getLoginName(); // 记录用户退出日志 AsyncManager.me().execute(AsyncFactory.recordLogininfor(loginName, Constants.LOGOUT, MessageUtils.message("user.logout.success"))); // 清理缓存 cache.remove(loginName); } // 退出登录 subject.logout(); } catch (SessionException ise) { log.error("logout fail.", ise); } issueRedirect(request, response, redirectUrl); } catch (Exception e) { log.error("Encountered session exception during logout. This can generally safely be ignored.", e); } return false; } /** * 退出跳转URL */ @Override protected String getRedirectUrl(ServletRequest request, ServletResponse response, Subject subject) { String url = getLoginUrl(); if (StringUtils.isNotEmpty(url)) { return url; } return super.getRedirectUrl(request, response, subject); } // 设置Cache的key的前缀 public void setCacheManager(CacheManager cacheManager) { // 必须和ehcache缓存配置中的缓存name一致 this.cache = cacheManager.getCache(ShiroConstants.SYS_USERCACHE); } }