비연결 프로토콜
웹 서비스는 HTTP 프로토콜을 기반으로 하며 요청에 응답한 후 연결을 끊습니다.
즉, 인증되지 않은 사용자는 모든 페이지에서 인증 절차를 거쳐야 합니다.
이러한 불편함 때문에 세션과 쿠키를 영구 인증 방식으로 사용합니다.
봄 세션
Spring MVC에서 세션을 사용하는 방법
1. HttpServletRequest 사용
2. HttpSession 사용
세션의 주요 기능을 살펴보겠습니다.
인터셉터
다음은 인터셉터를 설정하고 클래스를 선언하는 코드입니다.
먼저 기본 패키지 아래의 util 패키지에서 핸들러를 선언합니다.
UserAuthHandler.java
package com.simple.basic.util;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.HandlerInterceptor;
public class UserAuthHandler implements HandlerInterceptor{
/*
* 1. HandlerInterceptor를 implements 받습니다.
* postHandler - 컨트롤러 수행 후에 실행
* preHandler - 컨트롤러 수행 전에 실행
* aftercompletion - 화면으로 가기 직전에 수행
*
* 2. 인터셉터 클래스를 bean으로 등록
*
*
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("인터셉터 실행");
//현재 세션을 얻음
HttpSession session= request.getSession();
String user_id = (String)session.getAttribute("user_id");
if(user_id == null) { //로그인이 안됨
response.sendRedirect(request.getContextPath() + "/user/login"); //로그인 페이지로 리디렉션
return false; //컨트롤러를 실행하지 않음
}
return true; // 컨트롤러 그대로 실행
}
}
그리고 이 인터셉터를 사용하기 위해 빈에 주입합니다.
구성 패키지의 WebConfig 클래스
package com.simple.basic.config;
import java.util.Arrays;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.simple.basic.controller.HomeController;
import com.simple.basic.util.UserAuthHandler;
import com.simple.basic.util.UserSuccesHandler;
@Configuration //개별적인 스프링 빈 설정 파일
public class WebConfig implements WebMvcConfigurer{
// //빈들을 확인할 수 있는 IOC컨테이너(스프링 컨테이너)
// @Autowired
// ApplicationContext applicationContext;
//
// @Value("${server.port}")//어플리케이션 프로퍼티 변수 명
// String port;
//
//
// @Bean //실행하게 됨
// public void test() {
// TestBean t=applicationContext.getBean(TestBean.class);
//
//
// HomeController h=applicationContext.getBean(HomeController.class);
// System.out.println(h);
//
// int result = applicationContext.getBeanDefinitionCount();
// System.out.println(result);
// }
//
// @Bean
// public TestBean testBean() {
//
// return new TestBean(); //빈으로 등록
// }
@Bean
public UserAuthHandler userAuthHandler() {
return new UserAuthHandler();
}
@Bean
public UserSuccesHandler userSuccessHandler() {
return new UserSuccesHandler();
}
//WebMvcConfigurer 클래스가 제공해주는 인터셉터 추가 함수
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(userAuthHandler())
//.addPathPatterns(Arrays.asList("경로","경로","경로","경로"))
.addPathPatterns("/user/*") //패스경로포함
.excludePathPatterns("/user/login"); //패스경로제외
registry.addInterceptor(userSuccessHandler())
.addPathPatterns("/user/*");
//경로별로 인터셉터를 다르게 등록
//registry.addInterceptor(null)
}
}
이렇게 하면 간단한 인터셉터를 실행하여 알 수 있습니다.
참고) 전체 경로 지정 시 /*는 /aaa /bbb 형식만 인식 가능합니다.
/**는 /aaa/bbb 형식을 인식할 수 있으므로 전체 경로를 지정할 때 /**를 사용하는 것이 좋습니다.