까마귀코딩.log
세션 이용하는방법 (Session) 본문
세션이란 뭘까 ?
세션은 클라이엍느 별로 서버에 저장되는 정보를 말한다 !
사용자컴퓨터에 저장되던 쿠키와 다르게 서버에 저장되기 때문에,
비교적 보안이 필요한 데이터는 쿠키보다 세션에 저장한다.
서버가 종료되거나 유효시간이 지나면 사라지는게 세션이다 !!!
세션을 이용하는 방법에 대해 알아보자 !
세션 이용 방법 !
1. 웹클라이언트가 WAS 에 요청 !
그러면 여기서 WAS가 하는일?
2. 세션키를 생성해주고
3. 세션키를 이용해서 저장소를 생성해주고
4. 세션키를 담은 쿠키를생성해준다.
그다음 WAS 가 돌려주는것?
5. 응답 !!
웹 클라이언트에게 무엇을 돌려줄까?
(세션키를 담은 쿠키 포함해서 돌려준다)
웹 클라이언트가 다시
6)요청
을 WAS에 넣는다
그 요청에는 세션키를 저장하고 있는 쿠키가 포함되어있다.
WAS에서 하는일 ?
7) 쿠키의 세션키를 이용해서 이전에 생성한 저장소를 활용해준다.
다시 정리해보자 !
웹 클라이언트가 서버에게 요청을 보내면?
서버는 클라이언트를 식별하는 세션아이디를 생성한다.
서버는 session id로 key와 value를 저장하는
HttpSession을 생성하고,
session id 를 저장하고 있는 쿠키를 생성하여서
클라이언트에게 전송한다.
클라이언트는 서버측에 요청을 보낼때,
session id 를 가지고 있는 쿠키를 전송한다.
서버는 쿠키의 session id 로 HttpSession을 찾는다.
javax.servlet.http.HttpSession 으로 세션데이터를 다룰수 있다.
1. 세션 생성하고 얻기 !
HttpSession session = request.getSession();
HttpSession session = request.getSession(true);
request의 getSession()메서드는 서버에서 생성된 세션이 있다면??? 뭘 할까 ?
있다면 세션을 반환하고,
없다면 새 세션을 생성하여 반환한다.
( 인수 default가 true )
생성된 세션이
새롭게 생성된 세션인지 알수 있는 방법은 ?
-->
HttpSession 의 isNew() 메서드로 알수있다.
HttpSession session = request.getSession(false);
--> 위처럼
request의 getSession()메서드의 파라미터를 false로 전달하면 ???
==
이미 생성된 세션이 있을때 뭐해 ?
그세션을 반환해
없으면 뭐해 ? null을 반환해 !
아~ 그러면
HttpSession session = request.getSession(true); 랑
HttpSession session = request.getSession(false); 의 차이는
둘다 생성된 세션있을때 반환하지만
없을때는 생성을 해서 반환하냐 아니냐의 차이이네 ~~
2. 세션에 값 저장하기 !
setAttribute(String name, Object value);
쎗 어트리뷰트로 값을 저장하는구나 ~!
name 과 value 쌍으로 객체 오브젝트를 저장하는 메서드이다.
요거는 세션이 유지되는동안 저장되겠다 !!!
사용법 ?
session.setAttribute( 이름, 값 );
이렇게 사용할수 있다.
3. 세션에 값 조회하기 !
getAttribute(String name)
set으로 세션 저장하고
get으로 세션값 조회하는거네 !
getAttribute메서드로 세션에 저장된 값을 조회할수 있다
리턴타입은 object 이다 !!! 그래서 형변환이 필요하다 !
메서드 setAttribute 에 이용한 name 값을 알고 있으면 ?
다음과 같이 조회할수 있다.
String value = ( String ) session.getAttribute("name");
4. 세션에 값 삭제하기 !
removeAttribute(String name)
removeAttribute 메서드로 name 값에 해당하는 세션정보를 삭제할수 있다.
invalidate() 로 모든 세션정보를 한번에 삭제할수 있다 !!!
5. 세션 유지시간 설정하기 !!
기본적으로 세션유지시간은 어케될까 ? ? ? ? ? ? 30분으로 유지된다 !!
세션 유지시간은 서버에 접속한 후 서버에 요청하지 않는 최대시간을 말한다 !
30 분이상 서버에 전혀 반응을 보이지 않으면 ? ?
세션이 자동으로 끊어진다 !!
오호 ! 자동으로 끊어지는구나 ~
이 세션 유지시간은 어떻게 설정할수 있지 ?
web.xml 파일에서 설정할수 있다 !
<session-config>
<session-timeout>30</session-timeout>
</session-config>
[ 스프링 mvc에서 session 사용방법 ]
스프링 mvc에서
@SessionAttribute와 @ModelAttribute
요 두 애노테이션으로 세션에 값을 저장하고 가져오는 방법을 아래 예제들로 이해해보자 !!ㅎ
@SessionAttribute 파라미터로 지정된 이름과 같은 이름이 @ModelAttribute 에 지정되어 있으면 ? ?? ?
@ModelAttribute 설정된 메서드가 반환되는 값을 그 세션에 저장한다.
1) 컨트롤러 클래스 위에 @SessionAttribute를 선언하고,
@ModelAttribute 는 메서드 위에 선언한다
보면
컨트롤러 클래스에 @controller
@SessionAttribute("user") 요거 선언했네 요거 == SessionAttribute의 파라미터로 지정된 이름이 user 라는 뜻
public class LoginController {
@ModelAttribute("user") == ModelAttribute의 파라미터로 지정된 이름 역시 user이네 !!
public User setUpUserForm() {
return new User();
}
}
SessionAttribute 의 파라미터로 저장된 이름과
ModelAttribute 의 파라미터로 저장된 이름이 같다 !!
둘의 이름이 같으므로 !?
setUpUserForm() 메소드가 리턴하는 User객체는 ??
user라는 이름의 세션에 저장된다 !
% 위 코드는 새 객체 를 반환하여 저장시키므로,
해당 세션값을 초기화하는 목적으로 사용할수 있다 !
2) @SessionAttribute 를 컨트롤러 클래스 위에 선언하고,
메서드파라미터로 @ModelAttribute를 불러온다 ~
@Controller
@SessionAttribute("user")
public class LoginController {
@PostMapping("/dologin")
public String doLogin(@ModelAttribute("user") User user, Model model) {
}
}
@SessionAttribute 의 이름과 @ModelAttribute의 이름이 같아 ~! @
클라이언트로 부터 전송받은 user값이 그 세션에 저장된다.
메소드에 @SessionAttribute 가 있을경우,
파라미터로 지정된 이름으로 등록된 세션정보를 읽어와 변수에 할당한다.
@GetMapping("/info")
public String userInfo(@SessionAttribute("user") User user {
...
return "user";
}
sessionStatus 로 @SessionAttributes에 의해 저장된 오브젝트를 제거할수있다.
SessionStatus 는 컨트롤러 메서드의 파라미터로 사용할수 있는 스프링 내장 타입이다.
@Controller
@SessionAttributes ( "user")
public class UserController {
@RequestMapping("value="/user/add", method=RequestMethod.POST)
public String submit(@ModelAttribute("user") User user, SessionStatus sessionStatus){
...
sessionStatus.setComplete();
...
}
}
SessionStatus 의 SetComplete()메서드로
user라는 이름의 세션값을 제거한다.
Spring MVC 의 form tag 라이브러리 사용하기
<form:form action="login" method="post" modelAttribute="user">
Email : <form:input path="email" /><br>
Password: <form:password path="password" /> <br>
<button type="submit">Login</button>
</form:form>
modelAttribute 속성으로 지정된 이름의 객체를 세션에서 읽어와,
form 태그로 설정된 태그에 값을 설정한다.