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); } }运行结果
过滤器初期化的时候,就会走初期化
访问后的
相关文章推荐
- SpringBoot之Servlet定义的两种方式-yellowcong
- Spring Boot中防止递归查询的两种方式
- Spring boot 整合Swagger的两种方式
- 关于给springboot添加定时器的两种方式
- Spring-boot中读取config配置文件的两种方式
- 关于给springboot添加定时器的两种方式
- 3.Spring Boot + Security初步使用(覆盖配置的两种方式 配置类和XML注入以自定义页面为例)
- Spring-boot中读取config配置文件的两种方式
- 基于springboot搭建dubbo框架(注解和xml配置两种方式)
- springboot通过java bean集成通用mapper的两种方式
- Spring Boot 注解启动的两种方式
- spring boot 集成quartz 2.0 实现前端动态配置(获取spring上下文)的两种方式,启动数据库中已开启定时任务
- 浅谈Spring的两种事务定义方式
- 通过IntelliJ IDEA创建spring boot 项目的两种方式之方式一
- Spring Boot 实现热部署两种方式
- springboot读取自己定义的配置文件的方式以及使用joda_time来处理时间日期
- spring boot与thymeleaf页面传参两种方式
- 详解Spring-boot中读取config配置文件的两种方式
- [Java]从spring(spring boot)的启动分析注解定义方式的bean的加载
- 通过IntelliJ IDEA创建spring boot 项目的两种方式之方式二