Java过滤器能够对目标资源的请求和响应进行过滤和拦截
过滤器实现的过程
1、实现Filter接口
2、重写doFilter方法,
通过filterChain.doFilter(request,response);放行方法,将请求传递下去,如果没有使用该方法则请求停留在过滤器中,不会继续向后请求。
3、配置访问拦截的路径--确定哪些请求需要进行过滤,那些不需要
一、字符过滤--通过在web.xml中配置
public class EncodingFilter implements Filter {
String encoding = null;
@Override
public void init(FilterConfig filterConfig) throws ServletException {
encoding = filterConfig.getInitParameter("encoding");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("encoding:"+encoding);
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset="+encoding);
//请求向后传递
filterChain.doFilter(request,response);
}
}
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.filter.EncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
二、登录过滤--通过注解进行过滤
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter("/*")
public class LoginFilter implements Filter {
//设置白名单--对部分请求直接放行
String[] whiteNames = {"/","/index.jsp","/login.jsp","/loginShow","/loginSubmit"};
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String uri = request.getRequestURI();
uri = uri.substring(uri.lastIndexOf("/"));
boolean inWhiteNames = false;
for (String name : whiteNames){
if(name.equals(uri)){
inWhiteNames = true;
break;
}
}
if(inWhiteNames){
filterChain.doFilter(request,response);
}else{
if(request.getSession().getAttribute("username")==null){
request.getRequestDispatcher("/login.jsp").forward(request,response);
}else{
filterChain.doFilter(request,response);
}
}
}
}
三、过滤器的执行流程
客户端发出请求-->过滤器-->放行-->请求的资源-->响应-->过滤器-->客户端
过滤器1-->过滤器2-->执行请求-->过滤器2-->过滤器1
四、过滤器的生命周期
init():初始化-->doFilter():放行方法-->destroy():销毁方法