1. 程式人生 > 程式設計 >通過例項解析java過濾器和攔截器的區別

通過例項解析java過濾器和攔截器的區別

區別

1.使用範圍和規範不同

filter是servlet規範規定的,只能用在web程式中.

攔截器即可以用在web程式中,也可以用於application,swing程式中,是Spring容器內的,是Spring框架支援的

2.觸發時機不同

順序: Filter-->Servlet-->Interceptor-->Controller

  • 過濾器是在請求進入容器後,但請求進入servlet之前進行預處理的。請求結束返回也是,是在servlet處理完後,返回給前端之前過濾器處理。
  • 攔截器是方法到達Controller層之前生效的

3.過濾器的實現基於回撥函式。而攔截器(代理模式)的實現基於反射,代理分靜態代理和動態代理,動態代理是攔截器的簡單實現。

何時使用攔截器?何時使用過濾器?

  • 如果是非spring專案,那麼攔截器不能用,只能使用過濾器。
  • 如果是處理controller前後,既可以使用攔截器也可以使用過濾器。
  • 如果是處理dispaterServlet前後,只能使用過濾器。

4.在action的生命週期中,攔截器可以多次被呼叫,而過濾器只能在容器初始化時被呼叫一次。

5.攔截器可以訪問action上下文、值棧裡的物件,而過濾器不能訪問。

6.攔截器只能對action請求起作用,而過濾器則可以對幾乎所有的請求起作用。

7.攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,在攔截器裡注入一個service,可以呼叫業務邏輯。

SpringBoot使用過濾器

兩種方式:

1、使用spring boot提供的FilterRegistrationBean註冊Filter

2、使用原生servlet註解定義Filter

兩種方式的本質都是一樣的,都是去FilterRegistrationBean註冊自定義Filter

封裝Filter

package com.theeternity.common.baseFilter;
import javax.servlet.Filter;
/**
 * @program: ApiBoot
 * @description: 封裝Filter
 * @author: TheEternity Zhang
 * @create: 2019-02-17 13:08
 */
public interface MappingFilter extends Filter {
  String[] addUrlPatterns();
  int order();
}

自定義Filter

package com.theeternity.beans.filterConfig;

import com.theeternity.common.baseFilter.MappingFilter;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import javax.servlet.*;
import javax.servlet.FilterConfig;
import java.io.IOException;

/**
 * @program: ApiBoot
 * @description: 許可權過濾器
 * @author: TheEternity Zhang
 * @create: 2019-02-17 13:14
 */
public class AuthFilter implements MappingFilter {

  @Override
  public String[] addUrlPatterns() {
    return new String[]{"/*"};
  }

  @Override
  public int order() {
    return 0;
  }

  @Override
  public void init(FilterConfig filterConfig) throws ServletException {

  }

  @Override
  public void doFilter(ServletRequest servletRequest,ServletResponse servletResponse,FilterChain filterChain) throws IOException,ServletException {
    filterChain.doFilter(servletRequest,servletResponse);
  }

  @Override
  public void destroy() {
  }
}

註冊過濾器

package com.theeternity.beans.filterConfig;

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
 * @program: ApiBoot
 * @description: 註冊過濾器
 * @author: TheEternity Zhang
 * @create: 2019-02-17 13:10
 */
@Configuration
public class FilterConfig {

  @Bean
  public FilterRegistrationBean registFilter() {
    FilterRegistrationBean registration = new FilterRegistrationBean();
    AuthFilter authFilter=new AuthFilter();
    registration.setFilter(authFilter);
    registration.addUrlPatterns(authFilter.addUrlPatterns());
    registration.setOrder(authFilter.order());
    registration.setName("AuthFilter");
    return registration;
  }
}

SpringBoot使用攔截器

封裝Interceptor

package com.theeternity.common.baseInterceptor;
import org.springframework.web.servlet.HandlerInterceptor;
/**
 * @program: ApiBoot
 * @description: 封裝Interceptor
 * @author: TheEternity Zhang
 * @create: 2019-02-15 17:49
 */
public interface MappingInterceptor extends HandlerInterceptor {
  String[] addPathPatterns();

  String[] excludePathPatterns();

  int order();
}

自定義Interceptor

package com.theeternity.beans.interceptorConfig;

import com.theeternity.common.baseInterceptor.MappingInterceptor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.ModelAndView;

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

/**
 * @program: BoxApi
 * @description: 跨域攔截器
 * @author: tonyzhang
 * @create: 2018-12-21 14:44
 */
@Component
public class CrossOriginInterceptor implements MappingInterceptor {

  @Override
  public String[] addPathPatterns() {
    return new String[]{"/**"};
  }

  @Override
  public String[] excludePathPatterns() {
    return new String[0];
  }

  @Override
  public int order() {
    return 0;
  }

  @Override
  public boolean preHandle(HttpServletRequest request,HttpServletResponse response,Object handler) throws Exception {
    logger.info("允許的頭資訊"+request.getHeader("Origin"));
    response.setHeader("Access-Control-Allow-Origin","*");
    response.setHeader("Access-Control-Allow-Methods","*");
    response.setHeader("Access-Control-Max-Age","3600");
    response.setHeader("Access-Control-Allow-Headers","Origin,X-Requested-With,Content-Type,Accept");
    //是否允許瀏覽器攜帶使用者身份資訊(cookie)
    response.setHeader("Access-Control-Allow-Credentials","true");
    return true;
  }
  @Override
  public void postHandle(HttpServletRequest request,Object handler,ModelAndView modelAndView) throws Exception {

  }
  @Override
  public void afterCompletion(HttpServletRequest request,Exception ex) throws Exception {
  }
}

註冊Interceptor

package com.theeternity.beans.interceptorConfig;

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;

/**
 * @program: ApiBoot
 * @description: 攔截器註冊
 * @author: TheEternity Zhang
 * @create: 2019-02-15 17:55
 */
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {

  @Autowired
  private CrossOriginInterceptor crossOriginInterceptor;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(crossOriginInterceptor).addPathPatterns(crossOriginInterceptor.addPathPatterns());

  }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。