▶[서론]
○● 0228 새로웠던 것
1. 스프링에서 세션 내용 지울 때 session.invalidate();
session.invalidate()을 지우면(없으면) 세션에 저장된 모든 데이터가 삭제되지 않습니다.
기본적으로 세션은 클라이언트가 로그아웃을 요청하거나 세션이 만료될 때까지 유지됩니다. session.invalidate()는 현재 사용자 세션을 무효화하여 세션에 저장된 모든 데이터를 제거합니다.
session.invalidate()를 삭제하면 사용자가 로그아웃할 때 세션 데이터가 삭제되지 않으므로, 사용자가 로그인 상태를 유지한 채로 계속 서비스를 이용할 수 있게 됩니다.
따라서 로그아웃 기능이 정상적으로 작동하려면 session.invalidate()를 유지해야 합니다.
2. 스프링에서 세션 내용 지울 때 status.setComplete();
status.setComplete()를 지우면(없으면) @SessionAttributes에 지정된 속성이나 모델에 추가된 세션 속성이 제거되지 않습니다.
일반적으로 Spring MVC에서는 컨트롤러 메서드가 종료될 때 SessionStatus의 setComplete() 메서드를 호출하여 세션에 저장된 데이터를 비웁니다. 이것은 주로 폼 처리 후에 세션에 남아 있는 데이터를 제거하여 사용자가 새로운 요청을 할 때 이전 요청의 데이터가 남지 않도록 하는 데 사용됩니다.
따라서 status.setComplete()를 지우면 해당 컨트롤러 메서드가 종료될 때 세션 데이터가 자동으로 비워지지 않게 됩니다. 이는 사용자가 다음 요청에서 이전 요청의 데이터를 여전히 볼 수 있게 됩니다.
▶[본론]
○● 0228 내용 정리
● 스프링
○○○●●● 컨트롤러-매개변수-일반객체
컨트롤러에 이런 데이터를 ?id=cat&pw=dog 전송 했을때
이 데이터들을 담는 그릇 클래스를 매개변수에 쓰면 스프링에서 그릇 클래스 객체를 생성하고 값을 멤버에 다 넣어줌
ex. @RequestMapping("/reg")
public void reg(MemberVO m) { << MemberVO 의 id , pw 변수에 cat 값과 dog 값을 알아서 넣어줌
} MemberVO 는 이렇게 선언되있음
@Data
public class MemberVO {
private String id;
private String pw;
}
그 다음 함수 실행을 마치고
reg.jsp 페이지로 이동하는데
reg.jsp 페이지에서 다시 id 와 pw 값을 써야하는 경우가 있을 수 있음
이 때 id, pw 값을 쓰기위해 모델에 또 실어 보내야하는데
스프링에서 MemberVO 객체를 다음 페이지 reg.jsp 에 자동으로 보내줌. << 이 기능 설명하려고 길게 말한거
단, 이 데이터를 받을 때 이렇게 해야됨.
reg.jsp
id: ${memberVO.id} << 클래스 명인 MemberVO 에서 맨 앞 대문자를 소문자로 바꿔서 쓰면 됨.
<hr> ( el 기준으로 설명 )
pw: ${memberVO.pw} << 그렇게 하면 이전에 컨트롤러에 넘어왔던 값을 여기서 그대로 쓸 수 있게 됨
○○○●●● 봄에서 세션 사용법
참고사이트:
https://m.blog.naver.com/moe61/150169887527
첫번째 방법:
컨트롤러의 매핑 함수에 매개변수로 HttpSession x 선언하면 봄이 알아서 세션 객체 넣어줌
ex. @GetMapping("/aaa")
public void sessionExample(HttpSession session) {
session.setAttribute("cat","고양이"); << 쓰면 됨. 끝.
}
두번째 방법:
컨트롤러 상단에 @SessionAttributes("x") 선언하고
모델에 같은 키 ( 여기선 x ) 로 값을 넣으면 봄이 세션에도 같은 키로 모델에 넣은 값을 동시에 넣어준다.
ex. @SessionAttributes("x") << 1. 이 어노테이션을 붙이고
@Controller
public class BoardController {
@GetMapping("/a")
public void a(HttpSession s, Model m) {
s.setAttribute("a", "개");
<< 2. 모델에 x 키로 고양이 저장. ( 세션에도 x 키로 고양이가 저장됨 )
m.addAttribute("x","고양이");
}
단, 위 방법 시 세션 삭제할때 아래 사항을 주의해야됨.
@SessionAttributes는 모델(Model)에 추가된 데이터 중에서 세션에 저장할 데이터를 지정하는 것입니다. @SessionAttributes("id")는 모델(Model)에 "id"라는 이름으로 추가된 데이터를 세션에 저장하도록 지정한 것입니다.
따라서, 세션에서 "id" 속성을 삭제하기 위해서는 모델(Model)에서 "id" 속성을 삭제해야 합니다.
따라서, 로그아웃 처리를 다음과 같이 수정해야 합니다.
@GetMapping("/logout")
public String logout(HttpSession session, SessionStatus status) {
session.invalidate();
// 모델쪽에서도 이 함수로 지워야 함
status.setComplete(); // Model에 있는 SessionAttributes를 제거
return "redirect:/ef/main";
}
위 코드에서 SessionStatus는 세션에 저장된 모델(Model) 데이터를 제거하기 위한 클래스입니다. setComplete() 메서드를 호출하면 모델(Model)에서 @SessionAttributes로 지정된 데이터가 삭제됩니다.
따라서, 위 코드에서 status.setComplete() 메서드를 호출함으로써 세션과 모델(Model)에서 모두 "id" 속성이 삭제되며, 로그아웃 처리가 완료됩니다.
참고. 여러 값을 세션에 지정 여러개의 키를 세션에 저장하고 싶다면 @SessionAttributes의 "키" 들을 { }로 묶어준다.
@SessionAttributes({"id", "name", "age"})
세션이 특정 페이지에서 안될 때
<%@ page session="false" %> << 이 태그가 있어서 안된 케이스 있었음. 주의.
자동생성된 home.jsp 에 상단에 이게 써있음. 그래서 세션 안될 것임.
true로 바꾸거나. 지우면 디폴트가 true임.
ex. 로그인 / 로그아웃 처리예제
home.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 0. 웹 애플리케이션의 루트 경로(컨텍스트 경로) 를 가져와서 링크에 다 연결해줘야 함 -->
<!-- 1. 0을 위한 준비. jstl core 태그 선언 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 2. 0을 위한 준비. el 태그로 가져올 수 있는데 이걸 더 짧게 찍기위해 변수 대입함. -->
<c:set var="cp" value="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
</head>
<body>
<h1>
Hello world!
</h1>
<P> The time on the server is ${serverTime}. </P>
<a href="test/dog">cat링크</a>
<a href="test/updateVisitantCount">updateVisitantCount</a>
<a href="test/insertDoodle">insertDoodle링크</a>
<a href="test/delTest">delTest</a>
<a href="${cp}/guest/getList">방명록</a>
<a href="${cp}/guest/test">test!</a>
<a href="${cp}/guest/testapi">test api</a>
<hr>
<a href="${cp}/member/reg?id=cat&pw=dog">test reg</a>
<hr>
<a href="${cp}/member/login">로그인</a>
<a href="${cp}/member/logout">로그아웃</a>
<a href="${cp}/member/reg">회원가입</a>
id:${id} , pw:${pw}
</body>
</html>
login.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 0. 웹 애플리케이션의 루트 경로(컨텍스트 경로) 를 가져와서 링크에 다 연결해줘야 함 -->
<!-- 1. 0을 위한 준비. jstl core 태그 선언 -->
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<!-- 2. 0을 위한 준비. el 태그로 가져올 수 있는데 이걸 더 짧게 찍기위해 변수 대입함. -->
<c:set var="cp" value="${pageContext.request.contextPath}" />
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="${cp}/member/loginProc">
<input name="id" placeholder="로그인 아이디">
<input name="pw" placeholder="로그인 암호">
<input type="submit" value="로그인">
</form>
</body>
</html>
MemberController.java
package com.peisia.spring.yy.controller;
import javax.servlet.http.HttpSession;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import com.peisia.spring.yy.vo.MemberVO;
import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;
@Log4j
@RequestMapping("/member/*")
@AllArgsConstructor
@Controller
public class MemberController {
@RequestMapping("/reg")
public void reg() {
System.out.println("==== 회원가입 페이지 진입");
}
@RequestMapping("/regProc")
public void regProc(MemberVO m, Model model) {
//todo
log.info("====================");
System.out.println("==== id:"+m.getId());
System.out.println("==== pw:"+m.getPw());
}
@RequestMapping("/login")
public void login() {
}
@RequestMapping("/loginProc")
public String loginProc(HttpSession s,
@RequestParam("id") String id, @RequestParam("pw") String pw) {
log.info("==== id:"+id);
log.info("==== pw:"+pw);
s.setAttribute("id", id);
s.setAttribute("pw", pw);
return "redirect:/";
}
@RequestMapping("/logout")
public String loginProc(HttpSession s) {
s.invalidate();
return "redirect:/";
}
}
▶[결론]
* 스프링 기초 강의 수강
*작업파일
● 0228
1) 스프링 기초
'개발 회고' 카테고리의 다른 글
[솔데스크] 풀스택 과정 14주-2 총59회차 ‘회고’ | JSON(0305) (1) | 2024.03.06 |
---|---|
[솔데스크] 풀스택 과정 13주-4 총58회차 ‘회고’ | JSON(0229) (0) | 2024.03.05 |
[솔데스크] 풀스택 과정 13주-2 총56회차 ‘회고’ | 스프링(0227) (3) | 2024.03.05 |
[솔데스크] 풀스택 과정 13주-1 총55회차 ‘회고’ | 스프링(0226) (1) | 2024.02.26 |
[솔데스크] 풀스택 과정 12주-5 총54회차 ‘회고’ | 스프링(0223) (1) | 2024.02.23 |