본문 바로가기
수업 일지/Spring

70일차 - [Spring] Interceptor/RedirectAttributes

by 쿠쿠씨 2022. 4. 18.
반응형

인터셉터(Interceptor)

컨트롤러 동작 이전에 요청을 가로채거나 컨트롤러에서 응답을 보내가 이전에 가로챕니다.

HandlerInterceptor 인터페이스를 구현하여 인터셉터 클래스를 생성합니다.

추상메소드로는  preHandle( ), postHandle( ), AfterCompletion( )이 있습니다.

필터와 인터셉터

 

Filter는 웹 컨테이너에서 관리되고 문자열 인코딩 등의 웹 애플리케이션에 사용되는 기능을 구현합니다.

web.xml에 사용할 Filter를 등록합니다.

Dispatcher Servlet은 스프링 컨테이너 앞 단의 프론트 컨트롤러로, 요청을 받아 적합한 컨트롤러로 전달합니다.

Interceptor는 스프링 컨텍스트에서 동작을 하고 컨트롤러 실행 전에 인증이나 인가와 같은 작업을 합니다.

servlet-context.xml에 사용할 Interceptor를 스프링 빈으로 등록합니다.

 

인터셉터 구현체 생성

HandlerInterceptor 인터페이스를 구현합니다.

public class TestInterceptor implements HandlerInterceptor {
	private static final Logger log = LoggerFactory.getLogger(TestInterceptor.class);

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
    	Object handler) throws Exception {
		return HandlerInterceptor.super.preHandle(request, response, handler);
	}

	@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 {
	}
}

preHandle( ), postHandle( ), AfterCompletion( )는 필요한 경우에만 정의하는 디폴트 메소드로, 

반드시 구현해야 하는 추상 메소드가 아닙니다.

위의 메소드는 모두 request, response를 인자로 전달 받습니다. (request, response 객체를 가로채기 후 변경 가능)

preHandle( ), postHandle( ), AfterCompletion( ) 메소드는 각각 다른 시점에 동작합니다.

 

preHandle( )

→ 컨트롤러 handler 메소드 매핑 이전에 실행됩니다.

→ return 타입은 boolen으로 true이면 정해진 핸들러 메소드로 이동하고

    false이면 정해진 핸들러 매핑 메소드가 취소됩니다.

 

postHandle( )

→ 컨트롤러 handler 메소드 실행 완료 후, view 생성 이전에 실행됩니다.

→ ModelAndView 객체를 인자로 전달 받습니다.

 

AfterCompletion( )

→ view 생성 완료 후에 실행됩니다.

→ Exception이 발생할 경우 예외 정보 객체를 인자로 전달 받습니다.

 

* 인증과 인가

인증(Authentication) : 사용자를 확인하는 로그인.

인가(Authorization) : 확인된 사용자의 사용 범위를 허가. (ex. 일반 사용자와 관리자)

인증 및 인가 작업으로 preHandle( ) 메소드를 이용하여 로그인이 필요한 URL에 대한 검사를 할 수 있습니다.

→ 관리자 페이지 접근 전에 관리자를 인증할 때 사용할 수 있습니다.

 

인터셉터 등록(servlet-context.xml)

<!-- 인터셉터 구현체를 빈으로 등록 -->
<beans:bean id="testInterceptor"
	class="com.mycompany.idev.interceptor.TestInterceptor"/>
<!-- 인터셉터의 동작 범위를 설정 -->
<interceptors>
	<interceptor>
		<!-- 적용될 url(경로), 2단계 하위 디렉토리로 설정, *기호 모든 이름에 대해-->
		<mapping path="/**/**"/>	
        <!-- 매핑에 제외할 url 설정 (로그인 안해도 볼 수 있는 페이지)-->
		<exclude-mapping path="/member/join.do"/>
		<exclude-mapping path="/community/list"/>
		<beans:ref bean="testInterceptor"/>
	</interceptor>
</interceptors>

 

인터셉터 예제

public class LoginInterceptor implements HandlerInterceptor {
	private static final Logger log = LoggerFactory.getLogger(TestLoginController.class);

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
    	Object handler)	throws Exception {
			if(member == null) {	//로그인 정보 확인
			String msg="로그인 하세요.";
			String url=request.getContextPath();
			response.setContentType("text/html;charset=utf-8");	//out 만들기 전에
			PrintWriter out = response.getWriter(); 
			StringBuilder alerts = new  StringBuilder("<script>alert('") 
					  .append(msg)
					  .append("');")
					  .append("location.href='")
					  .append(url)
					  .append("';")
					  .append("</script>"); 
			out.print(alerts.toString()); 
			//out.flush();	//출력버퍼 비우기
			
			//요청에 정해진 handler 메소드로 제어(실행)가 이동되지 않습니다.
			return false;	
		}else {
		//로그인 된 상태이므로 요청에 따라 handler 메소드로 이동합니다.
			return true;
		}

 

RedirectAttributes 객체

RedirectAttribures 객체는 Model 객체와 충돌되므로 둘 중 하나만 사용할 수 있습니다.

@PostMapping이고 redirect에서만 사용합니다.

 

addAttribute()

Model 객체와 비슷하게 애트리뷰트를 전달합니다.

 

addflashAttribute()

일회성 데이터를 전달합니다.

→ 주로 alert창을 띄울 때 사용합니다.

 

예시

@PostMapping("delete")	//글 삭제 -> 완료 alert
	public String deleteFreeboard(int idx,int pageNo,RedirectAttributes rda) {
		
		mapper.delete(idx);
		rda.addAttribute("pageNo", pageNo);
		rda.addFlashAttribute("message", "글이 삭제되었습니다.");
		return "redirect:list";
	}

 

 

반응형

댓글