SpringBoot之过滤器定义的两种方式-yellowcong

在以前的jsp开发web的时候,会在web.xml中配置过滤器和监听器,而拦截器是框架里面封装的,可以更加细粒度的控制访问哪一个类的哪一个方法。过滤器具在SpringBoot中也有两种方式实现,一种是通过代码FilterRegistrationBean,来注册过滤器,另一种是直接通过注解@WebFilter声明过滤器和@ServletComponentScan自动注册过滤器。

代码地址

#通过注解来生成过滤器
https://gitee.com/yellowcong/springboot-demo/tree/master/springboot-demo4

#通过代码来设置过滤器
https://gitee.com/yellowcong/springboot-demo/tree/master/springboot-demo5

注解实现过滤器

当使用@ServletComponentScan扫描Servlet组件时,Servlet、过滤器和监听器可以是通过@WebServlet、@WebFilter和@WebListener自动注册

目录结构
SpringBoot之过滤器定义的两种方式-yellowcong_第1张图片

配置过滤器

配置过滤器,需要实现Filter 接口,然后配置注解@WebFilter,设定filter的名称和过滤的地址。

package com.yellowcong.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;

/**
 * @author yellowcong
 * 创建日期:2018/01/31
 * 编码拦截器
 */
@WebFilter(filterName="encoderFilter",urlPatterns="/*")
public class EncoderFilter implements Filter {

    @Override
    public void destroy() {
        System.out.println("销毁过滤器");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse resposne, FilterChain filter)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        System.out.println("sessionId\t"+req.getSession().getId());
        System.out.println(req.getRemoteAddr()+"设定编码");
        request.setCharacterEncoding("UTF-8");
        filter.doFilter(request, resposne);
    }

    @Override
    public void init(FilterConfig filter) throws ServletException {
        System.out.println("画面初期化");
    }
}

配置启动类

在这个类中,加入注解@ServletComponentScan,即可完成@WebServlet、@WebFilter和@WebListener自动注册

package com.yellowcong;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

//@ServletComponentScan扫描Servlet组件时 ,
//Servlet、过滤器和监听器可以是通过@WebServlet、@WebFilter和@WebListener自动注册
@ServletComponentScan
@SpringBootApplication
public class ConfigMain {  

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

访问服务器,就会直接经过过滤器的编码设置。
SpringBoot之过滤器定义的两种方式-yellowcong_第2张图片

代码创建过滤器

目录结构

SpringBoot之过滤器定义的两种方式-yellowcong_第3张图片

过滤器

package com.yellowcong.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;

/**
 * @author yellowcong
 * 创建日期:2018/01/31
 * 编码拦截器
 */
public class PageFilter implements Filter {

    private String pageSize = "10";
    private String pageOrder = "asc";

    @Override
    public void destroy() {
        System.out.println("销毁过滤器");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse resposne, FilterChain filter)
            throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        System.out.println("sessionId\t"+req.getSession().getId());
        System.out.println("用户ip\t"+req.getRemoteAddr());
        System.out.println("用户名称\t"+req.getRemoteUser());
        System.out.println("请求编码\t"+req.getCharacterEncoding());
        System.out.println("请求访问地址\t"+req.getRequestURI());


        filter.doFilter(request, resposne);
    }

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

        this.pageSize =filter.getInitParameter("pageSize");
        this.pageOrder = filter.getInitParameter("pageOrder");

        System.out.println("画面初期化");
        System.out.println("页面大小\t"+pageSize);
        System.out.println("页面排序方式\t"+pageOrder);
    }
}

启动类配置

需要在启动器中,手动配置过滤器,一次可以配置多个。这个没有通过注解的方式方便。
当urlMapping不是很复杂时,可以通过ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean获得完整控制。如果bean实现了ServletContextInitializer接口的话则可以直接注册。

package com.yellowcong;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;

import com.yellowcong.filter.EncoderFilter;
import com.yellowcong.filter.PageFilter;

@SpringBootApplication
public class ConfigMain {  

    /**
     * 使用代码注册Servlet(不需要@ServletComponentScan注解)
     * @return
     */
    @Bean  
    public FilterRegistrationBean filterPageRegistration() {  
        FilterRegistrationBean registration = new FilterRegistrationBean();  
        registration.setFilter(new PageFilter());
        //设定匹配的路径
        registration.addUrlPatterns("/*");
        //添加初始化的参数
        registration.addInitParameter("pageSize", "100");
        registration.addInitParameter("pageOrder", "desc");
        //设定名称
        registration.setName("encodeFilter");
        //设定加载的顺序
        registration.setOrder(2);  
        return registration;  
    }

    /**
     * 
     * @return
     */
    @Bean  
    public FilterRegistrationBean filterCodeRegistration() {  
        FilterRegistrationBean registration = new FilterRegistrationBean();  
        registration.setFilter(new EncoderFilter());
        //设定匹配的路径
        registration.addUrlPatterns("/*");
        //设定加载的顺序
        registration.setOrder(2);  
        return registration;  
    }

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

运行结果

过滤器初期化的时候,就会走初期化
SpringBoot之过滤器定义的两种方式-yellowcong_第4张图片

访问后的
SpringBoot之过滤器定义的两种方式-yellowcong_第5张图片

你可能感兴趣的:(springboot,springboot)