[Spring 3.2] Interceptor¿¡¼ ControllerÀÇ ¾î³ëÅ×ÀÌ¼Ç Ã¼Å©Çϱâ
ÀÎÁõÀÌ ÇÊ¿äÇÑ ¼ºñ½º¸¦ °³¹ßÇÒ °æ¿ì, Interceptor¿¡¼ ·Î±×ÀÎ À¯¹«¸¦ È®ÀÎÇÏ´Â ·ÎÁ÷À» Ãß°¡ÇÏ¿© °¢ ÄÁÆ®·Ñ·¯¿¡ ÀÎÁõ ·ÎÁ÷À» Ãß°¡·Î ÀÛ¼ºÇÏÁö ¾Êµµ·Ï ÇÒ¼ö ÀÖ½À´Ï´Ù.
¸¸¾à À̶§ ¾î¶² ÄÁÆ®·Ñ·¯ÀÇ ¸Þ¼Òµå´Â ·Î±×ÀÎÀ» üũÇÏ°í ¾î¶² ÄÁÆ®·Ñ·¯ÀÇ ¸Þ¼Òµå¿¡´Â ·Î±×ÀÎÀ» üũÇÏÁö ¾Êµµ·Ï ÇÏ·Á¸é ¾î¶»°Ô ÇØ¾ß ÇÒ±î¿ä?
½ºÇÁ¸µ 3.2 ºÎÅÍ´Â mvc:interceptor ºÎºÐ¿¡ exclude-mapping À̶ó´Â ¿¤¸®¸ÕÆ®°¡ Ãß°¡µÇ¾î ±âÁ¸ÀÇ ½ºÇÁ¸µ ¹öÀüº¸´Ù ½±°Ô ÀÎÅͼÁÅÍÀÇ Àû¿ëÀ» Á¦¿Ü½Ãų¼ö ÀÖ½À´Ï´Ù.
<mvc:interceptor> <mvc:mapping path="/**"/> <exclude-mapping path="/info/**"/> <bean class="net.krespo.interceptor.LoginCheckInterceptor" /> </mvc:interceptor>
ÀÌ·¸°Ô exclude-mappingÀ» »ç¿ëÇϸé LoginCheckInterceptor´Â /info/ ·Î ½ÃÀÛÇÏ´Â ÄÁÆ®·Ñ·¯¿¡ ÀÎÅͼÁÅÍ Àû¿ëÀ» Á¦¿Ü ½Ãų¼ö ÀÖ½À´Ï´Ù.
±×·±µ¥ ¸¸¾à /info/my´Â ·Î±×ÀÎ ÀÎÅͼÁÅ͸¦ ¼öÇà½ÃÅ°°í /info/test´Â ·Î±×ÀÎ ÀÎÅͼÁÅ͸¦ ¼öÇà½ÃÅ°·Á¸é ¾î¶»°Ô ÇؾßÇÒ±î¿ä?
¹°·Ð exclude-mappingÀ» ¿©·¯°³ µî·ÏÇÏ¸é µÇÁö¸¸ ·Î±×ÀÎÀÌ ÇÊ¿äÇÏÁö ¾ÊÀº ÄÁÆ®·Ñ·¯°¡ »ý±æ¶§¸¶´Ù exclude-mappingÀ» ¼±¾ðÇϴ°ÍÀÌ ±ÍÂú°Ô ´À²¸Áú°Ì´Ï´Ù.
ÀÌ·²¶§´Â ÀÓÀÇÀÇ ¾î³ëÅ×À̼ÇÀ» »ý¼ºÇÏ¿© ÀÎÁõÀÌ ÇÊ¿äÇÏÁö ¾ÊÀº ÄÁÆ®·Ñ·¯ÀÇ ¸Þ¼Òµå¿¡ ¾î³ëÅ×À̼ÇÀ» ºÙÀÌ°í, ¾î³ëÅ×ÀÌ¼Ç À¯¹«¸¦ ÀÎÅͼÁÅÍ¿¡¼ È®ÀÎÇÏ¿© ·Î±×ÀÎÀ» ÇÒÁö ¾ÈÇÒÁö¸¦ Çϸé Á»´õ ÆíÇÏ°Ô °³¹ßÀ» ÁøÇàÇÒ ¼ö ÀÖÀ»°Í °°½À´Ï´Ù.
ÀÌÁ¦ºÎÅÍ º»°ÝÀûÀ¸·Î ÀÎÅͼÁÅÍ¿¡¼ ÄÁÆ®·Ñ·¯ÀÇ ¾î³ëÅ×À̼ÇÀ» üũÇÏ´Â ¹æ¹ýÀ» ¾Ë¾Æº¸µµ·Ï ÇÏ°Ú½À´Ï´Ù.
1. ¾î³ëÅ×ÀÌ¼Ç »ý¼º
package net.krespo.annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface NoLoginCheck { }
NoLoginCheck¶ó´Â ¾î³ëÅ×À̼ÇÀ» »ý¼ºÇÏ¿´½À´Ï´Ù. ÀÌ ¾î³ëÅ×À̼ÇÀ» »ç¿ëÇÏ¿© ¾î³ëÅ×À̼ÇÀ» ¸Þ¼Òµå¿¡ Ãß°¡¸¦ ÇßÀ¸¸é ·Î±×ÀΠüũ¸¦ ÇÏ°í, ¾î³ëÅ×À̼ÇÀÌ ¾øÀ¸¸é ·Î±×ÀΠüũ¸¦ ÇÏÁö ¾Êµµ·Ï ÇÒ°ÍÀÔ´Ï´Ù.
2. ÄÁÆ®·Ñ·¯¿¡ ¾î³ëÅ×ÀÌ¼Ç Ãß°¡
@Controller public class MyController { @RequestMapping("/my/info") @NoLoginCheck public ModelAndView myInfo(){ ... } }
3. Interceptor¿¡¼ ¾î³ëÅ×ÀÌ¼Ç Ã¼Å©Çϱâ
public class LoginInterceptor extends WebContentInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws ServletException { //@NoCheckLogin ¾î³ëÅ×À̼ÇÀÌ ÄÁÆ®·Ñ·¯¿¡ »ç¿ëµÇ¾ú´ÂÁö üũÇÔ NoCheckLogin usingAuth = ((HandlerMethod) handler).getMethodAnnotation(NoCheckLogin.class); //NoCheckLogin ¾î³ëÅ×À̼ÇÀÌ ¾øÀ½À¸·Î ¹«Á¶°Ç ·Î±×ÀΠüũ if(usingAuth == null) { //TODO ·Î±×ÀΠüũ } //NoCheckLogin ¾î³ëÅ×À̼ÇÀÌ ¾øÀ½À¸·Î ·Î±×ÀΠüũ ÇÏÁö ¾ÊÀ½ else { //TODO Ãß°¡ÀÛ¾÷ } } }
°¡Àå Áß¿äÇÑ ºÎºÐÀº preHandler ¸Þ¼ÒµåÀÇ handler Object¸¦ HandlerMethod·Î ŸÀÔÄɽºÆà ÇÏ´Â ºÎºÐÀÔ´Ï´Ù. ÀÌ·¸°Ô HandlerMethod·Î ¹Ù²Û handler¿ÀºêÁ§Æ®ÀÇ getMethodAnnotationÀ» ÅëÇؼ ¾ÕÀ¸·Î ½ÇÇàµÉ ÄÁÆ®·Ñ·¯ÀÇ ¸Þ¼Òµå¿¡ ÇØ´ç ¾î³ëÅ×À̼ÇÀÌ Ãß°¡°¡ µÇ¾ú´ÂÁö ¾ÈµÇ¾î ÀÖ´ÂÁö¸¦ È®ÀÎÇÒ ¼ö ÀÖ½À´Ï´Ù.
À§ ³»¿ëÀº ½ºÇÁ¸µ 3.2¿¡¼ È®ÀÎÇØ º¸¾Ò½À´Ï´Ù. ±×·¯³ª ½ºÇÁ¸µ 3.0¿¡¼´Â ÇØ´ç handler Object¸¦ HandlerMethodÀÇ ¿ÀºêÁ§Æ®°¡ ¾Æ´Ñ ¾ÕÀ¸·Î ½ÇÇà½Ãų ÄÁÆ®·Ñ·¯¿ÀºêÁ§Æ®(À§ÀÇ ¿¹Á¦¿¡¼´Â LoginController)°¡ ¹ÝȯÀÌ µÊÀ¸·Î À§ÀÇ ÄÚµå´Â 3.0¿¡¼´Â »ç¿ëÇÒ ¼ö°¡ ¾ø½À´Ï´Ù~(3.1¿¡¼´Â üũ¸¦ Çغ¸Áö ¸øÇß½À´Ï´Ù. 3.1¿¡¼ »ç¿ëÇØ º¸½Å ºÐ²²¼´Â ´ñ±Û·Î ¾Ë·ÁÁÖ¼¼¿ä~^^)