728x90
반응형
≣ 목차
웹 애플리케이션 개발에서 주로 사용되는 개념으로, 요청(Request)와 응답(Response) 과정에서 특정 작업을 수행하기 위해 사용된다.
구현 및 사용 방식에서 차이가 있다.
# 요약
- Filter: 서블릿 컨테이너에서 제공하며, 모든 요청에 대해 작동할 수 있는 범용적인 기능을 제공한다. 주로 웹 애플리케이션의 요청 처리 전 후에 사용된다.
- Interceptor: 스프링 같은 특정 프레임워크에서 제공하며, 특정 컨트롤러나 메서드에 대해 작동할 수 있다. 요청 전 후 및 완료 후에 작업을 수행할 수 있다.
Filter
- 서블릿 기반: 필터는 서블릿 컨테이너 (예: Tomcat) 에서 제공되며, 서블릿 요청 전후에 작동한다.
- 범용성: 모든 요청에 대해 동작할 수 있으며, 특정 URL 패턴에 대해 필터를 적용할 수 있다.
- 처리 순서: 여러 필터를 체인으로 연결하여 순차적으로 처리할 수 있다.
로그인 검증 필터 예제
1. LoginFilter.java
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 필터 초기화 코드
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String loginURI = httpRequest.getContextPath() + "/login";
boolean loggedIn = httpRequest.getSession().getAttribute("user") != null;
boolean loginRequest = httpRequest.getRequestURI().equals(loginURI);
if (loggedIn || loginRequest) {
chain.doFilter(request, response); // 다음 필터 또는 서블릿으로 요청 전달
} else {
httpResponse.sendRedirect(loginURI); // 로그인 페이지로 리다이렉트
}
}
@Override
public void destroy() {
// 필터 종료 코드
}
}
2. web.xml
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.example.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Interceptor
- 프레임워크 종속: 주로 스프링 같은 특정 프레임워크에서 제공되며, 컨트롤러의 요청 전후에 작동한다.
- 선택적 적용: 특정 컨트롤러 또는 메서드에 대해서만 인터셉터를 적용할 수 있다.
- 메섣 기반: preHandle, postHandle, afterCompletion 메서드를 통해 요청 전, 후, 완료 후 작업을 정의할 수 있다.
로그인 검증 인터셉터 예제
1. LoginInterceptor.java
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String loginURI = "/login";
boolean loggedIn = request.getSession().getAttribute("user") != null;
boolean loginRequest = request.getRequestURI().equals(loginURI);
if (loggedIn || loginRequest) {
return true; // 컨트롤러로 요청 전달
} else {
response.sendRedirect(loginURI); // 로그인 페이지로 리다이렉트
return false;
}
}
}
2. WebConfig.class
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/login", "/resources/**");
}
}
728x90
반응형
'Develop > Feature' 카테고리의 다른 글
Redis (0) | 2024.07.23 |
---|---|
[Docker] Database docker-compose 구축(mysql, redis) (0) | 2024.07.22 |
Mac Node.js 설치 (0) | 2024.06.24 |
Swagger UI 사용 (0) | 2024.06.12 |
Layered Architecture 구조, API 적용하기 (0) | 2024.05.28 |
댓글