spring boot web filter的使用

来源:互联网 发布:孙俪的淘宝店怎么找 编辑:程序博客网 时间:2024/05/16 12:11

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

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. */@Configurationpublic 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 || 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;        }    }//    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不同:按照文件中由上而下的顺序)

原创粉丝点击