오늘은 쿠키와 세션에 대해 알아보기
세션
서버에 저장
로그인 등 보안이 중요한 곳에 사용
속도는 쿠키에 비해서 느림, 보안 높음
쿠키
브라우저에 저장
장바구니, 자동 로그인, 쇼핑 정보 등에 사용할 수 있음
속도는 세션에 비해서 빠름, 보안은 낮음
클라이언트에 총 300개의 쿠키를 저장할 수 있음
도메인당 20개만 가질 수 있음
쿠키의 크기는 4096byte(4KB) 까지 저장
브라우저 개발자 모드(F12) 의 Application 내에서 볼 수 있음
세션과 쿠키의 차이점
쿠키는 이름, 값, 유효시간, 도메인, 경로 등을 저장
쿠키는 자동으로 삭제가 되지 않고 유효시간 경과 혹은 직접 삭제해야만 삭제
로그인할 때 아이디 저장하는 쿠키 만들어보기
로그인 할 때 로그인하는 아이디 저장하는 버튼 만들기
<div class="text-start">
<input type="checkbox" id="saveID" class="saveID" />
<label for="saveID">아이디 저장</label>
</div>
스크립트에서 아이디 체크 시 쿠키 저장하기
if ($('#saveID').is(':checked')) {
setCookie('testCookie', id.value, 30);
}
setCookie 함수는 이렇게 되어있음
// 쿠키 저장하는 함수, 쿠키 이름, 값, 기한
function setCookie(cookieName, value, exdays) {
// 오늘 날짜 뽑기
let date = new Date();
alert(date); // Tue Mar 05 2024 10:38:56 GMT+0900 (한국 표준시)
alert("오늘 날짜 : " + date.getDate() + " / 30 더한 날짜 : " + date.getDate() + exdays);
// 오늘 날짜 : 5 / 30 더한 날짜 : 530 -> 오늘 날짜는 일자가 나옴, 30 더한 것은 문자열을 더한 것
alert(date.setDate(date.getDate() + exdays)); // 1712194969170
date.setDate(date.getDate() + exdays);
document.cookie = cookieName + "=" + escape(value) + "; expires=" + date.toUTCString(); // 쿠키 저장하기
// 쿠키 이름=쿠키에 저장될 내용; 쿠키 유효시간=정규시간
// escape() : 아스키 문자에 해당하지 않는 문자들은 모두 유니코드 형식으로 변환
}
쿠키를 가져와 인풋창에 넣어주기
getCookie 메소드 생성
// 쿠키 가져오기
function getCookie(cookieName){
let x;
let y;
let val = document.cookie.split(';');
alert("가져운 쿠키값 : " + val);
for(let i = 0; i < val.length; i++) {
x = val[i].substr(0, val[i].indexOf('=')); // 저장한 쿠키 이름
y = val[i].substr(val[i].indexOf('=') + 1); // 쿠키 내용
x = x.replace(/^\s+|\s+$/g, ''); // 앞뒤 공백 제거하기
if (x == cookieName) {
return y;
}
}
}
for 문으로 저장된 쿠키를 가져와 쿠키 이름과 쿠키 내용을 저장된 값 마다 비교
입력이 들어온 쿠키 이름과 저장된 쿠키 이름이 같으면 해당 쿠키 값을 리턴
쿠키를 가져와서 해당 값을 id 쪽에 넣어주기
$(function() {
// cookie 가져오기
let getId = getCookie('userInputId');
let cookieYN = getCookie('setCookieYN');
if (cookieYN == 'Y') {
$('#id').val(getId); // 쿠키에서 뽑은 값 넣어주기
$('#saveID').prop('checked', 'true');
}
아이디 저장을 체크하지 않았을 때 쿠키 삭제하기
if ($('#saveID').is(':checked')) {
setCookie('userInputId', id.value, 30);
setCookie('setCookieYN', 'Y', 30);
} else {
// 사용자가 ID 저장을 누르지 않으면 저장하지 않음
delCookie('userInputId');
delCookie('setCookieYN');
}
delCookie() 생성하기
// 쿠키 삭제하기
function delCookie(cookieName) {
let date = new Date();
date.setDate(date.getDate() - 1); // 날짜가 하루 지난것으로 설정
document.cookie = cookieName + "=; expires" + date.toUTCString();
// 쿠키의 유효기간이 오늘 날짜보다 작아 쿠키 유효기간이 끝남
document.cookie = cookieName + "=; max-age=0"; // 이렇게도 가능
}
게시글 detail 만들기
게시글 제목 클릭 시 새 창으로 열리게 하기
<td><a href="./detail?no=${list.board_no }" target="_blank">${list.board_title }</a>
AdminController 에 detail 생성
@GetMapping("/detail")
public String detail(Model model, @RequestParam(value = "no", defaultValue = "-1", required = true) String no) {
// HttpServletRequest 로 기존에 배웠던 request.getParameter 사용 가능
// String no 로 변수 이름과 일치하는 파라미터 값 조회 가능
int reNo = util.str2Int(no);
if (reNo != -1) {
BoardDTO boardDTO = adminService.detail(reNo);
model.addAttribute("detail", boardDTO);
return "admin/detail";
} else {
return "redirect:/error"; // controller 에 있는 error 매핑을 실행
}
}
Service, Repositody 와 Mapper 설정
public BoardDTO detail(int reNo) {
return adminRepository.detail(reNo);
}
public BoardDTO detail(int no) {
return sqlSession.selectOne("admin.detail", no);
}
<select id="detail" parameterType="Integer" resultType="boardDTO">
select board_no, board_title, board_content,
(select mid from member where mno=board.mno) as mid,
(select mname from member where mno=board.mno) as mname,
board_date, board_ip,
(select count(0) from visitview where board_no = #{no}) as board_count,
(select COUNT(*) from comment where board_no = #{no}) as comment
from board where board_no=#{no}
</select>
기존 admin 의 index.jsp 와 전 detail.jsp 를 복사해서 만들기
<div class="container-fluid">
<div>
<h1 class="d-inline h3 mb-4 text-gray-800">자세히 보기</h1>
</div>
<div class="d-flex justify-content-center align-items-center">
<div class="row text-center">
<div class="btitle text-start fs-3">${detail.board_title }</div>
<hr>
<div class="detailInfo">
<span class="mname">${detail.mname }</span>
<span class="bcount">${detail.board_count }</span>
</div>
<div class="detailInfo">
<span class="bdate text-start">${detail.board_date }</span>
<span class="bdate text-start">${detail.board_ip }</span>
</div>
<hr>
<div class="bcontent text-start">${detail.board_content }</div>
</div>
<div class="buttonList">
<button class="btn btn-outline-dark" onclick="location.href='./boardList'">/board</button>
<button class="btn btn-outline-dark" onclick="history.back()">back</button>
<button class="btn btn-outline-dark" onclick="history.go(-1)">go(-1)</button>
</div>
<hr id="commentHr">
</div>
</div>
'Spring' 카테고리의 다른 글
240307 스프링 부트 (0) | 2024.03.07 |
---|---|
240306 스프링 부트 (1) | 2024.03.06 |
240304 스프링 프로젝트 (3) | 2024.03.04 |
240229 스프링 프로젝트 (0) | 2024.02.29 |
240228 스프링 프로젝트 (2) | 2024.02.28 |