1216 | 스프링의 정석 :: 2-25 (게시판 내 로그인 연동-세션&쿠키&request)
세션과 쿠키 ✔ board게시판 연결하기 1. boardController.jsp만들기 2. boardController.class만들기 3. 기본 뼈대 + 맵핑 @Controller @RequestMapping("/board")// 보드랑 연결 public class BoardController { @GetMapping("/list")// 리
ala-nueva.tistory.com
▲ 이어지는 실습
실습 2. 게시판 → 로그인 → 홈이 아닌 게시판이 그대로 뜨도록 작업하기
✔ 목표
: 로그인 했을때 홈으로 돌아가는것보단 해당 화면(게시판)이 다시 뜨는게좋음.
✔ 해야할 일
: 각 부분의 from-to를 확인할 것
boardController.java | - from : /ch2/ // request.getHeader("referer") 로 알아낼수있다 - to : /board/list // request.getRequestURL()으로 알아낼수있다 |
loginForm.jsp | - from : /board/list 여야 하지만 Redirect라서 /ch2/가 나온다 - to : / login/login (get방식) |
LoginController.java | - from : login/login - to : /login/login (post방식) |
- loginForm에게 /board/list 의 URL/URI를 전달해서 거기서 loginContoller에게 재전달해야 게시판으로 로그인 가능 - boardController.java는 /board/list의 url을 알고 있음 |
1. BoardController에서 URL값을 얻는다
@GetMapping("/list")
public String list(HttpServletRequest request) { // request 추가
if(!loginCheck(request))
return "redirect:/login/login?toURL="+request.getRequestURL(); //getRequesURL으로 /board/list를 붙여서 반환.
// 로그인화면에게 겟방식으로 데이터를 넘긴다
👉 redirect:/login/login에 toURL을 붙여서 가려고 하는 /board/list를 얻는다.
2. loginForm.jsp에 인포 필드를 만든다
<input type="text" name="id" value="${cookie.id.value}" placeholder="이메일 입력" autofocus>
<input type="password" name="pwd" placeholder="비밀번호">
<input type="hidden" name="toURL" value="${param.toURL}"> // 타입을 text로 만들어서 끌려오는지 확인 후 hidden으로 바꾼다
<button>로그인</button>
3. LoginController에서 값을 받아 board/list로 리다이렉트 하게 만든다
@PostMapping("/login")
public String login(String id, String pwd, String toURL, boolean rememberId,HttpServletRequest request, HttpServletResponse response)throws Exception{
// 매개변수에 toURL추가
//1. id와 pw를 확인
//2-1 일치 하지 않으면 loginForm으로 이동
//2-2. id와 PW가 일치하면
// 세션 객체 얻어오기
// 세션 객체에 아이디를 저장
// 쿠키를 생성하고
// 응답에 저장
// 홈으로 이동 (지역변수에 들어오는 URL값에 따라 홈으로 갈 수도 있고 보드게시판으로 갈 수도 있다)
toURL= toURL==null || toURL.equals("")? "/" : toURL; // toURL값이 널이거나, 내용이 없으면 홈으로 이동, 아니면 toURL로 이동
return "redirect:"+ toURL; //String에 대한 반환값
}
👉 리턴값에 toURL을 추가시켜준다
실습3. 세션이 가동되는 범위 설정하기. session = "true" or session="false"?
✔목표
: 세션이 가동되는 범위를 설정해서 서버의 부담을 덜도록 한다
✔ 해야할 일
: 세션이 필요한 구역 확인
👉 index.jsp & loginForm.jsp에 <%@ page session = "false" %> 를 넣는다.
세션을 시작할까?에 대한 답! | 세션이 있을때 | 세션이 없을때 |
session = "true" | 세션을 만들지 않음 | 세션 생성 |
session = "false" 1. 세션이 필요없는 .jsp화면에 적용한다 2. 기존 세션에 영향을 미치지 않는다 |
세션 생성하지 않음 | |
* 이미 세션이 시작된 뒤에는 session = false라고 연결된 세션이 끊어지는게 아니다. 단지 새로운 세션을 만들지 않는다는 뜻 |
✔ session="false" 설정시 유의해야 할 점
: sessionScope와 pageContext.session은 사용 불가.
: sessionScope.id를 ▶ pageContext.request.getSession(false).getAttribute("id")로 변경해야 함
: STS에서 에러라고 표시해도 무시하면 됨
[참고]getSession(true)는 session이 없는 경우 session을 새로 생성하기 때문에, session이 없어도 새로 생성하지 않도록 getSession(false)를 사용
👉 홈을 눌러도 쿠키가 생기지 않는다.
👉 게시판 클릭시 로그인 화면으로 이동하면서 세션 생성+ 쿠키생성준비
❓여기서 문제
로그인/아웃을 표시하는 코드는 이렇게 session.scope를 사용하는데,
<c:set var="LoginOutLink" value="${sessionScope.id==null ? '/login/login':'/login/logout'}"/>
<c:set var="LoginOut" value="${sessionScope.id==null? 'Login':'Logout'}"/>
session=false를 사용함으로써 sessionScope를 쓰지 못해서 계속 로그인으로만 표시된다. (즉 쿠키가 로그인 후에나 생기므로 같은 브라우저에서 로그인했다는 기록이 남지 않아서 변동이 안되는듯?
이런 경우는 어떻게 하지? 뒷 강의에서 나오나 보고 고민을 해봐야겠다.
❓ SessionScope란 무엇인가
✔ 정의
: 웹브라우저별로 관리하는 변수범위
: 각 브라우저가 접속했을시 관리되는 변수범위
✔ 사용이유
: 접속한 웹 브라우저별로 정보를 관리하고 싶을 때
👉 장바구니처럼 사용자별로 유지가 되어야 할 정보가 있을 때 사용
✔ 특징
: 웹 브라우저별로 변수 관리
👉 웹브라우저의 탭간에는 세션정보가 공유되기 때문에, 각각의 탭에서는 같은 세션정보를 사용한다.
: HttpSession 인터페이스를 구현한 객체 사용
: 서블릿에서는 HttpSession session = request.getSession(); 메소드로 객체를 얻는다
: JSP 에서는 session 내장변수 사용
: 값저장 setAttribute(), 값읽기 getAttribute()
참고한 블로그
Session Scope에 대해
Session Scope 사용이유: 접속한 웹 브라우저별로 정보를 관리 하고 싶을 때 세션 scope를 사용합니다. 이번 시간엔 이러한 세션 스코프에 대해서 좀 더 자세히 알아보도록 하겠습니다. 정의: session sco
beoks.tistory.com
'🔥 Vamos > Spring' 카테고리의 다른 글
1219 | 스프링의 정석 :: 2-28 (@ResponseStatus) (0) | 2022.12.20 |
---|---|
1218 | 스프링의 정석 :: 2-27 (예외처리) (0) | 2022.12.18 |
1216 | 스프링의 정석 :: 2-25 (게시판 내 로그인 연동-세션&쿠키&request) (0) | 2022.12.16 |
1215 | 스프링의 정석 :: 2-24 (세션) (0) | 2022.12.16 |
1214 | 스프링의 정석 :: 2-23 (쿠키) (0) | 2022.12.14 |