반응형
인터셉터란?
스프링 인터셉터(Spring Interceptor)는 스프링 MVC에서 제공하는 기능으로, 웹 요청을 가로채고 처리하는 데 사용됩니다. 인터셉터는 컨트롤러(Controller)에 요청이 도달하기 전이나 응답이 클라이언트로 전달되기 전에 특정 로직을 실행할 수 있게 해줍니다. 이를 통해 로깅, 인증, 권한 검사, 데이터 변환 등의 작업을 중앙 집중적으로 처리할 수 있습니다.
스프링 인터셉터의 주요 구성 요소
- afterConpletion -> 뷰가 렌더링된 후에 실행
- postHandler -> 컨트롤러의 핸들러 메서드가 호출된 후, 뷰가 렌더링되기 전에 실행
- preHandler -> 컨트롤러의 핸들러 메서드가 호출되기 전에 실행
인터셉터 등록
**LoginInterceptor.java**
package spring.intercept;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 반환값 생성 준비
boolean res = true;
// 로그인 체크를 해서 만약! 로그인이 안된 상태이면 res에 false를 저장한다.
// 먼저 로그인 체크를 하기 위해 HttpSession을 얻어내자
HttpSession session = request.getSession(true);
// true의 의미는 만약에 session이 삭제된 상태라면 새롭운 세션을 생성하라는 뜻!
// 예를 들어 로그인시 세션에 "mvo"를 저장했다고 가정을 하면
// 여기서는 session에서 "mvo"를 얻어내면 된다.
Object obj = session.getAttribute("mvo");
if(obj == null) {
response.sendRedirect("/login");
res = false;
}
return res; // true를 반환하면 원래 가려고 했던
// 경로로 진행을 계속하지만, false이면
// 원래의 경로로 진행을 하지 못한다.
}
}
일단 인터셉터클래스를 하나만들어서 HandlerInterceptorAdapter를 상속받아 오버라이딩해서
어딘가로 이동할때 로그인이 되어있지 않다면 login페이지로 이동하는 코드이다.
이제
servlet-context에 등록을 해줘야한다.
bean객체 정의후 interceptors를 세팅해준다.
** servlet-context.xml **
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
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">
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
<context:component-scan base-package="com.sist.inter" />
<!-- 인터셉터 객체 정의 -->
<beans:bean id="log_inter" class="spring.intercept.LoginInterceptor" />
<!-- 인터셉터들의 경로제한 -->
<interceptors>
<interceptor>
<mapping path="/sub/*" />
<mapping path="/bbs/*" />
<beans:ref bean="log_inter"/>
</interceptor>
</interceptors>
</beans:beans>
이렇게 설정하게 되면 /sub/ 경로로 들어오는 요청들은 모두
세션에 login정보가 없으면 login페이지로 리다이렉트 시킨다.
다른경로를 추가하고 싶으면
mapping 태그를 추가하면 된다.
반응형
'Spring' 카테고리의 다른 글
[Spring] 서비스 인터페이스 구현 (2) | 2024.07.23 |
---|---|
[Spring] 카카오 로그인 (6) | 2024.07.22 |
[Spring] db관련 properties 설정 (0) | 2024.07.18 |
[Spring] 한글 처리 (0) | 2024.07.15 |
[Spring] maven 라이브러리 관리와 mybatis 연동 (0) | 2024.07.12 |