SpringFramework/BASIC

[session] 로그인,비로그인,회원,비회원 에 따른 UI 차이

유혁스쿨 2020. 9. 9. 22:27
728x90
반응형

세션을 통한 브라우저 권한 설정과 UI변경 유효성검증

 

컨트롤러에서

public String login (HttpSession session){
    session.setAttribute("login", user);
}

위와같이 "login"이라는 이름으로 user정보를 세션객체에 담는다면 로그인이 처리되도록 구현되어 있습니다.

 

 

로그인 유무에 따라 UI를 각각 다르게 보여주기 위해서

<c:if test="${login == null}" >
    <li>
        <a data-toggle="modal" data-target="#log-in">LOGIN</a>
    </li>
</c:if>
<c:if test="${login != null}" >
    <li>
        <a href="#">MYPAGE</a>
    </li>
    <li>
        <a href="/user/logout" onclick="return confirm('로그아웃 하시겠습니까?')">LOGOUT</a>
    </li>
</c:if>

c:if 코어태그립의 if문을 통해

<c:if test="${login != null}" >

받은 session객체가 비어있지 않다면 보여주도록 설정합니다.

${SessionScope.login != null}

이때에는 sessionScope를 굳이 쓰지않아도 됩니다.

[scope의 종류]
1. page
2. request
3. session
4. application

[영역이제일높은순서]
1. application - 서버 하나당 하나씩, 서버가중단되면 사라지는 데이터
2. session - 브라우저 하나당 하나씩, 브라우저가 중단되면 사라........
3. request - 하나의 요청당 하나씩. 요청이 끝나면 사라...
4. page - 하나의 페이지당 하나씩. 페이지를 닫으면 사라지는 데이터

 


만약 session영역과 application영역 두군대에 login이라는 같은이름의 데이터가 있다면 그때는 어디영역인지를 확실히 구분하여야합니다.

${sessionScope.login != null} 혹은 ${applicationScope.login != null}


하지만 4가지 영역중에 login이라는 데이터가 딱 한군대에만 들어있다면 영역Scope로 접근하는것을 생략해도 된다는 것입니다

${login != null}

 

<c:if test="${login != null}" >

c:if문을 활용하여 세션이 비어있는지 로그인 유무를 판별하고 UI 구성에 차이를 둘수 있게 되었습니다.

 


 

또, 만약 우리가 로그인이 되어있는 상태에서 게시글 내용을 볼때, 나의정보와 게시글의 정보가 일치하다면 수정할수 있도록 해줘야합니다.

           <c:if test="${로그인정보.id == 게시글정보.id}">

 

 동명이인이 있을수 잇기 때문에 아이디로 해야하며 sql에서 join구문을 사용하여  user테이블과 foreign키로 참조키를 연결해야 합니다.

아직... 한번도 구현해보지 못했기때문에... 이런식으로 처리한다 정도로만... 정리해놓겠습니다.

 

 


우리가 만약 회원만 게시글을 쓸수 있는 "회원 전용" 게시판에 게시글을 쓴다고 할 때 만일 로그인이 되어있지 않다면,

게시글을 작성할수 없도록 만들어야 합니다.

 

 

이때는 회원 컨트롤러가 아닌 게시판 컨트롤러에 세션을 통해 로그인이 되어있지 않았다면 메인화면으로 돌아가도록 구현해줘야 합니다. 

@GetMapping("/write")
	public String write(HttpSession session, RedirectAttributes ra) {
		if(session.getAttribute("login")==null) {//만약 로그인이 되어있지 않다면 메인 화면으로돌아가라
			ra.addFlashAttribute("msg","not-login");
			return "redirect:/";//home.jsp에 스크립트문 추가
		}
		System.out.println("URL : /board/write => GET ");
		return "board/write";
	}

또한 게시글쓰기뿐만아니라 게시글수정, 삭제에서도 동일한 작업을 처리해줘야 합니다.

비회원인 누군가가, 혹은 글을 작성하지 않은 다른 누군가가 주소창을 조작해서 글쓰기 폼 뿐만아니라 수정폼이나 삭제폼까지도 들어올수 있기 때문입니다.

 

 

메인으로 돌아감과 동시에

<script>
 const msg = "${msg}";
 if(msg === "not-login"){
	 alert("로그인이 필요한 서비스 입니다.");
 }
</script>

스크립트를 통해서 컨트롤러로부터 넘겨받은 메시지가 문자열로 존재한다면, 그 문자열이 컨트롤러 요청메서드에서 로그인이 되어있지 않을때 메인화면으로 돌아가도록할때 넘겨준 문자열과 같다면 "로그인이 필요한 서비스입니다." 라는 알림창을 띄워줍니다.

728x90
반응형