package com.doumee.config.shiro;
|
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.shiro.session.Session;
|
import org.apache.shiro.session.mgt.DefaultSessionManager;
|
import org.apache.shiro.session.mgt.SessionContext;
|
import org.apache.shiro.session.mgt.SessionKey;
|
import org.apache.shiro.web.servlet.Cookie;
|
import org.apache.shiro.web.servlet.ShiroHttpServletRequest;
|
import org.apache.shiro.web.servlet.SimpleCookie;
|
import org.apache.shiro.web.session.mgt.WebSessionManager;
|
import org.apache.shiro.web.util.WebUtils;
|
|
import javax.servlet.ServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletResponse;
|
import java.io.Serializable;
|
|
/**
|
* 自定义会话管理器
|
* @author Eva.Caesar Liu
|
* @date 2023/04/17 12:11
|
*/
|
@Slf4j
|
public class ShiroSessionManager extends DefaultSessionManager implements WebSessionManager {
|
|
public static String AUTH_TOKEN = "";
|
|
@Override
|
protected void onStart(Session session, SessionContext context) {
|
super.onStart(session, context);
|
if (!WebUtils.isHttp(context)) {
|
log.debug("SessionContext argument is not Http compatible or does not have an Http request/response pair. No session ID cookie will be set.");
|
return;
|
}
|
HttpServletRequest request = WebUtils.getHttpRequest(context);
|
HttpServletResponse response = WebUtils.getHttpResponse(context);
|
Serializable sessionId = session.getId();
|
this.storeSessionId(sessionId, request, response);
|
request.removeAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_ID_SOURCE);
|
request.setAttribute(ShiroHttpServletRequest.REFERENCED_SESSION_IS_NEW, Boolean.TRUE);
|
}
|
|
@Override
|
public Serializable getSessionId(SessionKey key) {
|
Serializable sessionId = super.getSessionId(key);
|
if (sessionId == null && WebUtils.isWeb(key)) {
|
ServletRequest servletRequest = WebUtils.getRequest(key);
|
if (!(servletRequest instanceof HttpServletRequest)) {
|
log.trace("Can not get sessionId from header, the request is not HttpServletRequest");
|
return null;
|
}
|
HttpServletRequest request = (HttpServletRequest) servletRequest;
|
// 从cookie中获取认证
|
javax.servlet.http.Cookie[] cookies = request.getCookies();
|
if (cookies != null) {
|
for (javax.servlet.http.Cookie cookie : cookies) {
|
if (AUTH_TOKEN.equals(cookie.getName())) {
|
return cookie.getValue();
|
}
|
}
|
}
|
// 从header中获取认证
|
return request.getHeader(AUTH_TOKEN);
|
}
|
return sessionId;
|
}
|
@Override
|
public boolean isServletContainerSessions() {
|
return false;
|
}
|
|
private void storeSessionId(Serializable currentId, HttpServletRequest request, HttpServletResponse response) {
|
if (currentId == null) {
|
String msg = "sessionId cannot be null when persisting for subsequent requests.";
|
throw new IllegalArgumentException(msg);
|
}
|
Cookie cookie = new SimpleCookie(AUTH_TOKEN);
|
cookie.setHttpOnly(false);
|
String idString = currentId.toString();
|
cookie.setValue(idString);
|
cookie.saveTo(request, response);
|
log.trace("Set session ID cookie for session with id {}", idString);
|
}
|
}
|