package com.ots.framework.shiro.web.filter;
|
import com.ots.common.constant.Constants;
|
import com.ots.common.constant.ShiroConstants;
|
import com.ots.common.utils.MessageUtils;
|
import com.ots.common.utils.StringUtils;
|
import com.ots.common.utils.security.ShiroUtils;
|
import com.ots.framework.manager.AsyncManager;
|
import com.ots.framework.manager.factory.AsyncFactory;
|
import com.ots.project.system.user.domain.User;
|
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 javax.servlet.ServletRequest;
|
import javax.servlet.ServletResponse;
|
import java.io.Serializable;
|
import java.util.Deque;
|
|
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<String, Deque<Serializable>> 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 {
|
User 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;
|
}
|
|
@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);
|
}
|
|
public void setCacheManager(CacheManager cacheManager) {
|
|
this.cache = cacheManager.getCache(ShiroConstants.SYS_USERCACHE);
|
}
|
}
|