SpringBoot | WebConfig 파일로 Spring MVC 설정

새니·2023년 7월 12일

SpringBoot

목록 보기
5/7
post-thumbnail

WebConfig 파일이란 ?

웹 구성에 대해 지정하는 내용이 담겨져 있는 설정 파일
WebMvcConfigurer 인터페이스를 구현한다.
설정에 필요한 메소드만 오버라이딩 한다. 주로 Resource Handler, Interceptor, view page 관련 설정을 여기서 한다. 설정에 관련된 클래스에는 @Configuration 어노테이션을 붙여야 한다



😊 가상의 로그인, 로그아웃 기능을 구현해보자!


[index]


 <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>
  • 인덱스 페이지에 로그인을 하는 링크, 로그인이 되었을때 링크, 로그아웃 링크를 만듬

[loginform]

<div class="container">
		<form action="login" method="post">
			<input type="text" name="id" placeholder="아이디입력..." />
			<button type="submit">로그인</button>
		</form>
	</div>

[LoginInterceptor]

//로그인된 사용자인지 검사할 인터셉터
@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;
	}

[usercontroller]

	@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";
	}
  • 로그인과 로그아웃을 하면 리다이렉트로 인덱스 페이지로 넘어가도록 구현.

[WebConfig]

@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은 인터셉터의 영향을 받지 않도록 설정.

  • 그림으로 표현하면 spring bean container에서 관리하는 interceptor를 autowired항여 주입하여 사용한다.


😊 결과

profile
새니의 뒤죽박죽 개발 일기📝

0개의 댓글