개발하는 삶
[Spring] 쿠키, 세션, ajax 본문
세션 트래킹
- 웹페이지의 상태나 정보를 공유
- HTTP 프로토콜로 각각의 웹페이지를 요청해서 클라이언트의 브라우저에 표시해줌
- HTTP 프로토콜은 각 웹페이지의 상태, 정보를
- 다른 페이지와 공유하지 않는 stateless 방식으로 통신함
- 따라서 웹페이지/서블릿 끼리 상태를 공유하려면 세션트래킹을 이용해야 함
웹페이지 연동법
- <hidden>태그 : 태그를 이용해 웹페이지들 사이의 정보 공유
- URL Rewriting : GET 방식으로 URL 뒤에 정보를 붙여 다른 페이지로 전송
- 쿠키 : 클라이언트 PC의 Cookie 파일에 정보를 저장하고 웹페이지들이 공유
- 세션 : 서버 메모리에 정보를 저장한 후 웹페이지들이 공유함
쿠키, 세션이 더 많이 쓰임!
쿠키
- 웹페이지들 사이의 공유정보를 클라이언트 PC에 저장
- 필요할 때 여러 웹페이지들이 공유해서 사용할 수 있게 매개역할을 함
- 종류
- Persistence 쿠키 : 파일로 생성. 쿠키를 삭제할경우까지 유지.
- ex) 로그인 유무, 팝업창 제한
- Session 쿠키 : 메모리에 생성. 브라우저 종료시까지 유지.
- ex) 사이트 접속시 Session 인증 정보를 유지할 때
- Persistence 쿠키 : 파일로 생성. 쿠키를 삭제할경우까지 유지.
쿠키 실행 과정
- 웹서버에서 쿠키를 생성 → 클라이언트에 전송
- 브라우저는 쿠키를 파일로 저장
- 다시 접속해 브라우저에게 쿠키 전송을 요청시,
- 브라우저는 쿠키 정보를 서버에 전송.
- 서버는 쿠키 정보를 이용해 작업함.
쿠키 API
- 쿠키는 Cookie 클래스 객체 생성 후 정보전달
- → 서버에서 클라이언트로 전송해 파일로 저장됨
- 전송 특징
- HttpServletResponse 의 addCookie() : 클라이언트는 브라우저에 쿠키를 전송한 후 저장
- HttpServletRequest 의 getCookie() : 쿠키를 서버로 가져옴
서블릿에서 쿠키 사용하기
SetCookieValue
package sec02.ex01;
@WebServlet("/set")
public class SetCookieValue extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
Date d = new Date(); // 날짜 출력용
// 쿠키 객체 생성
// "cookieTest" 이름으로 한글정보를 인코딩해서 쿠키에 저장
Cookie c = new Cookie("cookieTest", URLEncoder.encode("JSP 프로그램입니다.","utf-8"));
// setMaxAge : 쿠키의 유효기간 설정. 초단위 기준이라 저 식은 하루를 뜻함
// c.setMaxAge(-1) : 음수로 지정해 세션 쿠키를 만듬 (브라우저 종료시까지 유지)
c.setMaxAge(24*60*60);
// 생성된 쿠키를 브라우저로 전송
response.addCookie(c);
out.println("현재시간 : "+d);
out.println("문자열을 Cookie에 저장합니다.");
}
}
GetCookieValue
package sec02.ex01;
@WebServlet("/get")
public class GetCookieValue extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 브라우저의 쿠키정보를 요청 => 배열에 담음
Cookie [] allValues = request.getCookies();
// 쿠키정보들을 가져옴
// 가져온 정보 중 cookieTest와 이름이 같은 값을 찾음
// decode : 인코딩한 결과를 디코딩함 (인코딩 해제)
// 원본을 다시 "utf-8" 인코딩한다고 보면 됨
for(int i=0; i<allValues.length; i++) {
if(allValues[i].getName().equals("cookieTest")) {
out.println("<h2>Cookie 값 가져오기 : "+URLDecoder.decode(allValues[i].getValue(), "utf-8"));
}
}
}
}
결과값
쿠키 생성상태 확인하는 법
쿠키를 통해 팝업창 닫기
popUp.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
function setPopUpStart(obj) {
if(obj.checked == true) {
// 현재시간
var expireDate = new Date();
var days = 1;
// 쿠키 유효시간에 들어갈 값 (끝나는 시간)
expireDate.setDate(expireDate.getDate()+days);
// expires 헤더 : 응답이 끝나는 시간
// toGMTString() : 해당 객체를 더이상 사용하지 않음. 쿠키만료일자 쓸때 주로 사용함
document.cookie = "notShowPop=" + "true" + ";path=/; expires="+expireDate.toGMTString();
window.close();
}
}
</script>
</head>
<body>
알림 팝업창입니다.
<br><br><br><br><br><br><br>
<form>
<!-- 체크하면, setPopUpStart(해당 input창 가리킴) 실행 -->
<input type=checkbox onClick="setPopUpStart(this)">오늘 더 이상 팝업창 띄우지 않기
</form>
</body>
</html>
popupTest.html
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script type="text/javascript">
window.onload = pageLoad;
function pageLoad(){
// 함수 값 넣기
notShowPop = getCookieValue();
// 팝업창 막기 = false 이면 실행
console.log(notShowPop);
if(notShowPop == "false"){
// 팝업창 생성
window.open("popUp.html","pop","window=400, height=500, history=no, resizable=no, status=no,scrollbars=yes,menubar=no");
}
}
function getCookieValue(){
var result = "false";
if(document.cookie != ""){
// document.cookie : 쿠키 정보 문자열로 가져오고, ;로 구분해 각각의 쿠키 얻기
cookie = document.cookie.split(";");
for(var i=0; i<cookie.length; i++){
element = cookie[i].split("=");
value = element[0];
// 정규식으로 문자열의 공백(스페이스바) 제거한 문자열 만들기
value = value.replace(/^\s*/,'');
// 쿠키 이름이 notShowPop 이면, 해당되는 쿠키값을 반환
if(value=="notShowPop"){
result = element[1];
}
}
}
return result;
}
function deleteCookie(){
// 쿠키 삭제시, 팝업창막기 = false // 팝업창 보여줌.
document.cookie = "notShowPop=" + "false" + ";path=/; expires=1";
}
</script>
</head>
<body>
<form>
<input type=button value="쿠키삭제" onClick="deleteCookie()">
</form>
</body>
</html>
세션
- 쿠키는 웹페이지들의 정보가 클라이언트 PC에 저장되므로 정보가 노출될수있음
- 세션은 서버의 메모리에 생성되므로 보안이 요구되는 ‘로그인’ 서비스 등에 활용 가능
세션 기능 실행 과정
- 브라우저로 사이트에 접속
- 서버는 접속한 브라우저에 대한 세션 객체 생성
- 생성된 세션 id를 클라이언트 브라우저에 응답함
- 브라우저는 서버로부터 받은 세션 id를
- 브라우저에 사용하는 메모리의 세션 쿠키에 저장함
- 브라우저가 재접속하면 브라우저는 세션쿠키에 저장된 세션 id를 서버에 전달함
- 서버는 전송된 세션 id를 이용해 해당 세션에 접근하여 작업 수행함
세션 API의 특징과 기능
- HttpSession 클래스 객체 생성해 세션 이용
- HttpSessionRequest 의 getSession() 호출해 생성
- getSession() : 기존의 세션객체가 존재하면 반환. 없으면 새로 생성 (= getSession(true))
- getSession(false) : 기존의 세션객체가 존재하면 반환. 없으면 null 반환
- 메서드
- getAttribute(String name) : 속성이름이 name인 속성값을 Object 타입으로 반환
- 없으면 null 반환
- setAttribute(String name, Object value) : 속성이름이 name인 속성값을 value로 할당
- removeAttribute(String name) : 속성이름이 name인 속성을 제거
- getId() : 세션에 할당된 고유식별자를 String 타입으로 반환
- invalidate() : 현재 생성된 세션 소멸
- getAttribute(String name) : 속성이름이 name인 속성값을 Object 타입으로 반환
서블릿에서 세션 API 이용하기
package sec03.ex01;
@WebServlet("/sess")
public class SessionTest extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
// 세션 생성
HttpSession session = request.getSession();
// getId : 생성된 세션 객체의 id를 가져옴
out.println("세션 아이디: "+session.getId()+"<br>");
// 최초 세션 객체 생성시간을 가져옴
out.println("최근 세션 생성 시각 : "+new Date(session.getCreationTime())+"<br>");
// 세션 객체에 가장 최근에 접근한 시간을 가져옴
out.println("최초 세션 접근 시각 : "+
new Date(session.getLastAccessedTime())+"<br>");
// getMaxInactiveInterval : 세션 유지 시간을 int 타입으로 반환
out.println("세션 유효 시간 : "+session.getMaxInactiveInterval()+"<br>");
// 최근에 생성된 세션인지 확인 (true)
// 한번 세션 생성 후에는 이 문장이 출력되지 않음
if(session.isNew()) {
out.print("새 세션이 만들어졌습니다.");
}
}
결과값
ajax
- ajax 로 데이터 보내기
- 데이터 전송 방식
- get 방식으로 쿼리파라미터 전달 : requestParam
- form : post 방식으로 쿼리파라미터 형식으로 메시지 바디에 보냄
- 보통 dto 등 담을 객체가 있다면 ModelAttribute 로 받아줌
- Formdata 는 파일과 함께 보낼때 주로 사용함 (Content-Type : multipart/form-data)
- http 메세지 바디로 보내기 : 주로 json
- @Requestparam : 쿼리파라미터 형식으로 올 때
- @RequestBody : 메시지 바디 형태로 올때. 주로 JSON. http 요청의 본문이 그대로 자바 객체로 변환되어 오는것.
'Spring' 카테고리의 다른 글
[Spring] SqlSession, 트랜잭션 (0) | 2022.10.04 |
---|---|
[Spring] 스코프, 필터 (0) | 2022.08.29 |
[Spring] 스프링과 서블릿, 바인딩 (0) | 2022.08.24 |
[Spring] servlet (0) | 2022.08.18 |
[Spring] 로그인, 스프링 시큐리티 (0) | 2022.08.18 |