4월 26일 完

SJY0000·2022년 4월 26일
0

Springboot

목록 보기
24/24

오늘 배운 것

  • 로그인 정보 저장
  • Interceptor

로그인 정보 저장

  • 로그인 시 session에 user이름으로 user정보 저장됨
  • session에 저장된 user정보가 있으면 user의 name정보를 model에 담아서 전송
    (모든 페이지에 user의 name정보가 전해진다는 얘기)
package com.myapp.bbs;

import javax.servlet.http.HttpSession;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ModelAttribute;

import com.myapp.bbs.model.User;

@ControllerAdvice
public class Common {

	@ModelAttribute
	public void sharedData(Model model, HttpSession session) {
		// session에 인증된 user가 있으면 user의 이름을 모든 페이지에 전달
		User user = (User) session.getAttribute("user");
		
		if (user != null) { // user가 있으면
			model.addAttribute("userName", user.getName());
		}
	}
}
  • aside에 user의 name정보의 유무에 따라 출력
      <li class="nav-item" th:if="${userName != null}"> 
        <a class="nav-link text-white" th:href="@{/login}">
          <div class="text-white text-center me-2 d-flex align-items-center justify-content-center">
            <i class="material-icons opacity-10">logout</i>
          </div>
          <span class="nav-link-text ms-1">로그아웃</span>
        </a>
      </li>
      <li class="nav-item" th:if="${userName == null}"> 
        <a class="nav-link text-white" th:href="@{/login}">
          <div class="text-white text-center me-2 d-flex align-items-center justify-content-center">
            <i class="material-icons opacity-10">login</i>
          </div>
          <span class="nav-link-text ms-1">로그인</span>
        </a>
      </li>
      <li class="nav-item" th:if="${userName == null}">
        <a class="nav-link text-white" th:href="@{/register}">
          <div class="text-white text-center me-2 d-flex align-items-center justify-content-center">
            <i class="material-icons opacity-10">assignment</i>
          </div>
          <span class="nav-link-text ms-1">가입하기</span>
        </a>
      </li>
  • nav에서 user의 name정보의 유무에 따라 출력
        <li class="nav-item d-flex align-items-center" th:if="${userName != null}">
          <form th:action="@{/logout}" method="get">
            <span th:text="${'😆 하이, ' +  userName }"></span>
            <button type="submit" class="badge bg-gradient-warning ms-3">로그아웃</button>
          </form>
        </li>
        <li class="nav-item d-flex align-items-center" th:if="${userName == null}">
          <a th:href="@{/login}" class="nav-link text-body font-weight-bold px-0">
            <i class="fa fa-user me-sm-1"></i>
            <span class="d-sm-inline d-none">로그인</span>
          </a>
        </li>

로그인을 하지 않았을 때

로그인을 했을 때

Interceptor

  • 클래스를 만든 후 HandlerInterceptor를 구현
  • return값이 true이면 통과, false면 통과X
  • Interceptor클래스를 만든 후 등록을 해줘야 Interceptor로써 기능을 함
package com.myapp.bbs.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.HandlerInterceptor;

import com.myapp.bbs.model.User;

// Interceptor 클래스를 만들고 HandlerInterceptor를 구현
// Login 한 후 계속해서 인증되었는지 확인한다.
public class LoginCheckInterceptor implements HandlerInterceptor {
	
	// preHandle 메소드 : Controller에 가기 전 Interceptor에서 Catch해서 작업 수행
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		HttpSession session = request.getSession(); // Session 불러오기
		User user = (User) session.getAttribute("user"); // User 타입으로 Cast
		
		if(user == null) { // Login이 안된 상태(인증이 안된 상태) => Login 페이지로 이동
			String url = session.getServletContext().getContextPath() + "/login";
			response.sendRedirect(url); // Login 페이지로 새로고침
			System.out.println("LoginInterceptor # preHandler() : 실패");
			return false;
		}
		System.out.println("LoginInterceptor # preHandler() : 통과");
		// 중요!!!! Interceptor 메소드에서 Return이 true면 통과, false면 차단
		return true;
	}
	
}
  • Interceptor 등록하기
package com.myapp.bbs;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import com.myapp.bbs.interceptor.LoginCheckInterceptor;

@Configuration
public class WebConfig implements WebMvcConfigurer {

	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// Interceptor를 추가하는 메소드
		registry.addInterceptor(new LoginCheckInterceptor()) // 생성한 Interceptor 추가
				.addPathPatterns("/board/**")						// Interceptor를 적용할 Controller 주소
				.excludePathPatterns("/board/list", "/board/get");						// Interceptro를 적용하지 않을 Controller 주소
	}
}

0개의 댓글