Filter
- 概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
- 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
- 过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等
Filter快速入门
-
定义类,实现Filter接口,并重写其所有方法
public class FilterDemo implements Filter { public void init(FilterConfig filterConfig); public void doFilter(ServletRequest request); public void destroy() {} }
-
配置Filter拦截资源的路径:在类上定义
@WebFilter
注解@WebFilter public class FilterDemo implements Filter{ }
-
在
doFilter
方法中输出一句话,并放行public void doFilter(ServletRequest request,ServletResponse response) { System.out.println( "filter被执行了...");//放行 chain.doFilter(request, response); }
Filter 执行流程
-
放行后访问对应资源,资源访问完成后,还会回到Filter中吗?
会
-
如果回到Filter中,是重头执行还是执行放行后的逻辑呢?
放行后逻辑
-
放行前,对Request数据进行处理
-
放行后,对Response数据进行处理
Filter使用细节
Filter拦截路径配置
-
Filter可以根据需求,配置不同的拦截资源路径
@WebFilter("/*") public class FilterDemo
-
拦截具体的资源:
/index.jsp
:只有访问index.jsp时才会被拦截 -
目录拦截
:/user/*
:访问/user下的所有资源,都会被拦截 -
后缀名拦截:
*.jsp
:访问后缀名为jsp的资源,都会被拦截 -
拦截所有:
/*
:访问所有资源,都会被拦截
过滤器链
- 一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链
- 注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序
案例
package com.jihua.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* 登录验证 filter
*/
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest sq = (HttpServletRequest) servletRequest;
//判断访问资源是否和登录注册相关
String[] urls = {"index","/login.jsp", "/imgs", "css", "loginServlet", "register.jsp", "registerServlet"};
String requestURL = sq.getRequestURL().toString();
//遍历判断
for (String url : urls) {
if (requestURL.contains(url)) {
//是登录注册页面,放行
filterChain.doFilter(servletRequest, servletResponse);
return;
}
}
//判断Session中是否有User
HttpSession session = sq.getSession();
Object user = session.getAttribute("user");
if (user != null) {
//登陆了,放行
filterChain.doFilter(servletRequest, servletResponse);
} else {
//没登陆,拦截,跳转到登录页面
servletRequest.setAttribute("login_msg", "您尚未登录");
servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void destroy() {
}
}