过滤器:filter
filter:
1.在HttpServletRequest到达 Servlet 之前,拦截客户的HttpServletRequest 。根据需要检查HttpServletRequest,也可以修改HttpServletRequest 头和数据。
2.在HttpServletResponse到达客户端之前,拦截HttpServletResponse 。根据需要检查HttpServletResponse,也可以修改HttpServletResponse头和数据。
SpringBoot 配置filter
/**
* 过滤器
*/
public class MyFilter implements Filter {
private static Logger log = LoggerFactory.getLogger(MyFilter.class);
/**
* 不过滤的地址
*/
private String[] excludedUris;
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest srequest, ServletResponse sresponse, FilterChain filterChain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) srequest;
HttpServletResponse response = (HttpServletResponse) sresponse;
String uri = request.getServletPath();
log.debug("http req {}", uri);
if (isExcludedUri(uri)) {
filterChain.doFilter(srequest, sresponse);
} else {
log.debug("http req do not access {}", uri);
response.sendRedirect(request.getContextPath() + "/html/c");
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
/**加载初始化参数*/
excludedUris = filterConfig.getInitParameter("excludedUri").split(",");
}
/**
* 判断uri是否过滤
* @param uri
* @return
*/
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;
}
}
webmvc配置filter使其生效,并配置初始化参数和拦截路径
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean<?> testFilterRegistration() {
// 配置无需过滤的路径或者静态资源,如:css,imgage等
StringBuffer excludedUriStr = new StringBuffer();
excludedUriStr.append("/html/c");
FilterRegistrationBean<MyFilter> registration = new FilterRegistrationBean<MyFilter>();
registration.setFilter(new MyFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter("excludedUri", excludedUriStr.toString());
registration.setName("MyFilter");
registration.setOrder(1);
return registration;
}
}
栗子
我们有3个请求 过滤器过滤路径 /* 过滤规则 全部跳转到html/c
/html/a – a.html 过滤
/html/b –b.html 过滤
/html/c –c.html 不过滤
启动项目访问任意路径 都会被拦截,并重定向到html/c–c.html中