spring boot web filter的使用
2017-08-01 22:35
459 查看
spring boot web filter的使用
作为web的开发人员相信对于filter并不陌生,各种各样的filter都需要在web.xml中配置, 如下图:
而在springboot中将提供两种方式来配置filter:您可以为其提供Spring Bean,也可以启用扫描Servlet组件。
1.1使用Spring bean添加Servlet,过滤器或监听器
要添加一个Servlet,,Filter或者Servlet *Listener提供一个@Bean定义。当您想要注入配置或依赖项时,这可能非常有用。但是,你必须非常小心,
他们不会引起太多其他豆类的渴望初始化,因为它们必须安装在容器中的应用程序生命周期的早期(例如,它不是一个好主意,让他们依赖于你DataSource或JPA组态)。
您可以通过初次使用而不是初始化来初始化它们来解决这样的限制。
在这种情况下Filters,Servlets您还可以通过添加FilterRegistrationBean或ServletRegistrationBean替代底层组件来添加映射和init参数。
[注意]
如果dispatcherType在过滤器注册上指定了否,则它将匹配 FORWARD,INCLUDE和REQUEST。如果异步已经启用,它也会匹配ASYNC。
如果您正在迁移没有dispatcher元素的过滤器,web.xml则需要指定一个dispatcherType:
@Bean
public FilterRegistrationBean myFilterRegistration(){
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setDispatcherTypes(DispatcherType.REQUEST);
....
return
registration;
}
禁止注册一个Servlet或Filter
如上所述, any Servlet 或Filterbeans将会自动向servlet容器注册。要禁用特定Filter或Servletbean的注册,请为其创建注册bean,并将其标记为禁用。例如:
@Bean
public FilterRegistrationBean注册(MyFilter filter){
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
}
1.2使用类路径扫描添加Servlet,过滤器和监听器
@WebServlet,@WebFilter并且@WebListener注释类可以通过@Configuration使用@ServletComponentScan并指定包含要注册的组件的包来注释类,
从而自动向嵌入的servlet容器注册。默认情况下,@ServletComponentScan将从注释类的包中进行扫描。
本章采用 第一种方法:主要分为两大步:
1.创建一个filter类,实现Filter接口,实现方法写入要处理的逻辑;
2.通过@Configuration注解将filter类加入过滤链
具体实现代码如下:(说明:本例为了方便将filter类以内部类的形式创建,也可单独提取出来作为一个独立的外部类 )
小提示:通过例子可得知此filter只配置了一个,但是实际开发中有时一个filter是远远不够的需要配置多个不同的filter实现不同的业务处理,在常规的web.xml中配置多个filter标签
即可,springboot中怎么配置多个呢,其实也很简单,其实示例代码中已经贴出来了,只要将示例代码中的注释部分放开就可以了,此示例只是演示了两个filter的配置,如需配置更多依次
叠加即可,具体的执行顺序可通过registration.setOrder(1);来指定(与web.xml不同:按照文件中由上而下的顺序)
作为web的开发人员相信对于filter并不陌生,各种各样的filter都需要在web.xml中配置, 如下图:
而在springboot中将提供两种方式来配置filter:您可以为其提供Spring Bean,也可以启用扫描Servlet组件。
1.1使用Spring bean添加Servlet,过滤器或监听器
要添加一个Servlet,,Filter或者Servlet *Listener提供一个@Bean定义。当您想要注入配置或依赖项时,这可能非常有用。但是,你必须非常小心,
他们不会引起太多其他豆类的渴望初始化,因为它们必须安装在容器中的应用程序生命周期的早期(例如,它不是一个好主意,让他们依赖于你DataSource或JPA组态)。
您可以通过初次使用而不是初始化来初始化它们来解决这样的限制。
在这种情况下Filters,Servlets您还可以通过添加FilterRegistrationBean或ServletRegistrationBean替代底层组件来添加映射和init参数。
[注意]
如果dispatcherType在过滤器注册上指定了否,则它将匹配 FORWARD,INCLUDE和REQUEST。如果异步已经启用,它也会匹配ASYNC。
如果您正在迁移没有dispatcher元素的过滤器,web.xml则需要指定一个dispatcherType:
@Bean
public FilterRegistrationBean myFilterRegistration(){
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setDispatcherTypes(DispatcherType.REQUEST);
....
return
registration;
}
禁止注册一个Servlet或Filter
如上所述, any Servlet 或Filterbeans将会自动向servlet容器注册。要禁用特定Filter或Servletbean的注册,请为其创建注册bean,并将其标记为禁用。例如:
@Bean
public FilterRegistrationBean注册(MyFilter filter){
FilterRegistrationBean registration = new FilterRegistrationBean(filter);
registration.setEnabled(false);
return registration
}
1.2使用类路径扫描添加Servlet,过滤器和监听器
@WebServlet,@WebFilter并且@WebListener注释类可以通过@Configuration使用@ServletComponentScan并指定包含要注册的组件的包来注释类,
从而自动向嵌入的servlet容器注册。默认情况下,@ServletComponentScan将从注释类的包中进行扫描。
本章采用 第一种方法:主要分为两大步:
1.创建一个filter类,实现Filter接口,实现方法写入要处理的逻辑;
2.通过@Configuration注解将filter类加入过滤链
具体实现代码如下:(说明:本例为了方便将filter类以内部类的形式创建,也可单独提取出来作为一个独立的外部类 )
package com.zxl.examples.filter; import org.apache.catalina.filters.RemoteIpFilter; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Created by Administrator on 2017/7/27. */ @Configuration public class WebConfiguration { @Bean public RemoteIpFilter remoteIpFilter() { return new RemoteIpFilter(); } @Bean public FilterRegistrationBean testFilterRegistration() { //配置无需过滤的路径或者静态资源,如:css,imgage等 StringBuffer excludedUriStr = new StringBuffer(); excludedUriStr.append("/login/*"); excludedUriStr.append(","); excludedUriStr.append("/favicon.ico"); excludedUriStr.append(","); excludedUriStr.append("/js/*"); FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new MyFilter()); registration.addUrlPatterns("/*"); registration.addInitParameter("excludedUri", excludedUriStr.toString()); registration.setName("MyFilter"); registration.setOrder(1); return registration; } // @Bean // public FilterRegistrationBean testFilterRegistration2() { // //配置无需过滤的路径或者静态资源,如:css,imgage等 // StringBuffer excludedUriStr = new StringBuffer(); // excludedUriStr.append("/login/*"); // excludedUriStr.append(","); // excludedUriStr.append("/favicon.ico"); // excludedUriStr.append(","); // excludedUriStr.append("/js/*"); // // FilterRegistrationBean registration = new FilterRegistrationBean(); // registration.setFilter(new MyFilter2()); // registration.addUrlPatterns("/login/login"); // registration.addInitParameter("excludedUri", excludedUriStr.toString()); // registration.setName("MyFilter2"); // registration.setOrder(2); // return registration; // } public class MyFilter implements Filter { private String[] excludedUris; @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain) throws IOException, ServletException { // TODO Auto-generated method stub HttpServletRequest request = (HttpServletRequest) srequest; HttpServletResponse response = (HttpServletResponse) sresponse; System.out.println("this is MyFilter,url :"+request.getRequestURI()); String uri = request.getServletPath(); if(isExcludedUri(uri)){ filterChain.doFilter(srequest, sresponse); }else if(request.getSession().getAttribute("user")!=null){ filterChain.doFilter(srequest, sresponse); }else{ response.sendRedirect(request.getContextPath() + "/login/toLogin"); } } @Override public void init(FilterConfig filterConfig) throws ServletException { // TODO Auto-generated method stub excludedUris = filterConfig.getInitParameter("excludedUri").split(","); } private boolean isExcludedUri(String uri) { if (excludedUris == null || excluded 4000 Uris.length <= 0) { return false; } for (String ex : excludedUris) { uri = uri.trim(); ex = ex.trim(); if (uri.toLowerCase().matches(ex.toLowerCase().replace("*",".*"))) return true; } return false; } } // public class MyFilter2 implements Filter { // // private String[] excludedUris; // // @Override // public void destroy() { // // TODO Auto-generated method stub // } // // @Override // public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain) // throws IOException, ServletException { // // TODO Auto-generated method stub // HttpServletRequest request = (HttpServletRequest) srequest; // HttpServletResponse response = (HttpServletResponse) sresponse; // System.out.println("this is MyFilter,url :"+request.getRequestURI()); // String uri = request.getServletPath(); // if(isExcludedUri(uri)){ // filterChain.doFilter(srequest, sresponse); // }else if(request.getSession().getAttribute("user")!=null){ // filterChain.doFilter(srequest, sresponse); // }else{ // response.sendRedirect(request.getContextPath() + "/login/toLogin"); // } // } // // @Override // public void init(FilterConfig filterConfig) throws ServletException { // // TODO Auto-generated method stub // excludedUris = filterConfig.getInitParameter("excludedUri").split(","); // } // // private boolean isExcludedUri(String uri) { // if (excludedUris == null || excludedUris.length <= 0) { // return false; // } // for (String ex : excludedUris) { // uri = uri.trim(); // ex = ex.trim(); // if (uri.toLowerCase().matches(ex.toLowerCase().replace("*",".*"))) // return true; // } // return false; // } // } }
小提示:通过例子可得知此filter只配置了一个,但是实际开发中有时一个filter是远远不够的需要配置多个不同的filter实现不同的业务处理,在常规的web.xml中配置多个filter标签
即可,springboot中怎么配置多个呢,其实也很简单,其实示例代码中已经贴出来了,只要将示例代码中的注释部分放开就可以了,此示例只是演示了两个filter的配置,如需配置更多依次
叠加即可,具体的执行顺序可通过registration.setOrder(1);来指定(与web.xml不同:按照文件中由上而下的顺序)
相关文章推荐
- Spring Boot实战之Filter实现使用JWT进行接口认证 jwt(json web token) 用户发送按照约定,向服务端发送 Header、Payload 和 Signature,
- Spring Boot中使用@WebFilter的Filter不起作用解决方案
- Spring Boot 之FilterRegistrationBean --支持web Filter 排序的使用
- Spring Boot 之web Filter --不支持排序的使用
- Spring Boot 之FilterRegistrationBean --支持web Filter 排序的使用
- Spring Boot 之web Filter --支持排序的使用扩展
- 在spring boot中使用@WebFilter配置filter(包括排除URL)
- 使用Spring Boot开发Web项目
- 使用Spring Boot开发Web项目(二)之添加HTTPS支持
- Spring Boot(十一)使用AOP,@Aspect统一处理Web请求日志
- Spring Boot中使用AOP统一处理Web请求日志
- 使用Spring Boot开发Web项目(二)之添加HTTPS支持
- 使用Spring Boot开发Web项目(二)之添加HTTPS支持
- 使用Spring Boot开发Web项目
- 在SpringBoot中使用 Servlet Filter Listener
- 使用Spring Boot开发Web项目
- 使用spring boot和thymeleaf提供web内容
- 使用Spring Boot开发Web项目
- 使用Spring Boot开发Web项目
- 46. Spring Boot中使用AOP统一处理Web请求日志【从零开始学Spring Boot】