SpringBoot中的Interceptor(攔截器)Filter(過慮器)AOP(面向切面編程)用法小結

 

 


Interceptor(攔截器)

傳統攔截器的寫法:

 

SpringBoot實現自定義攔截器方法:

相比springmvc,springboot中攔截器不需要在xml中配置,只需定義攔截器類 implements HandlerInterceptor 和攔截器攔截路徑的配置類extends WebMvcConfigurerAdapter。

第一步創建一個類實現HandlerInterceptor接口,重寫接口的方法,只是多了一個@Component註解,這個註解是爲後面的使用時進行注入。例:

1.SessionInterceptor

package com.example.demo;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Created by 20160216 on 2018/2/8.
 */
public class SessionInterceptor implements HandlerInterceptor
{
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) throws Exception {
        System.out.println("uri="+request.getRequestURI());
        //登錄不做攔截
        if(request.getRequestURI().equals("/userbg/login") || request.getRequestURI().equals("/user/login_view"))
        {
            return true;
        }
        //驗證session是否存在
        Object obj = request.getSession().getAttribute("_session_user");
        if(obj == null)
        {
            response.sendRedirect("/user/login_view");
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

2.SessionConfiguration

package com.example.demo;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Created by 20160216 on 2018/2/8.
 */
@Configuration
public class SessionConfiguration extends WebMvcConfigurerAdapter
{
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(newSessionInterceptor()) //指定攔截器類
        .addPathPatterns("/**");                         //指定該類攔截的url
   }
}

小結:

通過對比我們可以明確的看到,SpringBoot實現自定義攔截器跟傳統不一樣的地方只是將XML配置變更爲JAVA配置而已。


Filter(過慮器)

傳統過慮器的寫法:

 

SpringBoot實現自定義過慮器方法:


@WebFilter(urlPatterns = "/*")
public class CustomFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
 
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        MsgUtils.println("自定義過濾器->doFilter");
        filterChain.doFilter(servletRequest, servletResponse);
    }
 
    @Override
    public void destroy() {
 
    }
}

也可以不要@WebFilter(urlPatterns = "/*")這個註解,另外在Application文件或者另外建立一個配置文件進行配置就可以了。

@Configuration
public class FilterConfig {
    @Bean
    public FilterRegistrationBean filterRegist() {
        FilterRegistrationBean frBean = new FilterRegistrationBean();
        frBean.setFilter(new CustomFilter());
        frBean.addUrlPatterns("/*");
        return frBean;
    }
}

如果需要配置多個過濾器,需要添加 registration.setOrder(i);這一句,括號中是優先級,數值越大優先級越高。具體可參考http://blog.csdn.net/mzh1992/article/details/66970924

 


AOP(面向切面編程)

傳統面向切面編程寫法:

 

SpringBoot實現自定義面向切面編程方法:

 

小結

服務器接受到的請求都會被filter首先攔截,並可以預處理request, 而攔截器可以調用IOC容器中的各種依賴,filter就不能獲取註解信息並攔截,因爲它和框架無關,但攔截器不能修改request,filter基於回調函數,我們需要實現的filter接口中doFilter方法就是回調函數,而interceptor則基於java本身的反射機制,而@Aspect與Interceptor的都是基於spring aop的實現,@Aspect粒度更細 。他們的攔截順序:filter—>Interceptor—->@Aspect 、

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章