이 글은 Head First Servlet and JSP 책을 기반으로 작성하였습니다.
웹서버는 요청이 누구에게 왔는지 기억하지 않는다. 즉, 과거에 어떤 요청을 보냈는지 모른다. 하지만 현재 요청이 이전 요청들의 값들을 필요로한다면 어떻게 해야할까?(conversational state).
- 우선 여기선 인증이라는 것을 제외하고 봅니다.
- 인증은 차후 security쪽에서.
- 여기서는 유저의 식별을 어떻게 할거냐?를 중점으로 보기때문에 session ID 관련해서만 봅니다.
자 그러면 HttpSession을 쓰기로는 했는데.. 어떻게 유저를 식별할까?
request.getRemoteAddr()
의 경우에는 가장 마지막 프록시 주소를 리턴request.getHeader("X-FORWARDED-FOR")
는 맨 처음 유저 IP 리턴.X-Forwarded-For: client, proxy1, proxy2
response
HTTP/1.1 200 OK
Set-Cookie: JSESSIONID=0AAB6C8DE415
Content-Type: text/html
...
request
POST /select/selectCookie.do HTTP/1.1
Host: www.~~~.com
User-Agent: Chrome/~~
Cookie: JSESSIONID=0AAB6C8DE114
...
HttpSession session = request.getSession();
getSession(false)
를 사용하게 되면 기존에 session ID 있는것만 사용.URL + ;jsessionid=123145151
int getMaxInactiveInterval();
long getCreationTime();
long getLastAccessedTime();
void invalidate();
...
요런거 활용해서..
HttpSession
HttpSessionActivationListener
구현해서 씀.
package com.example.servlet;
import jakarta.servlet.http.HttpSessionAttributeListener;
import jakarta.servlet.http.HttpSessionBindingEvent;
public class BeerAttributeListener implements HttpSessionAttributeListener {
public void attributeAdded(HttpSessionBindingEvent event) {
String name = event.getName();
Object value = event.getValue();
System.out.println("Attribute added: " + name + ": " + value);
}
public void attributeRemoved(HttpSessionBindingEvent event) {
String name = event.getName();
Object value = event.getValue();
System.out.println("Attribute removed: " + name + ": " + value);
}
public void attributeReplaced(HttpSessionBindingEvent event) {
String name = event.getName();
Object value = event.getValue();
System.out.println("Attribute replaced: " + name + ": " + value);
}
}
package com.example.servlet;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;
public class BeerSessionCounter implements HttpSessionListener {
static private int activeSessions;
public static int getActiveSessions(){
return activeSessions;
}
public void sessionCreated(HttpSessionEvent event){
activeSessions++;
}
public void sessionDestroyed(HttpSessionEvent event) {
activeSessions--;
}
}
package com.example.servlet;
import jakarta.servlet.http.*;
import java.io.Serializable;
public class Dog implements HttpSessionBindingListener,
HttpSessionActivationListener, Serializable {
private String breed;
public Dog(String breed){
this.breed = breed;
}
public String getBreed(){
return breed;
}
public void valueBound (HttpSessionBindingEvent event){
System.out.println("I'm in session now");
}
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("I'm not in session now");
}
public void sessionWillPassivate(HttpSessionEvent event) {
//non-serializable
}
public void sessionDidActivate(HttpSessionEvent event){
//code to restore my fields
//in sessionWillPassivate.
}
}