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 || 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;
// }
// }
}