媒介
在实际开拓进程中,常常会遇见一些好比系统启动初始化信息、统计在耳目数、在线用户数、过滤敏高词汇、会见权限节制(URL级别)等业务需求。这些对付业务来说一般上是无关的,业务方是无需干系的,业务只需要干系本身内部业务的工作。所以一般上实现以上的成果,昆山软件公司,城市或多或少的用到本日筹备讲授的过滤器
、监听器
、拦截器
来实现以上成果。
过滤器
过滤器Filter
,是Servlet
的的一个实用技能了。可通过过滤器,对请求举办拦截,好比读取session
判定用户是否登录、判定会见的请求URL是否有会见权限(利害名单)等。主要照旧可对请求举办预处理惩罚。接下来先容下,昆山软件开发,在springboot
如何实现过滤器成果。
操作WebFilter注解设置
@WebFilter
时Servlet3.0
新增的注解,原先实现过滤器,需要在web.xml
中举办设置,而此刻通过此注解,启动启动时会自动扫描自动注册。
编写Filter类:
//注册器名称为customFilter,拦截的url为所有 @WebFilter(filterName="customFilter",urlPatterns={"/*"}) @Slf4j public class CustomFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException { log.info("filter 初始化"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // TODO Auto-generated method stub log.info("doFilter 请求处理惩罚"); //对request、response举办一些预处理惩罚 // 好比配置请求编码 // request.setCharacterEncoding("UTF-8"); // response.setCharacterEncoding("UTF-8"); //TODO 举办业务逻辑 //链路 直接传给下一个过滤器 chain.doFilter(request, response); } @Override public void destroy() { log.info("filter 销毁"); } }
然后在启动类插手@ServletComponentScan
注解即可。
@SpringBootApplication @ServletComponentScan @Slf4j public class Chapter7Application { public static void main(String[] args) { SpringApplication.run(Chapter7Application.class, args); log.info("chapter7 处事启动"); } }
启动后,节制台输出:
过滤器已经生效了。但当注册多个过滤器时,无法指定执行顺序的,原本利用web。xml
设置过滤器时,是可指定执行顺序的,但利用@WebFilter
时,没有这个设置属性的(需要共同@Order
举办),所以接下来先容下通过FilterRegistrationBean
举办过滤器的注册。
–小能力–
LogFilter
和AuthFilter
,劳务派遣管理系统,此时AuthFilter
就会比LogFilter
先执行,因为首字母A
比L
前面。@Order
指定执行顺序,值越小,越先执行FilterRegistrationBean方法
FilterRegistrationBean
是springboot
提供的,此类提供setOrder要领,可觉得filter配置排序值,让spring在注册web filter之前排序后再依次注册。
改写filter
其实就输出了@webFilter注解即可。其他的都没有变革。
启动类中操作@bean
注册FilterRegistrationBean
@Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean registration = new FilterRegistrationBean(); //当过滤器有注入其他bean类时,可直接通过@bean的方法举办实体类过滤器,这样不行自动注入过滤器利用的其他bean类。 //虽然,若无其他bean需要获取时,可直接new CustomFilter(),也可利用getBean的方法。 registration.setFilter(customFilter()); //过滤器名称 registration.setName("customFilter"); //拦截路径 registration.addUrlPatterns("/*"); //配置顺序 registration.setOrder(10); return registration; } @Bean public Filter customFilter() { return new CustomFilter(); }
注册多个时,就注册多个FilterRegistrationBean即可