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); } }