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 정 보 를 얻 을 수 있 습 니 다.
궁금 한 점 이 있 으 시 면 메 시 지 를 남기 거나 본 사이트 의 커 뮤 니 티 에 가서 토론 을 교류 하 세 요.읽 어 주 셔 서 감사합니다. 도움 이 되 셨 으 면 좋 겠 습 니 다.본 사이트 에 대한 지지 에 감 사 드 립 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
클린 아키텍처의 Presenter를 이해하기 어려운 것은 MVC 2가 아니기 때문에클린 아키텍처에는 구체적인 클래스 구성 예를 보여주는 다음 그림이 있습니다. 이 그림 중에서 Presenter와 Output Boundary(Presenter의 인터페이스)만 구체 구현을 이미지하는 것이 매우 어렵다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.