스프링부트+jsp로 배달사이트 만들기-21 인터셉터로 주소 불러오기

2021. 12. 10. 18:09스프링부트

현재 메인페이지에서 저장한 주소는 세션에 저장 되있는 값만 사용하기 때문에 세션시간이 지나거나 서버가 내려가면 저장된 주소가 사라지게 됩니다

인터셉터를 활용해 같이 저장했던 쿠키를 확인하고 쿠키에 주소정보가 있다면  그 값을 꺼내 사용할 수 있게 하겠습니다

 

인터셉터를 사용하기 위해 interceptor패키지를 만들고 AddressInterceptor 클래스를 생성합니다

public class AddressInterceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		HttpSession session = request.getSession();
		
		Map<String, String> addMap = (Map<String, String>)session.getAttribute("BMaddress");
		
		if(addMap == null) {
			Cookie[] cookies = request.getCookies();
			System.out.println(cookies.length);
			for (int i = 0; i < cookies.length; i++) {
				if(cookies[i].getName().equals("BMaddress")) {
					Gson gson = new Gson();
					addMap = gson.fromJson(URLDecoder.decode(cookies[i].getValue(), "UTF-8"), Map.class);
					session.setMaxInactiveInterval(3600 * 3);
					session.setAttribute("BMaddress", addMap);
				}
			}
		}
		return true;
	}
}

인터셉터를 사용하기 위해서는 HandlerInterceptor의 메서드를 구현해야 합니다

HandlerInterceptor의 메서드는 아래 3가지가 있습니다

  • preHandle()  특정 uri을 호출했을 때 uri에 매핑된 컨트롤러의 메서드를 실행 하기 전에 실행하고 return 값이 true면 컨트롤러의 메서드를 실행하고 false면 실행하지 않습니다
  • postHandle() 컨트롤러 메서드를 실행하고 화면으로 결과를 보여주기 전에 실행됩니다
  • afterCompletion() 화면을 보여주고 난 뒤 실행됩니다

컨트롤러 실행 전 주소가 있는지 없는지만 확인하면 되기 때문에 preHandel()만 구현하면 됩니다

 

구현한 인터셉터를 실행하기 위해 설정파일에 등록합니다

WebConfig에 아래에 추가합니다

@Bean
public AddressInterceptor addressInterceptor() {
    return new AddressInterceptor();
}

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(addressInterceptor())
    .addPathPatterns("/*");
}

AddressInterceptor을 bean으로 등록하고 

registry.addInterceptor()에 실행할 인터셉터를 addPathPatterns()에 실행할 uri를 적어주는데 모든 uri에 실행될 수 있게 설정했습니다