您的位置:首页 > 编程语言 > Java开发

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

2018-01-31 16:11 507 查看
在以前的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[/code] 

注解实现过滤器

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

目录结构



配置过滤器

配置过滤器,需要实现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);
}
}


访问服务器,就会直接经过过滤器的编码设置。



代码创建过滤器

目录结构



过滤器

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);
}
}


运行结果

过滤器初期化的时候,就会走初期化



访问后的

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: