
WebConfig 파일이란 ?
웹 구성에 대해 지정하는 내용이 담겨져 있는 설정 파일
WebMvcConfigurer 인터페이스를 구현한다.
설정에 필요한 메소드만 오버라이딩 한다. 주로 Resource Handler, Interceptor, view page 관련 설정을 여기서 한다. 설정에 관련된 클래스에는 @Configuration 어노테이션을 붙여야 한다
<div class="container">
<c:choose>
<c:when test="${empty sessionScope.id}">
<a href="${pageContext.request.contextPath }/users/loginform">로그인</a>
</c:when>
<c:otherwise>
<a href="${pageContext.request.contextPath }/users/info">${id }</a>
님 로그인 중...
<a href="${pageContext.request.contextPath }/users/logout">로그아웃</a>
</c:otherwise>
</c:choose>
<h1>인덱스 페이지</h1>
</div>
<div class="container">
<form action="login" method="post">
<input type="text" name="id" placeholder="아이디입력..." />
<button type="submit">로그인</button>
</form>
</div>
//로그인된 사용자인지 검사할 인터셉터
@Component //로그인 인터셉터르르 빈으로 만들기 위해서 붙이는 어노테이션
public class LoginInterceptor implements HandlerInterceptor{
//Controller 메소드 수행직전에 로그인된 사용자 인지 검증을 해서
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//세션 객체의 참조값을 얻어와서
HttpSession session=request.getSession();
String id=(String)session.getAttribute("id");
//만일 로그인을 하지 않았다면
if(id == null) {
//로그인 페이지로 리다일렉트 이동 시키고 false 를 리턴한다.
//원래 가려던 url 정보 읽어오기
String url=request.getRequestURI();
//GET 방식 전송 파라미터를 query 문자열로 읽어오기 ( a=xxx&b=xxx&c=xxx )
String query=request.getQueryString();
//특수 문자는 인코딩을 해야한다.
String encodedUrl=null;
if(query==null) {//전송 파라미터가 없다면
encodedUrl=URLEncoder.encode(url);
}else {
// 원래 목적지가 /test/xxx.jsp 라고 가정하면 아래와 같은 형식의 문자열을 만든다.
// "/test/xxx.jsp?a=xxx&b=xxx ..."
encodedUrl=URLEncoder.encode(url+"?"+query);
}
//3. 로그인을 하지 않았다면 /users/loginform.do 페이지로 리다일렉트 이동 시킨다. (HttpServletResponse)
String cPath=request.getContextPath();
response.sendRedirect(cPath+"/users/loginform?url="+encodedUrl);
return false;
}
//로그인을 했다면 흐름을 이어간다.
return true;
}
@GetMapping("/users/logout")
public String logout(HttpSession session) {
//로그아웃 처리
session.invalidate();
return "redirect:/";
}
@PostMapping("/users/login")
public String login(HttpSession session, String id) {
//가상의 로그인 처리를 한다.
//session.invalidate(); //초기화 후에 세션에 정보를 담을 수 없다.
//페이지를 이동하더라도 임의로 지우지 않는 이상 session이 유지되는 동안에는 계쏙 남아 있다 (대부분 로그인정보를 session에 담는다)
//
session.setAttribute("id", id);
return "redirect:/";
}
@GetMapping("/users/loginform")
public String loginform() {
return "users/loginform";
}
@Configuration
public class WebConfig implements WebMvcConfigurer{
//LoginIntercpertor DI
@Autowired LoginInterceptor loginInter;
//Interceptor를 추가할때 오버라이드 하는 메소드
@Override
public void addInterceptors(InterceptorRegistry registry) {
//메소드의 인자로 전달되는 InterceptorRegistry 객체를 이용해서 Interceptor 를 등록하면 된다.
registry.addInterceptor(loginInter)
.addPathPatterns("/users*")
.excludePathPatterns("/users/loginform") //login과 loginform은 배제하겠다!?
.excludePathPatterns("/users/login");
}
registry.addInterceptor(loginInter)를 사용하여 loginInter를 등록addPathPatterns 메소드를 사용하여 인터셉터가 적용될 URL 패턴을 지정excludePathPatterns 메소드를 사용하여 인터셉터가 적용되지 않을 때의 url 등록따라서, /users* URL 패턴에 인터셉터를 적용하되,/users/loginform과 /users/login URL은 인터셉터의 영향을 받지 않도록 설정.



