Springboot 프로젝트 모니터 실효 문제 해결
자신 이 실현 한 사고방식 은 다음 과 같다.감청 기 를 써 서 특정한 요 구 를 받 은 후에 현재 의 모든 사용 자 를 감청 하고 영향 을 받 은 사용자 라면 session 을 없 애고 다시 로그 인하 도록 한다.
아이디어 가 생 긴 후에 처음에 인터넷 에서 검색 한 것 은 어떻게 spring boot 에 감청 을 추가 하 는 지 입 니 다.인터넷 의 대부분 사고방식 은 똑 같 습 니 다.@ServletComponent Scan 과 Http Session Listener 를 실현 하 는 방법 을 사용 하면 됩 니 다.하지만 스스로 이 설정 에 따라 작 동 하지 않 았 다.시작 할 때 이 사용자 정의 감청 에 debug 를 넣 을 수 있 지만 로그 인 후 부족 하면 실행 할 수 없습니다.
sessionCreated()
package com.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;
/**
* session
* @author Administrator
*/
@WebListener
public class SessionListener implements HttpSessionListener{
private int onlineCount = 0;// session
/**
* session
*/
@Override
public void sessionCreated(HttpSessionEvent se) {
onlineCount++;
System.out.println("【HttpSessionListener 】 sessionCreated, onlineCount:" + onlineCount);
se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
}
/**
* session
*/
@Override
public void sessionDestroyed(HttpSessionEvent se) {
if (onlineCount > 0) {
onlineCount--;
}
System.out.println("【HttpSessionListener 】 sessionDestroyed, onlineCount:" + onlineCount);
se.getSession().getServletContext().setAttribute("onlineCount", onlineCount);
}
}
무리 속 의 대신 에 게 물 어 봐 도 괜 찮 습 니 다.처음에는 로그 인 할 때 감청 하 는 HttpSession 인지 의 심 스 러 웠 습 니 다.HttpSession Listener 를 실 현 했 기 때문에 시작 하 는 동작 이 필요 합 니 다.하지만 자신 이 로그 인 할 때 도 httpSession 이 있 습 니 다.그리고 자신의 테스트 클래스 에서 테스트 를 진행 한 결과 sesionId 가 존재 하 는 것 을 발견 했다.
package com.sq.transportmanage.gateway.api.auth;
import com.alibaba.fastjson.JSONObject;
import com.sq.transportmanage.gateway.api.web.interceptor.AjaxResponse;
import com.sq.transportmanage.gateway.api.web.interceptor.LoginoutListener;
import com.sq.transportmanage.gateway.service.common.shiro.session.RedisSessionDAO;
import com.sq.transportmanage.gateway.service.common.web.RestErrorCode;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
/**
* @Author fanht
* @Description
* @Date 2020/3/5 6:46
* @Version 1.0
*/
@RestController
@RequestMapping("/loginoutController")
public class LoginoutController extends RedisSessionDAO{
private Logger logger = LoggerFactory.getLogger(this.getClass());
@RequestMapping("/userLoginOut")
@ResponseBody
public AjaxResponse userLoginOut(String userIds, HttpSession httpSession,
HttpServletRequest request){
logger.info("httpSessionId" + httpSession.getId() + ", session :" +
request.getSession(false));
HttpSession session = request.getSession();
String loginName = (String) session.getAttribute("loginName");
logger.info("loginName:" + loginName);
logger.info(" shiro " + userIds);
logger.info(" " + JSONObject.toJSONString(LoginoutListener.sessionCount));
try {
String userId[] = StringUtils.tokenizeToStringArray(userIds,",");
for(int i = 0;i<userId.length;i++){
clearRelativeSession(null,null,Integer.valueOf(userId[i]));
}
return AjaxResponse.success(null);
} catch (NumberFormatException e) {
e.printStackTrace();
logger.error("shiro " + e);
return AjaxResponse.fail(RestErrorCode.UNKNOWN_ERROR);
}
}
@Override
public void clearRelativeSession(Integer permissionId, Integer roleId, Integer userId) {
super.clearRelativeSession(null, null, userId);
}
}
session Id 를 인쇄 할 수 있 습 니 다.즉,session 은 비어 있 지 않 습 니 다.그리고 우리 프로젝트 에 shiro 를 썼 다 고 생각 했 어 요.shiro 가 session 체 제 를 다시 쓴 거 아니에요?이 의문 을 생각 하고 인터넷 으로 검색 한 결과 이 를 통 해 알 수 있 었 다.
자신의 설정 을 첨부 합 니 다:
사용자 정의 shiroSessionListener:
package com.sq.transportmanage.gateway.api.web.interceptor;
import com.google.common.collect.Maps;
import com.sq.transportmanage.gateway.service.common.shiro.session.RedisSessionDAO;
import org.apache.shiro.session.Session;
import org.apache.shiro.session.SessionListener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
/**
* @Author fanht
* @Description ,
* @Date 2020/3/5 1:48
* @Version 1.0
*/
//@WebListener
public class LoginoutListener extends RedisSessionDAO implements SessionListener {
private Logger logger = LoggerFactory.getLogger(this.getClass());
public static final Map<Long,String> mapUser = Maps.newHashMap();
public final static AtomicInteger sessionCount = new AtomicInteger(0);
@Override
public void onStart(Session session) {
// ,
logger.info("======" + sessionCount);
sessionCount.incrementAndGet();
}
@Override
public void onStop(Session session) {
// ,
sessionCount.decrementAndGet();
}
@Override
public void onExpiration(Session session) {
// ,
sessionCount.decrementAndGet();
}
/**
*
* @return
*/
public AtomicInteger getSessionCount() {
return sessionCount;
}
/*@Override
public void sessionCreated(HttpSessionEvent se) {
onlineCount++;
logger.info(" start====== ===" + se.getSession().getId());
mapUser.put(se.getSession().getCreationTime(),se.getSession().getId());
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
logger.info(" session=============");
}*/
}
Shiro Configuration 에 설 정 된 감청 추가:
@Bean("sessionManager")
public DefaultWebSessionManager sessionManager(RedisSessionDAO sessionDAO, SimpleCookie sessionIdCookie) {
DefaultWebSessionManager sessionManager = new DefaultWebSessionManager();
//session 60
sessionManager.setGlobalSessionTimeout(3600000);
sessionManager.setDeleteInvalidSessions(true);
// fht @WebListern HttpSessionListerner shiro session 2020-03-05
Collection<SessionListener> sessionListeners = new ArrayList<>();
sessionListeners.add(sessionListener());
sessionManager.setSessionListeners(sessionListeners);
//sessionManager.setSessionValidationSchedulerEnabled(true);
//sessionManager.setSessionValidationScheduler(sessionValidationScheduler);
sessionManager.setSessionDAO(sessionDAO);
sessionManager.setSessionIdCookieEnabled(true);
sessionManager.setSessionIdCookie(sessionIdCookie);
return sessionManager;
}
/**
* shiro
* @return
*/
@Bean("sessionListener")
public LoginoutListener sessionListener(){
LoginoutListener loginoutListener = new LoginoutListener();
return loginoutListener;
}
그리고 다시 시작,테스트,shiro 사용자 정의 감청 에 들 어 갈 수 있 음 을 발 견 했 습 니 다...이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
thymeleaf로 HTML 페이지를 동적으로 만듭니다 (spring + gradle)지난번에는 에서 화면에 HTML을 표시했습니다. 이번에는 화면을 동적으로 움직여보고 싶기 때문에 입력한 문자를 화면에 표시시키고 싶습니다. 초보자의 비망록이므로 이상한 점 등 있으면 지적 받을 수 있으면 기쁩니다! ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.