인터셉터(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";
}
'수업 일지 > Spring' 카테고리의 다른 글
90일차 - [Spring] 애플리케이션 배포 (0) | 2022.05.24 |
---|---|
71일차 - [Spring] JSON/Ajax/REST (0) | 2022.04.19 |
69일차 - [Spring] 게시판 기능 구현2 (0) | 2022.04.15 |
68일차 - [Spring] 게시판 기능 구현 (0) | 2022.04.14 |
67일차 - [Spring] 게시판 페이징 처리 (0) | 2022.04.13 |
댓글