Springboot использует фильтры

Один: фильтр

1. Знакомство с фильтром

Фильтр — это фильтр между файлами ресурсов клиента и сервера, который помогает нам фильтровать некоторые запросы, не соответствующие требованиям. Обычно он используется для проверки сеанса для оценки разрешений пользователя.

2. Жизненный цикл фильтра

Использовать фильтр очень просто, вам нужно всего лишь реализовать класс Filter, а затем переписать его три метода.

  • метод init: программа начинает вызывать метод init() фильтра (вызывается только один раз); этот метод вызывается автоматически, когда текущий фильтр создается в контейнере.
  • Метод уничтожения: программа перестает вызывать метод уничтожения() фильтра (он вызывается только один раз навсегда); этот метод вызывается автоматически, когда текущий фильтр уничтожается в контейнере.
  • Метод doFilter: метод doFilter() будет вызываться каждый раз, когда запрос доступа соответствует условиям перехвата (при первом запуске программы он будет вызываться после того, как сервлет вызовет метод init(); независимо от того, сколько раз это будет вызов метода doGet(), doPost() ранее). Этот метод имеет три параметра: ServletRequest, ServletResponse и FilterChain. Объекты HttpServletReguest и HttpServletResponse можно получить из параметров для соответствующих операций обработки.

Второе: используйте аннотации для реализации фильтров (@WebFilter) 

 1. Добавьте аннотацию @ServletComponentScan в класс запуска Springboot.

@SpringBootApplication
@ServletComponentScan // 过滤器
public class Springboot02WebTestApplication {
    SpringApplication.run(Springboot02WebTestApplication.class, args);
}

 2. Напишите класс фильтра и реализуйте интерфейс фильтра.

import com.alibaba.fastjson.JSONObject;
import org.springframework.core.annotation.Order;

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

// urlPatterns 过滤路径  filterName 过滤器name
@WebFilter(urlPatterns = "/user/*", filterName = "tokenFilter1")
public class TokenFilter1 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
//        Filter.super.init(filterConfig);
        System.out.println("init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String token = request.getHeader("token");
        System.out.println(token);
        //该方法执行后直接运行至下一个过滤器
        if(token!=null){
            filterChain.doFilter(servletRequest, servletResponse);
        }else{
            servletResponse.setCharacterEncoding("UTF-8");
            servletResponse.setContentType("application/json; charset=utf-8");
            PrintWriter out = servletResponse.getWriter();
            JSONObject res = new JSONObject();
            res.put("msg", "错误");
            res.put("success", "false");
            out.append(res.toString());
        }
    }

    @Override
    public void destroy() {
//        Filter.super.destroy();
        System.out.println("destroy");
    }
}

3. Access, тест, выполненный программой Postman, которую я использовал.

       Доступ может быть успешным только путем добавления информации о маркере заголовка запроса .


Третье: используйте методы без аннотаций для реализации фильтров (непосредственно внедряемых в Spring).

 1.Код фильтра

import com.alibaba.fastjson.JSONObject;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;

public class TokenFilter2 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("init");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("doFilter");
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        String token = request.getHeader("token");
        System.out.println(token);
        //该方法执行后直接运行至下一个过滤器
        if(token!=null){
            filterChain.doFilter(servletRequest, servletResponse);
        }else{
            servletResponse.setCharacterEncoding("UTF-8");
            servletResponse.setContentType("application/json; charset=utf-8");
            PrintWriter out = servletResponse.getWriter();
            JSONObject res = new JSONObject();
            res.put("msg", "错误");
            res.put("success", "false");
            out.append(res.toString());
        }
    }

    @Override
    public void destroy() {
        System.out.println("destroy");
    }
}

 2.Файл конфигурации фильтра

import com.itsufu.filter.TokenFilter2;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;


@Configuration
public class FilterConfig {

    // Filter代码类
    @Bean
    public TokenFilter2 tokenFilter2() {
        return new TokenFilter2();
    }

    @Bean
    public FilterRegistrationBean getFilterRegistrationBean(TokenFilter2 tokenFilter2) {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(tokenFilter2);
        filterRegistrationBean.setOrder(2);
        filterRegistrationBean.addUrlPatterns("/user/*");
        filterRegistrationBean.setName("tokenFilter2");
        return filterRegistrationBean;
    }
}

 3. Тест аналогичен аннотации.

Вот желаю всем красавцам и красавицам, на каждом этапе пути гладкого пути! ! !

Guess you like

Origin blog.csdn.net/Microhoo_/article/details/129968379