참고 URL : https://springsource.tistory.com/4
참고 URL : https://okky.kr/article/238672
* 모든 요청의 처리전, 처리후에 대한 데이터를 가공 하기위헤 설정
* 스프링 버전이 3.2 미만 버전은 경로에 대한 예외처리(<mvc:exclude-mapping path=""/>)는 지원해 주지 않아서, preHandle 또는 postHandle 에서 직접 진행하여야 함
인터셉터를 설정하기 위해서 스프링 xml 설정 파일들을 모아놓은 폴더에 interceptor-context.xml 생성
* <mvc:mapping path="/" /> 인터셉터설정을 적용할 URI 를 매핑,
ex) <mvc:mapping path="/board/"/> 식으로 해당 board가 포함된 URI에 대해서는 모두 실행
* <mvc:exclude-mapping path="/test/"/> 인터셉터를 적용하지 않을 예외 URI 설정
ex) xxx.com/test/test.do 의경우에는 예외 URI 가 포함되어 있으므로 인터셉터가 작동하지 않음
* <bean class="securus.common.interceptor.CommonInterceptor"/> 생성한 인터셉터 클래스의 경로,
인터셉터를 처리할 코드를 작성한 클래스의 위치를 설정
================================================================================================================================================
<?xml version=”1.0” encoding=”UTF-8”?>
================================================================================================================================================
상단의 interceptor-context.xml 파일에서 <bean class="securus.common.interceptor.CommonInterceptor"/> 로 기재한 경로에 파일 생성
* postHandle 메소드는 후처리 메소드로, 컨트롤러에 갔다 온 후에 가공할 내용을 기재
* preHandle 메소드는 전처리 메소드로, 컨트롤러에 들어가기 전에 가공할 메소드를 기재,
해당 메소드의 리턴값은 boolean 으로 false 일 경우 그뒤에 실행되는 컨트롤러, postHandle 의 메소드는 실행되지 않음,
리턴값이 true 의경우 그 뒤에 실행해야 할 컨트롤러 postHandle 등의 메소드들이 실행됨.
* perHandle 에서 리턴값을 false 로 줄 경우엔 그뒤에 실행되야 할 메소드들이 전부다 실행되지 않고 멈춰버리므로, 이동할 페이지에 대해 명시해야함
하단의 예제는 false일 경우 main.do 페이지로 돌아가도록 설정
ex)
response.sendRedirect("/main.do");
return false;
================================================================================================================================================
package securus.common.interceptor;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
/**
public class CommonInterceptor extends HandlerInterceptorAdapter {
private static final org.slf4j.Logger Logger = LoggerFactory.getLogger(CommonInterceptor.class);
//후처리
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav)throws Exception{
Logger.info("후처리 ");
System.out.println("후처리");
}
//전처리
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
Logger.info("전처리~");
System.out.println("전처리");
boolean returnBoolean =true;
if(returnBoolean==false){
try{
response.sendRedirect("/main.do");
}catch (Exception e){
}finally {
}
}
return returnBoolean;
}
}
================================================================================================================================================
##################################################################################################################
##################################################################################################################
ex)
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class SampleInterceptor extends HandlerInterceptorAdapter{
}
* preHandle 메소드
컨트롤러가 실행 되기 전에 호출, 컨트롤러 실행 이전에 처리해야할 정보들이 있을때 사용
리턴타입이 boolean 이며, false 를 리턴할 경우 남은 컨트롤러의 작동과 postHandle 메소드를 실행하지 않음.
* postHandle 메소드
컨트롤러 실행 후에 호출, 해당 메소드는 컨트롤러에서 전달하는 ModelAndView 타입의 객체 정보가 전달되서 로그를 남기거나 수정할수 있음.
* afterCompletion 메소드
모든 뷰에서 최종 결과를 생성하는 일을 포함한 모든 작업이 모두 완료된 후에 실행됨
* 핸들러인터셉터는 하나이상 등록하여 사용 할 수 있으며, 인터셉터가 등록된 순서대로 실행됨,
postHandle , afterCompletion 메소드는 preHandle 의 실생순서와 반대로 실행됨
//전처리
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
}
//후처리
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav)throws Exception{
}
* 하단의 방법으로 사용, 상황에 맞게 사용하면 됨
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/mng_home/community/**"/>
<mvc:exclude-mapping path="/login/**"/>
<bean class="interceptorTest.SampleInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
또는
<interceptors>
<interceptor>
<mapping path="/**"/>
<exclude-mapping path="/login/**"/>
<beans:bean class="interceptorTest.InterceptorTest"/>
</interceptor>
</interceptors>
* <mvc:interceptors> </mvc:interceptors> , <interceptors> </interceptors>
생성한 인터셉터들을 선언하는곳,
* <mvc:interceptor> </mvc:interceptor> , <interceptor> </interceptor>
인터셉터들의 설정 및 경로를 선언
* <mvc:mapping path=""> , <mapping path="/**"/>
인터셉터할 URL 맵핑 /login/login.do 등으로 URL 을 전부 적어도 되고, /board/** 등으로 하위경로에 대해 전부 선언해도 됨
*<bean class=""> , <beans:bean class="">
2번 항목에서 생성한 인터셉터 클래스의 경로를 기재
!!!!!중요!!!!!!!
*
해당 경로는 제외(인터셉터 작동하지않는 예외URL)
!! 다만 해당 설정은 스프링 3.2버전부터 적용 가능. 그 이하 버전은 지원하지 않음
이와 같은 경우는 후처리(postHandle 메소드) 에서 IF문으로 분기하여 예외사항을 기록
1. web.xml 파일에서 contextConfigLocation 의 value 경로를 확인,
2. 해당 경로 설정을 변경
* 기본적으로는 <param-value>/WEB-INF/spring/applicationContext.xml</param-value> 이런식으로 하나만 되어있음
* 위 내용을 <param-value>/WEB-INF/spring/**</param-value> 로 변경 (해당 경로에 있는 xml파일들을 다 불러옴)
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/**</param-value>
</context-param>
3. <param-value>/WEB-INF/spring/**</param-value> 에 해당하는 경로에 interceptor.xml 등으로 파일 생성
-파일명은 알아볼수 있게 작성, 다른 스프링 설정파일들과 규칙이 비슷하게 작성
4. interceptor 설정에 필요한 정보들을 등록
* 파일 상단 부분에 xmlns:mvc="http://www.springframework.org/schema/mvc" 추가
* xsi:schemaLocation=" 부분에 하단의 두줄을 추가
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
* 파일내용에 하단의 내용 추가
<!--인터셉터 등록하는 곳 선언-->
<mvc:interceptors>
<!--인터셉터 등록-->
<mvc:interceptor>
<!--인터셉터 할 URL 경로 설정-->
<mvc:mapping path="/mng_home/**"/>
<!--인터셉터 클래스의 경로 설정-->
<bean class="com.securus.kr.SecureInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<?xml version=”1.0” encoding=”UTF-8”?>
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//로그찍기
import org.slf4j.LoggerFactory;
/**
public class SampleInterceptor extends HandlerInterceptorAdapter{
private static final org.slf4j.Logger Logger = LoggerFactory.getLogger(SampleInterceptor.class);
//후처리
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView mav)throws Exception{
Logger.info("인터셉터 후처리 ");
System.out.println("인터셉터 후처리");
}
//전처리
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){
Logger.info("인터셉터 전처리~");
System.out.println("인터셉터 전처리");
return true;
}
}