์คํ๋ง ์ธํฐ์ ํฐ๋ ์๋ธ๋ฆฟ ํํฐ์ ๊ฐ์ด ์น๊ณผ ๊ด๋ จ๋ ๊ณตํต ๊ด์ฌ์ฌํญ์ ํจ๊ณผ์ ์ผ๋ก ํด๊ฒฐํ ์ ์๋ ๊ธฐ์ ์ด๋ค.
HTTP ์์ฒญ -> WAS -> ํํฐ -> ์๋ธ๋ฆฟ -> ์ธํฐ์ ํฐ1 -> (์ธํฐ์ ํฐ2) -> ์ปจํธ๋กค๋ฌ
package org.springframework.web.servlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.lang.Nullable;
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
}
}
preHandle : ์ปจํธ๋กค๋ฌ ํธ์ถ ์ ์ ํธ์ถ๋๋ค. (ํธ๋ค๋ฌ ์ด๋ํฐ ํธ์ถ ์ ์ ํธ์ถ๋๋ค.)preHandle์ ์๋ต ๊ฐ์ด true์ด๋ฉด ๋ค์์ผ๋ก ์งํํ๊ณ , false์ด๋ฉด ์งํํ์ง ์๋๋ค.false์ธ ๊ฒฝ์ฐ ๋๋จธ์ง ์ธํฐ์
ํธ์ ํธ๋ค๋ฌ ์ด๋ํฐ ๋ํ ํธ์ถ๋์ง ์๋๋ค.postHandle : ์ปจํธ๋กค๋ฌ ํธ์ถ ํ์ ํธ์ถ๋๋ค. (ํธ๋ค๋ฌ ์ด๋ํฐ ํธ์ถ ํ์ ํธ์ถ๋๋ค.)postHandle : ๋ทฐ๊ฐ ๋ ๋๋ง ๋ ์ดํ์ ํธ์ถ๋๋ค.preHandle : ์ปจํธ๋กค๋ฌ ํธ์ถ ์ ์ ํธ์ถ.postHandle : ์ปจํธ๋กค๋ฌ์์ ์์ธ๊ฐ ๋ฐ์ํ๋ฉด ํธ์ถ๋์ง ์๋๋ค.afterCompletion : ํญ์ ํธํ๋๋ค. ์ด ๊ฒฝ์ฐ ์์ธ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ์ด๋ค ์์ธ์ธ์ง ๋ก๊ทธ ์ถ๋ ฅ์ด ๊ฐ๋ฅํ๋ค.์ธํฐ์ ํฐ๋ ์คํ๋ง MVC ๊ตฌ์กฐ์ ํนํ๋ ํํฐ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค. ์คํ๋ง MVC๋ฅผ ์ฌ์ฉํ๊ณ , ํน๋ณํ ํํฐ๋ฅผ ์ฌ์ฉํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ์ธํฐ์ ํฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ํธ๋ฆฌํ๋ค.
package hello.login.web.interceptor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.UUID;
@Slf4j
public class LogInterceptor implements HandlerInterceptor {
public static final String LOG_ID = "logId";
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
String uuid = UUID.randomUUID().toString();
request.setAttribute(LOG_ID, uuid);
if (handler instanceof HandlerMethod) {
HandlerMethod hm = (HandlerMethod) handler;
}
log.info("REQUEST [{}][{}][{}]", uuid, requestURI, handler);
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
log.info("postHandle[{}]", modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
String requestURI = request.getRequestURI();
String uuid = (String) request.getAttribute(LOG_ID);
log.info("RESPONSE [{}][{}][{}]", uuid, requestURI, handler);
if (ex != null) {
log.error("afterCompletion error!!", ex);
}
}
}
request.setAttribute(LOG_ID, uuid)preHandle์์ ์ง์ ํ ๊ฐ์ postHandle, afterCompletion์์ ํจ๊ผ ์ฌ์ฉํ๋ ค๋ฉด request์ ๋ด์์ ์ฌ์ฉํ๋ฉด ๋๋ค.@Controller, @RequestMapping์ ํ์ฉํ ํธ๋ค๋ฌ ๋งคํ์ ์ฌ์ฉํ๋๋ฐ,HandlerMethod๊ฐ ๋์ด์จ๋ค.@Controller๊ฐ ์๋๋ผ /resources/static์ ๊ฐ์ ์ ์ ๋ฆฌ์์ค๊ฐ ํธ์ถ๋๋ ๊ฒฝ์ฐ ResourceHttpRequestHandler๊ฐ ํธ๋ค๋ฌ ์ ๋ณด๋ก ๋์ด์ค๊ธฐ ๋๋ฌธ์ ํ์
์ ๋ฐ๋ผ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.postHandle ์ด ์๋๋ผ afterCompletion ์์ ์คํํ ์ด์ ๋, ์์ธ๊ฐ ๋ฐ์ํ ๊ฒฝ์ฐ postHandle๊ฐ ํธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. afterCompletion ์ ์์ธ๊ฐ ๋ฐ์ํด๋ ํธ์ถ ๋๋ ๊ฒ์ ๋ณด์ฅํ๋ค.package hello.login.web.interceptor;
import hello.login.web.session.SessionConst;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
@Slf4j
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String requestURI = request.getRequestURI();
log.info("์ธ์ฆ ์ฒดํฌ ์ธํฐ์
ํฐ ์คํ {}", requestURI);
HttpSession session = request.getSession();
if (session == null || session.getAttribute(SessionConst.LOGIN_MEMBER) == null) {
log.info("๋ฏธ์ธ์ฆ ์ฌ์ฉ์ ์์ฒญ");
response.sendRedirect("/login?redirectURL=" + requestURI);
return false;
}
return true;
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
resolvers.add(new LoginMemberArgumentResolver());
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LogInterceptor())
.order(1)
.addPathPatterns("/**")
.excludePathPatterns("/css/**", "/*.ico", "/error");
registry.addInterceptor(new LoginCheckInterceptor())
.order(2)
.addPathPatterns("/**")
.excludePathPatterns("/", "/css/**", "/*.ico", "/error", "/login", "/logout", "/member/add");
}
}
registry.addInterceptor(new LogInterceptor) : ์ธํฐ์
ํฐ๋ฅผ ๋ฑ๋กํ๋ค.order(1) : ์ธํฐ์
ํฐ์ ํธ์ถ ์์๋ฅผ ์ง์ ํ๋ค. ๋ฎ์ ์๋ก ๋จผ์ ํธ์ถ๋๋ค.addPathPatterns("/**") : ์ธํฐ์
ํฐ๋ฅผ ์ ์ฉํ URL ํจํด์ ์ง์ ํ๋ค.excludePathPatterns() : ์ธํฐ์
ํฐ์์ ์ ์ธํ ํจํด์ ์ง์ ํ๋ค.? ํ ๋ฌธ์ ์ผ์น
* ๊ฒฝ๋ก(/) ์์์ 0๊ฐ ์ด์์ ๋ฌธ์ ์ผ์น
** ๊ฒฝ๋ก ๋๊น์ง 0๊ฐ ์ด์์ ๊ฒฝ๋ก(/) ์ผ์น
{spring} ๊ฒฝ๋ก(/)์ ์ผ์นํ๊ณ spring์ด๋ผ๋ ๋ณ์๋ก ์บก์ฒ
{spring:[a-z]+} matches the regexp [a-z]+ as a path variable named "spring"
{spring:[a-z]+} regexp [a-z]+ ์ ์ผ์นํ๊ณ , "spring" ๊ฒฝ๋ก ๋ณ์๋ก ์บก์ฒ
{*spring} ๊ฒฝ๋ก๊ฐ ๋๋ ๋ ๊น์ง 0๊ฐ ์ด์์ ๊ฒฝ๋ก(/)์ ์ผ์นํ๊ณ spring์ด๋ผ๋ ๋ณ์๋ก ์บก์ฒ
/pages/t?st.html โ matches /pages/test.html, /pages/tXst.html but not /pages/
toast.html
/resources/*.png โ matches all .png files in the resources directory
/resources/** โ matches all files underneath the /resources/ path, including /
resources/image.png and /resources/css/spring.css
/resources/{*path} โ matches all files underneath the /resources/ path and
captures their relative path in a variable named "path"; /resources/image.png
will match with "path" โ "/image.png", and /resources/css/spring.css will match
with "path" โ "/css/spring.css"
/resources/{filename:\\w+}.dat will match /resources/spring.dat and assign the
value "spring" to the filename variable