今天写了一个filiter,如下
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
@WebFilter(urlPatterns = "/*", filterName = "simpleT")
public class SimpleTestFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.printf("过滤器实现 start");
System.out.println(((HttpServletRequest) servletRequest).getRequestURI());
System.out.printf("过滤器实现 end");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("过滤器销毁了");
}
}
发现的问题是重复打印了,然后打开debug 发现,我定义的filter被重复注册到调用链中了。
这肯定是自己的配置出了问题。于是,我选择了,第一是改变名称,让filterName 为类名的首字母小写。
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
@Component
// @WebFilter(urlPatterns = "/*", filterName = "simpleT") 这是第一版的
@WebFilter(urlPatterns = "/*", filterName = "simpleTestFilter ")
public class SimpleTestFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.printf("过滤器实现 start");
System.out.println(((HttpServletRequest) servletRequest).getRequestURI());
System.out.printf("过滤器实现 end");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("过滤器销毁了");
}
}
这次就对了,只有一个fiiter, 哈哈对了。
但是但是 这肯定是错误的做法。因为既然可以让你自由命名,你却又不能自由命名这样的矛盾设计应该不会在成熟的社区软件中存在。肯定是我自己哪里做错了。于是有了下面的版本
import org.springframework.stereotype.Component;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
// @Component 第三版删除这个注解
// @WebFilter(urlPatterns = "/*", filterName = "simpleT") 这是第一版的
// @WebFilter(urlPatterns = "/*", filterName = "simpleTestFilter ") 这是第二版的
@WebFilter(urlPatterns = "/*", filterName = "simpleT") // 第三版和第一版相同
public class SimpleTestFilter implements Filter {
@Override
public void init(FilterConfig arg0) throws ServletException {
System.out.println("过滤器初始化");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.printf("过滤器实现 start");
System.out.println(((HttpServletRequest) servletRequest).getRequestURI());
System.out.printf("过滤器实现 end");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("过滤器销毁了");
}
}
结果如下是对的
总结:待写