Spring mvc 계단식 session 의 실례 상세 설명

6379 단어 Spingmvcsession
Spring mvc 계단식 session 의 실례 상세 설명
세 션 은 서버 와 브 라 우 저의 세 션 과정 을 대표 하 며,정 보 는 서버 에 저 장 됩 니 다.Servlet 에서 session 은 HttpSession 류 의 대상 을 가리킨다.서버 는 session 을 만 든 후 sessionid 를 쿠키 로 클 라 이언 트 에 다시 씁 니 다.클 라 이언 트 의 브 라 우 저가 꺼 지지 않 는 한 서버 에 접근 할 때마다 이 sessionid 를 가 져 옵 니 다.이렇게 하면 요청 할 때마다 session 의 정 보 를 얻 을 수 있 습 니 다.
다음은 spring MVC 를 예 로 들 어 단계별 session 을 만 들 면 설명 합 니 다.
1.login C 로그 인 페이지
login 은 사용자 가 로그 인 페이지 로 이동 할 때 유일 하 게 key 가 sessionid 인 sesssionid 를 생 성 할 수 있 음 을 나타 낸다.sessionid 를 response 에 저장 합 니 다.사용자 가 진정 으로 로그 인 할 때 sessionid 를 가 져 옵 니 다.계단식 이기 때문에 sessionid 를 통일 적 으로 관리 하여 Redis 캐 시 에 저장 합 니 다.

public class LoginController{

  private static final String SESSION_ID_COOKIE = "sessionId";

  @Autowired
  private RedisClient client;

  @RequestMapping(value="/login/index")
  public ModelAndView login(HttpServletRequest request, HttpServletResponse response){
    ModelAndView modelAndView = new ModelAndView("/login");
    String sessionId = CookieUtils.getCookieValue(request, SESSION_ID_COOKIE);
    if(StringUtils.isEmptyOrNull(sessionId)) {
      sessionId = getUniqueSessionId();
      addCookie(response, SESSION_ID_COOKIE, sessionId);
    }
    //         

    return modelAndView;
  }

  //   cookie response
  private void addCookie(HttpServletResponse response, String cookieName, String cookieValue) {
    Cookie cookie = new Cookie(cookieName, cookieValue);
    cookie.setPath("/");
    cookie.setMaxAge(-1);
    response.addCookie(cookie);
  }

  //     sessionid
  private String getUniqueSessionId() {
    String sessionId = "";
    while(true) {
      String uuid = UUID.randomUUID().toString();
      String[] jsessionIdArray = uuid.split("-");
      StringBuilder jsessionIdBuilder = new StringBuilder();
      for(String str: jsessionIdArray) {
        jsessionIdBuilder.append(str);
      }
      sessionId = jsessionIdBuilder.toString();
      if(!redisClient.exists(sessionId)) {
        break;
      }
    }
    return sessionId;
  }
}

2.authenticate C 인증/로그 인
사용자 가 사용자 이름 비밀 번 호 를 입력 하려 면 배경 에서 로그 인 해 야 합 니 다.이 때 쿠키 에서 sessionid 를 가 져 온 다음 redis 에서 값 sessionid value 를 가 져 올 수 있 습 니 다.또한 저장 해 야 할 session 정 보 를 session idvalue 를 key 로 하여 redis 에 저장 합 니 다.

public class LoginController{

  private static final String SESSION_ID_COOKIE = "sessionId";

  private static final Integer REDIS_SESSION_TIME_SECONDS = 2 * 60 * 60;

  @Autowired
  private RedisClient client;

  @RequestMapping(value="/authenticate")
  @ResponseBody
  public ResponseInfo login(String username, String password, HttpServletRequest request){
    ResponseInfo<Object> responseInfo = new ResponseInfo<Object>();
    try {
      Account account = authenticate(username, password);

      saveSession(account);
      responseInfo.setStatus(0);
      responseInfo.setMessage("success");
    } catch(Exceptioin e){
      responseInfo.setStatus(1);
      responseInfo.setMessage("     ,     ")
    }

    return responseInfo;
  }

  //   session  
  private void saveSession(Account account) {
    String sessionId = CookieUtils.getCookieValue(request, SESSION_ID_COOKIE);
    redisClient.set(sessionId, account);
    redisClient.expire(sessionId, REDIS_SESSION_TIME_SECONDS);
  }
}

3、logout C 등 판
사용자 가 시스템 을 종료 하려 면 로그 인 페이지 즉 첫 번 째 단계 로 페이지 를 이동 하고 redis 에 있 는 session 정보 와 Cookie 에 있 는 sessionid 를 삭제 해 야 합 니 다.

public class LoginController{

  private static final String SESSION_ID_COOKIE = "sessionId";

  @Autowired
  private RedisClient client;

  @RequestMapping(value="/logout", method = RequestMethod.GET)
  public void logout(HttpServletRequest request, HttpServletResponse response) {
    //               
    String redirectUrl = this.getLoginPageRedirectUrl(request);

    clearSession(request);
    clearSessionCookie(request, response);
    response.sendRedirect(redirectUrl);
  }

  //   session redis     
  private void clearSession(HttpServletRequest request) {
    String sessionId = CookieUtils.getCookieValue(request, SESSION_ID_COOKIE);
    redisClient.del(sessionId);
  }

  //   session cookie  sessionid
  private void clearSessionCookie(HttpServletRequest request, HttpServletResponse response) {
    Cookie sessionCookie = CookieUtils.getCookie(request, SESSION_ID_COOKIE);
    sessionCookie.setMaxAge(0);
    response.addCookie(sessionCookie);
  }
}

4.세 션 가 져 오기
세 션 을 공공 컨트롤 러 에 추출 할 수 있 습 니 다.세 션 정 보 를 사용 해 야 하 는 클래스 는 이 종 류 를 계승 할 수 있 습 니 다.

public class BaseController{

  @Autowired
  private RedisClient redisClient;

  protected Account getAccountFromSession(HttpServletRequest request) {
    String sessionCookieValue = CookieUtils.getCookieValue(request, "sessionid");
    if(StringUtils.isEmptyOrNull(sessionCookieValue)) {
      return null;
    } else {
      String accountJson = this.redisClient.get(sessionCookieValue);
      Account account = null;
      if(!StringUtils.isEmpty(accountJson)) {
        account = (Account)JSON.parseObject(casInfoJson, Account.class);
      }

      return account;
    }
  }

}

5.총화
제3자 관리 session 을 사용 할 때의 기본 절 차 는 다음 과 같다.
로그 인 페이지 에 들 어가 sessionid 를 쿠키 에 저장 합 니 다사용자 로그 인 성공 sessionid 의 값 에 따라 Session 을 redis 에 저장 합 니 다4.567917.사용자 로그 인 시스템 은 쿠키 에 있 는 sessionid 와 redis 에 있 는 사용자 의 session 정 보 를 제거 해 야 합 니 다.
사용자 가 로그 인 에 성공 한 후에 다른 작업 을 하면 request 에서 사용자 의 session 정 보 를 얻 을 수 있 습 니 다.
 궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!

좋은 웹페이지 즐겨찾기