package com.ots.framework.shiro.web.filter.online;
|
import com.ots.common.constant.ShiroConstants;
|
import com.ots.common.utils.security.ShiroUtils;
|
import com.ots.framework.shiro.session.OnlineSessionDAO;
|
import com.ots.project.monitor.online.domain.OnlineSession;
|
import com.ots.project.system.user.domain.User;
|
import org.apache.shiro.session.Session;
|
import org.apache.shiro.subject.Subject;
|
import org.apache.shiro.web.filter.AccessControlFilter;
|
import org.apache.shiro.web.util.WebUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletResponse;
|
import java.io.IOException;
|
|
public class OnlineSessionFilter extends AccessControlFilter {
|
|
@Value("${shiro.user.loginUrl}")
|
private String loginUrl;
|
@Autowired
|
private OnlineSessionDAO onlineSessionDAO;
|
|
@Override
|
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
|
Subject subject = getSubject(request, response);
|
if (subject == null || subject.getSession() == null) {
|
return true;
|
}
|
Session session = onlineSessionDAO.readSession(subject.getSession().getId());
|
if (session != null && session instanceof OnlineSession) {
|
OnlineSession onlineSession = (OnlineSession) session;
|
request.setAttribute(ShiroConstants.ONLINE_SESSION, onlineSession);
|
|
boolean isGuest = onlineSession.getUserId() == null || onlineSession.getUserId() == 0L;
|
if (isGuest == true) {
|
User user = ShiroUtils.getSysUser();
|
if (user != null) {
|
onlineSession.setUserId(user.getUserId());
|
onlineSession.setLoginName(user.getLoginName());
|
onlineSession.setAvatar(user.getAvatar());
|
onlineSession.setDeptName(user.getDept().getDeptName());
|
onlineSession.markAttributeChanged();
|
}
|
}
|
if (onlineSession.getStatus() == OnlineSession.OnlineStatus.off_line) {
|
return false;
|
}
|
}
|
return true;
|
}
|
|
@Override
|
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
|
Subject subject = getSubject(request, response);
|
if (subject != null) {
|
subject.logout();
|
}
|
saveRequestAndRedirectToLogin(request, response);
|
return false;
|
}
|
|
@Override
|
protected void redirectToLogin(ServletRequest request, ServletResponse response) throws IOException {
|
WebUtils.issueRedirect(request, response, loginUrl);
|
}
|
}
|