1.概念:Filter标识过滤器,是JavaWeb三大组件(Servlet,Filter,Listener)之一
2.过滤器可以把对资源的请求拦截下来,从而实行一些特殊的功能。
3.过滤器一般完成一些通用的操作,比如,权限管理,通一编码1问题,敏感字符处理 等等等...
4.Filter快速入门
(1).定义类,实现Filter接口,并重写所有方法(三个)
public class FilterDemo implements Filter{
public void init(FilterConfig filterConfig)
public void doFilter(ServletRequest request)
public void destroy(){}
}
(2).配置拦截资源的路径:在类上定义@WebFilter注解
@WebFilter("/*")//过滤器的拦截资源径
public class FilterDemo implements Filter{}的路
(3).在doFilter方法中输出1一句话,并放行
public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain
){
System.out.println("Filter 被执行了...");
//经过处理之后,在执行资源路径的操作
chain.doFilter(request,response)
}
5.Filter执行流程
1.放行后访问对应的资源,资源访问完成后,依旧会回到Filter中
2.如果回到Filter中,是执行放后的逻辑
执行放行前的逻辑(可以对request进行操作)---放行---访问资源---执行放行后的逻辑(可以对response进行操作)
6.Filter使用细节
1.filter拦截路径的配置
(1).拦截具体的资源:/index.jsp:只有访问index.jsp的时候才会被拦截
(2).目录拦截:/user/*:访问/user目录下的所有资源都会被拦截
(3).后缀名拦截;*.jsp:访问后缀名为jsp的资源,都会被拦截
(4).拦截所有:/*:访问所有资源,都会被拦截(常用)
2.过滤器链()一个web应用中,可以配置多个过滤器,这多个过滤器,被称为过滤器链(由图可知步骤)
(1)过滤器链的排序
注解配置的过滤器,优先级会按照过滤器的类名(字符串)的自然排序
案例项目结构:(这个是结合着上一个做的小项目来练手的)
LoginFilter:
package com.itheima.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
/**
* 登陆验证的过滤器
*/
@WebFilter("/*")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;//强转一个对象,为了能获取session
//判断访问的资源能路径,是否和登录注册相关
String[] urls = {"/login.jsp","/imgs/","/css/","/loginServlet","/register.jsp","/registerServlet","/checkCodeServlet"};
//获取当前访问的资源路径
String url = req.getRequestURI().toString();
//循环遍历
for(String s : urls ){
if (url.contains(s)){
//放行
filterChain.doFilter(request,response);
//break;
return;
}
}
//1.判断session是否有User键值对
HttpSession session = req.getSession();
Object user = session.getAttribute("user");
//判断user是否为null
if(user!=null){
//登录过了,放行
filterChain.doFilter(request,response);
}else{
//未登录
req.setAttribute("login_msg","您尚未登录!");
req.getRequestDispatcher("/login.jsp").forward(request,response);
}
}
@Override
public void destroy() {
}
}