1. 程式人生 > >SpringBoot-(4)-Filter的使用

SpringBoot-(4)-Filter的使用

一,Filter

  Filter功能,它使使用者可以改變一個 request和修改一個response. Filter 不是一個servlet,它不能產生一個response,它能夠在一個request到達servlet之前預處理request,也可以在離開 servlet時處理response.換種說法,filter其實是一個”servlet chaining”(servlet 鏈).

  一個Filter包括:
  在servlet被呼叫之前截獲;
  在servlet被呼叫之前檢查servlet request;
  根據需要修改request頭和request資料;
  根據需要修改response頭和response資料;
  在servlet被呼叫之後截獲.

 

二,SpringBoot實現Filter

  1,實現Filter介面

package com.example.demo.filters;

import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * Created by zhang_guang_yang on 2018/11/21.
 */

/*
* Order表示過濾順序,值越小,越優先過濾*/
@Order(1)
@WebFilter(filterName = "registerFilter", urlPatterns = "/register")
public class RegisterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

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

        HttpServletRequest req = (HttpServletRequest) servletRequest;
        String token = req.getHeader("token");
        String userAgent = req.getHeader("User-Agent");

        System.out.println("token: " + token);
        System.out.println("user-agent: " + userAgent);

        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

    @Order:過濾順序,值越小,越優先過濾。

    @WebFilter:過濾介面配置

  2 ,新增ServletComponentScan註解

@ServletComponentScan(basePackages = {"com.example.demo.filters"} )
public class DemoApplication {

	public static void main(String[] args) {
		SpringApplication.run(DemoApplication.class, args);
	}
}

  @ServletComponentScan:掃描配置。

  3 ,執行效果:

  

三,也可以都在Filter中配置,不在MainApplication中新增任何註解

  

package com.example.demo.filters;

import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.stereotype.Component;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * Created by zhang_guang_yang on 2018/11/21.
 */

@Component
@ServletComponentScan
@WebFilter(urlPatterns = "/register")
public class RegisterFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

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

        HttpServletRequest req = (HttpServletRequest) servletRequest;
        String token = req.getHeader("token");
        String userAgent = req.getHeader("User-Agent");

        System.out.println("token: " + token);
        System.out.println("user-agent: " + userAgent);

        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}