일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 우분투
- 포트포워딩
- 모래시계출력
- 페이로드
- dbeaver
- docker
- Decapsulation
- SpringApplication
- name=springapplication
- 도커권한설정
- javax.management.instancenotfoundexception: org.springframework.boot:type=admin
- 디비버
- ubuntu
- 오름차순
- 배열복사
- 포트포워딩 안될때
- jmx
- wan
- 브로드캐스트
- 백준1946
- 배열최소값최대값
- springboot
- 배열빈도수
- 리눅스계열
- 도커
- 리눅스환경
- 네트워크모델
- 유니캐스트
- instancenotfoundexception
- 백준
- Today
- Total
다잘하고싶어
[Spring] 로그인구현6_서블릿HTTP 세션, 스프링이 제공하는 SessionAttribute 본문
이전에 직접 만든 세션에서는 적용하지 않았던 기능 -> 특정 시간 사용하지 않으면 세션만료
HTTP세션에서는 위의 기능을 자동으로 지원한다.
기본개념
서블릿이 기본적으로 제공하는 쿠키는
쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다.
Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05
//로그인 성공처리
//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성해서 반환
HttpSession session = request.getSession();
//세션에 로그인 회원정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
세션의 create 옵션
default --> request.getSession(true)
1. request.getSession(true) 일 경우
- 세션이 있으면 기존 세션을 반환한다.
- 세션이 없으면 새로운 세션을 생성해서 반환한다. request.getSession(false)
2. request.getSession(false) 일 경우
- 세션이 있으면 기존 세션을 반환한다.
- 세션이 없으면 새로운 세션을 생성하지 않는다. null 을 반환한다.
LoginController
@PostMapping("login")
public String loginV3(@Valid @ModelAttribute LoginForm form, BindingResult bindingResult, HttpServletRequest request) {
if (bindingResult.hasErrors()) {
return "login/loginForm";
}
Member loginMember = loginService.login(form.getLoginId(), form.getPassword());
if (loginMember == null) { //회원을 못찾거나, 아이디 패스워드가 틀린 경우
bindingResult.reject("loginFail", "아이디 또는 비밀번호가 맞지 않습니다.");
return "login/loginForm";
}
//로그인 성공처리
//세션이 있으면 있는 세션 반환, 없으면 신규 세션 생성해서 반환
HttpSession session = request.getSession();
//세션에 로그인 회원정보 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);
return "redirect:/";
}
@PostMapping("/logout")
public String logoutV3(HttpServletRequest request) {
HttpSession session = request.getSession(false);
if (session != null) {
session.invalidate(); //세션과 그 안의 데이터 모두 삭제
}
return "redirect:/";
}
HomeController
@GetMapping("/")
public String homeLoginV3(HttpServletRequest request, Model model) {
//항상 세션이 만들어진다. 처음 들어온 사용자도 세션이 만들어짐. 따라서 false 로 해야함
HttpSession session = request.getSession(false);
if (session == null) {
return "home";
}
Member loginMember = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
//세션에 회원데이터가 없다면 홈으로 이동
if (loginMember == null) {
return "home";
}
//세션이 유지되면 로그인으로 이동
model.addAttribute("member", loginMember);
return "loginHome";
}

스프링이 제공하는 @SessionAttribute
-> 이 기능은 세션을 생성하지는 않으므로, 세션을 찾아올때만 사용한다.
번거로운 과정을 스프링이 한번에 편리하게 처리해준다.
@GetMapping("/")
public String homeLoginV3Spring(
@SessionAttribute(name = SessionConst.LOGIN_MEMBER, required = false)Member loginMember, Model model) {
//세션 뒤져서, 어트리뷰트 꺼내서 값을 넣어준다.
//세션에 회원데이터가 없다면 홈으로 이동
if (loginMember == null) {
return "home";
}
//세션이 유지되면 로그인으로 이동
model.addAttribute("member", loginMember);
return "loginHome";
}
(+) 참고
제일 처음 로그인을 시도하면 아래와 같은 값이 url에 붙어서 출력된다.
이는 웹 브라우저가 쿠키를 지원하지 않을 때 쿠키 대신 URL을 통해서 세션을 유지하는 방법.
이 방법을 사용하려면 URL에 이 값을 계속 포함해서 전달해야 한다.(굉장히 어려움)
서버 입장에서 웹 브라우저가 쿠키를 지원하는지 하지 않는지 최초에는 판단하지 못하므로, 쿠키 값도 전달하고, URL에 jsessionid 도 함께 전달한다.
없애려면 application.properties 에 아래 코드를 넣어준다
server.servlet.session.tracking-modes=cookie
Reference : https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-2/dashboard
스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의
웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있
www.inflearn.com
강의 듣고 내용 정리중
'이론학습 > SRPING' 카테고리의 다른 글
[스프링 MVC] 웹애플리케이션 이해 (0) | 2022.10.27 |
---|---|
[Spring] 로그인구현7_세션 정보와 타임아웃 설정 (1) | 2022.10.08 |
[Spring] 로그인구현5_세션 직접 구현하고 적용하기 (0) | 2022.10.07 |
[Spring] 로그인구현4_세션 사용하는 이유 (0) | 2022.10.07 |
[Spring] 로그인구현3_쿠키 활용 시 발생하는 문제 (1) | 2022.10.07 |