介绍
JavaWeb 的三大组件之一
JavaEE 的规范,就是接口
作用
拦截请求,过滤响应
工作原理
生命周期
启动Servlet容器时,通过反射创建实例,调用
init()方法,仅调用一次。当请求的url,与过滤路径匹配时,被
doFilter()方法拦截Servlet容器关闭时,调用
destroy()方法,然后销毁实例
应用场景
设置字符集
登录验证
过滤IP
权限检查
实现方式
实现 javax.servlet.Filter 接口
实现接口的 doFilter() 方法
配置web.xml
将 Servlet 配置 web.xml 中
注解(新方式)
设置字符集
例子:登录验证
public class LoginFilter implements Filter {
public LoginFilter(){
System.out.println("LoginFilter构造方法");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("init()方法");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain fc) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest)servletRequest;
HttpServletResponse resp=(HttpServletResponse)servletResponse;
//如果访问登录页面,不拦截
String uri=req.getRequestURI();
if(uri.contains("login.jsp")){
fc.doFilter(req, resp);
return;
}
HttpSession session=req.getSession();
Object user=session.getAttribute("user");
if(user!=null) {
fc.doFilter(req, resp);
}else {
String contextPath=req.getContextPath();
resp.sendRedirect(contextPath+"/login.jsp");
}
}
@Override
public void destroy() {
System.out.println("destroy()方法");
}
}
配置web.xml
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>top.malaoshi.LoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<!-- 任何请求都被拦截 -->
<url-pattern>/*</url-pattern>
</filter-mapping>
