1. 程式人生 > >SpringMVC利用攔截器攔截自定義註解

SpringMVC利用攔截器攔截自定義註解

前幾篇文章裡寫了關於token的個人思考,那麼具體在程式碼中要怎麼實現攔截token,今天寫了一段程式碼,記錄一下

框架:SpringMVC Spring

執行環境:tomcat8

說一下思路:

1.自定一個註解,然後註解在我的Controller方法上

2.實現SpringMVC攔截器的類,重寫PreHandler方法,攔截得到註解實現功能

3.需要在配置中配置攔截類的攔截路徑

<mvc:interceptors>
        <mvc:interceptor>
            <mvc:mapping path="/**/"/>
            <bean class="Controller.AnnotationInterceptor"></bean>
        </mvc:interceptor>
</mvc:interceptors>

/**
 * Created by sam on 2017/7/21.
 */
public class AnnotationInterceptor extends HandlerInterceptorAdapter{
    private Logger logger = Logger.getLogger(this.getClass());
    @Override
    public boolean preHandle(javax.servlet.http.HttpServletRequest request,
                             javax.servlet.http.HttpServletResponse response,
                             Object handler) throws Exception {
        logger.debug("進行攔截器");
        if(handler instanceof HandlerMethod){
            logger.debug("獲取到handler");
            HandlerMethod hm = (HandlerMethod) handler;
            Method method = ((HandlerMethod) handler).getMethod();
            Token token = method.getAnnotation(Token.class);
            if(token!= null){
                logger.debug("token不為null");
                String value = token.value();
                request.setAttribute("txt",value);
            }
        }
            return true;
    }
}


值得注意的是:

在攔截器類裡不一定能獲取Handler,需要手動配置兩個RequestMapping處理bean才能保證獲得Handler

<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"/>


至於為什麼這2個類配置上去就能保證獲得Handler我也不太瞭解,我會去查詢相關資料然後貼到部落格!