일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 검증헤더
- http
- 양쪽 모두 값 설정
- supportParameter
- etag
- 서블릿필터
- max age
- UrlResource
- HTTP상태코드
- hikaricp
- 서블릿http세션
- no cache
- 프록시 캐시 서버
- 쿠키보안문제
- 세션타임아웃설정
- resolveArgument
- HTTP API
- 세션만들어보기
- Expires
- must revalidate
- 조건부요청
- Could not find or load main class worker.org.gradle.process.internal.worker.GradleWorkerMain
- 300
- Not Modified
- 쿠키생명주기
- 프록시객체
- 인증체크
- www-Authenticate
- gradle오류
- 캐시
- Today
- Total
복습을 위한
서블릿http세션 본문
서블릿은 세션을 위해 HttpSession 이라는 기능을 제공하는데
전블로그에서 직접 구현한 세션의 개념이 이미 구현되어 있고, 더 잘 구현되어 있다. HttpSession 소개 서블릿이 제공하는 HttpSession 도 직접 만든 SessionManager 와 같은 방식으로 동작한다.
서블릿을 통해 HttpSession 을 생성하면 다음과 같은 쿠키를 생성한다. 쿠키 이름이 JSESSIONID 이고, 값은 추정 불가능한 랜덤 값이다.
Cookie: JSESSIONID=5B78E23B513F50164D6FDD8C97B0AD05
@PostMapping("/login")//HTTP세션활용
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";//글로벌오류
}
//로그인 성공처리
//세션이 있으면 있는 세션 반환, 없으면 신규 세션을 생성, 고유한 id를 가진 세션이 생성된다.
HttpSession session = request.getSession();//(true)기본값임 //false경우 세션이 없으면 새로운 새션생성안하고null반환
//세션에 로그인 회원 정보를 보관
session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember);//세션에 보관하고싶은 객체담기
//키값에 카테고리같이 세션의 범주를 넣어주고, 값에 객체를 넣어준다.
return "redirect:/";
}
LoginController
세션 생성과 조회 세션을 생성하려면 request.getSession(true) 를 사용하면 된다.
public HttpSession getSession(boolean create);
세션의 create 옵션에 대해 알아보자.
request.getSession(true) 세션이 있으면 기존 세션을 반환한다. 세션이 없으면 새로운 세션을 생성해서 반환한다. request.getSession(false) 세션이 있으면 기존 세션을 반환한다. 세션이 없으면 새로운 세션을 생성하지 않는다. null 을 반환한다.
request.getSession() : 신규 세션을 생성하는 request.getSession(true) 와 동일하다. 세션에 로그인 회원 정보 보관 session.setAttribute(SessionConst.LOGIN_MEMBER, loginMember); 세션에 데이터를 보관하는 방법은 request.setAttribute(..) 와 비슷하다. 하나의 세션에 여러 값을 저장할 수 있다.
@PostMapping("/logout")//http 세션활용
public String logoutV3(HttpServletRequest request){
HttpSession session = request.getSession();
if(session!=null){
session.invalidate();//세션삭제
}
return "redirect:/";
}
@GetMapping("/")//서블릿http 세션 활용
public String homeLoginV3(HttpServletRequest request, Model model){
HttpSession session = request.getSession(false);//false 그냥 홈에만 들어온사람도 있는데 세션없다고 새로 생성할 필요없다
if(session==null){
return "home";
}
Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);//카테고리같은 키값을 넣어 객체를 꺼낸다.
//세션에 회원 데이터가 없으면 home
if(loginMember==null){
return "home";
}
//세션이 유지되면 로그인성공화면으로 보내기
model.addAttribute("member",loginMember);
return "loginHome";
}
HomeController
여기선 request.getSession(false) 이다.
request.getSession() 를 사용하면 기본 값이 create: true 이므로, 로그인 하지 않을 사용자도 의미없는 세션이 만들어진다. 따라서 세션을 찾아서 사용하는 시점에는 create: false 옵션을 사용해서 세션을 생성하지 않아야 한다. session.getAttribute(SessionConst.LOGIN_MEMBER) : 로그인 시점에 세션에 보관한 회원 객체를 찾는다.
**추가 @SessionAttribute 스프링은 세션을 더 편리하게 사용할 수 있도록 @SessionAttribute 을 지원한다.
@GetMapping("/")//스프링어노테이션 세션 활용..코드짧아진다 알아서 가져와서 찾아준다. //어노테이션이 세션생성은 안함
public String homeLoginV3Spring(
@SessionAttribute(name=SessionConst.LOGIN_MEMBER,required = false)Member loginMember, Model model){
// HttpSession session = request.getSession(false);//그냥 홈에만 들어온사람도 있는데 세션없다고 새로 생성할 필요없다
// if(session==null){
// return "home";
// }
// Member loginMember = (Member)session.getAttribute(SessionConst.LOGIN_MEMBER);//카테고리같은 키값을 넣어 객체를 꺼낸다.
//세션에 회원 데이터가 없으면 home
if(loginMember==null){
return "home";
}
//세션이 유지되면 로그인성공화면으로 보내기
model.addAttribute("member",loginMember);
return "loginHome";
}
HomeController
이미 로그인 된 사용자를 찾을 때는 다음과 같이 사용하면 된다. HomeController에서 사용할 수 있다. 참고로 이 기능은 세션을 생성하지 않는다. @SessionAttribute(name = "loginMember", required = false) Member loginMember
그러니깐 로그인할 때는 사용못한다.
참고
'SpringMVC' 카테고리의 다른 글
스프링 인터셉터 (0) | 2024.01.31 |
---|---|
서블릿 필터 (0) | 2024.01.31 |
세션타임아웃설정 (0) | 2024.01.31 |
쿠키보안문제와 세션 (0) | 2024.01.30 |
MultipartFile (1) | 2024.01.30 |