最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

通過實(shí)例解析java過濾器和攔截器的區(qū)別

 更新時間:2020年03月30日 11:55:23   作者:未月廿三  
這篇文章主要介紹了通過實(shí)例解析java過濾器和攔截器的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

區(qū)別

1.使用范圍和規(guī)范不同

filter是servlet規(guī)范規(guī)定的,只能用在web程序中.

攔截器即可以用在web程序中, 也可以用于application, swing程序中, 是Spring容器內(nèi)的, 是Spring框架支持的

2.觸發(fā)時機(jī)不同

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

  • 過濾器是在請求進(jìn)入容器后,但請求進(jìn)入servlet之前進(jìn)行預(yù)處理的。請求結(jié)束返回也是,是在servlet處理完后,返回給前端之前過濾器處理。
  • 攔截器是方法到達(dá)Controller層之前生效的

3.過濾器的實(shí)現(xiàn)基于回調(diào)函數(shù)。而攔截器(代理模式)的實(shí)現(xiàn)基于反射,代理分靜態(tài)代理和動態(tài)代理,動態(tài)代理是攔截器的簡單實(shí)現(xiàn)。

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

  • 如果是非spring項(xiàng)目,那么攔截器不能用,只能使用過濾器。
  • 如果是處理controller前后,既可以使用攔截器也可以使用過濾器。
  • 如果是處理dispaterServlet前后,只能使用過濾器。

4.在action的生命周期中,攔截器可以多次被調(diào)用,而過濾器只能在容器初始化時被調(diào)用一次。

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

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

7.攔截器可以獲取IOC容器中的各個bean,而過濾器就不行,在攔截器里注入一個service,可以調(diào)用業(yè)務(wù)邏輯。

SpringBoot使用過濾器

兩種方式:

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

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

兩種方式的本質(zhì)都是一樣的,都是去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: 權(quán)限過濾器
 * @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, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

  }
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,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());

  }
}

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評論

伊春市| 旺苍县| 越西县| 德钦县| 西城区| 安福县| 乐陵市| 汉寿县| 梅州市| 石门县| 乌拉特前旗| 曲阳县| 永福县| 凤阳县| 峨边| 宣汉县| 永嘉县| 巴彦淖尔市| 深圳市| 郓城县| 平乡县| 兖州市| 万安县| 都兰县| 鲁山县| 河东区| 措美县| 宣恩县| 朝阳市| 嘉荫县| 武山县| 新闻| 古蔺县| 慈溪市| 辽宁省| 柳江县| 宁明县| 武川县| 怀仁县| 芜湖市| 泾川县|