文章目录
1、Filter 的基本作用
过滤器是对于访问资源请求的控制
2、Filter 的基本使用
注解 @WebFilter("/*")
这个表示对于所偶遇的请求都进行拦截
在实际的开发中,可以设置具体对于什么样的请求进行拦截
@WebFilter("/*")
public class FilterDemo implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("Filter...");
// 放行
filterChain.doFilter(servletRequest,servletResponse);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}
3、Filter 的执行流程
在放行之前,放行之后都会执行一定的代码;
4、Filter 执行需要注意的细节
4.1、拦截路径的配置
@WebFilter("/*")
拦截资源的路径,不是浏览器访问资源的路径;
4.2、拦截路链(过滤器链)
多个过滤器之间的执行逻辑
5、案例小结 - 登录验证
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpServletRequest req = (HttpServletRequest) request;
// 判断 session 中是否存在 user
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
if (user != null) {
// 放行
chain.doFilter(request, response);
} else {
req.setAttribute("logib_msg", "你没有登录过");
// 跳转到登录页面
req.getRequestDispatcher("/login.jsp").forward(req, response);
}
}
@Override
public void destroy() {
}
}
在放行的时候,需要将前端的部分资源也要放行,不然会出现前端界面无法显示;
6、小结
通过 Filter 可以对于想要访问服务器资源的请求进行控制,在放行前以及放行后都可以写一定的运行逻辑;一定程度上,减轻了服务器的压力,使得系统的稳定性得到了提升;