본문 바로가기
Spring

Spring #13 : 인터셉터(Interceptor) (230131)

by haheehee 2023. 1. 31.

- 브라우저 요청 시 요청 메서드 호출 전후에 개발자가 원하는 기능을 수행

- 필터와 기능이 유사, 필터보다 더 자유롭게 위치 변경 가능

- 쿠키(Cookie) 제어, 파일 업로드 등의 작업 수행

(이미지 출처 ; https://m.boostcourse.org/web326/lecture/59001)

method function
preHandle() 컨트롤러 실행 전 호출
postHandle() 컨트롤러 실행 후, DispatcherServlet이 뷰로 보내기 전 호출
afterCompletion() 뷰까지 수행하고 호출

 

 

 


인터셉터를 사용해 요청명에서 뷰 이름 얻기 실습 #1

회원관리, 게시판 관리 프로젝트에 적용해서 사용하면 된다.

( member 패키지 하위에 interceptor 패키지를 만든 후 ViewNameInterceptor 클래스를 작성)

 

인터셉터를 사용해 요청명에서 뷰 이름 얻기

package com.spring.promvn03.common.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class ViewNameInterceptor extends HandlerInterceptorAdapter {
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
		try {
			String viewName = getViewName(request);
			request.setAttribute("viewName", viewName);
		} catch(Exception e) {
			e.printStackTrace();
		}
		return true;
	}
	
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		
	}
	
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
		
	}
	
	private String getViewName(HttpServletRequest request) throws Exception {
		String contextPath = request.getContextPath();
		String uri = (String) request.getAttribute("javax.servlet.include.request_uri");
		if(uri == null || uri.trim().equals("")) {
			uri = request.getRequestURI();
		}
		int begin = 0;
		if(!((contextPath==null)||("".equals(contextPath)))) {
			begin = contextPath.length();
		}
		int end;
		if(uri.indexOf(";")!=-1) {
			end = uri.indexOf(";");
		} else if(uri.indexOf("?")!=-1) {
			end = uri.indexOf("?");
		} else {
			end = uri.length();
		}
		
		String fileName = uri.substring(begin, end);
		if(fileName.indexOf(".")!=-1) {
			fileName = fileName.substring(0, fileName.lastIndexOf("."));
		}
		if(fileName.lastIndexOf("/")!=-1) {
			fileName = fileName.substring(fileName.lastIndexOf("/", 1), fileName.length());
		}
		return fileName;
	}
}

ViewNameInterceptor.java

인터셉터 수행 시 preHandle() 메소드로 전달된 request에서 추가한 getViewName() 메서드를 이용해

뷰 이름을 가져온 후, request에 바인딩

getViewName() : 요청명에서 뷰 이름 반환

 

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xsi:schemaLocation="http://www.springframework.org/schema/mvc
	https://www.springframework.org/schema/mvc/spring-mvc.xsd
	http://www.springframework.org/schema/beans 
	https://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context 
	https://www.springframework.org/schema/context/spring-context.xsd"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://www.springframework.org/schema/mvc" >

...
	<mvc:interceptors>
		<mvc:interceptor>
			<mvc:mapping path="/*/*.do" />
			<beans:bean class="com.spring.promvn05.common.interceptor.ViewNameInterceptor" />
		</mvc:interceptor>
	</mvc:interceptors>
	
</beans:beans>

servlet-context.xml

 

 

 

 

 

댓글