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

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

   

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不同:按照文件中由上而下的顺序)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  filter spring boot s