Springboot 프로젝트 모니터 실효 문제 해결

1.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 사용자 정의 감청 에 들 어 갈 수 있 음 을 발 견 했 습 니 다...



이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기