过滤器 Filter:
过滤器实际上就是对web资源进行拦截,做一些处理后再交给下一个过滤器或 servlet 处理
通常都是用来拦截 request 进行处理的,也可以对返回的 response 进行拦截处理。
过滤器的入门使用:
- 创建一个类实现 filter 接口
- 重写方法,在doFilter()方法中写拦截的具体内容
- 根据情况决定是否放行
- 配置 Filter 的拦截路径(web.xml)
- 1.以指定资源匹配:" /index.jsp "
- 2.以目录匹配:" /servlet/* "
- 3.以后缀名匹配:" *.do "
- 4.统配符,拦截所有web资源:" /* "
注意:过滤器是在服务器启动时就会创建的,只会创建一个实例,常驻内存,也就是说服务器一启动就会执行 filter 的 init()方法,当 filter 被移除或服务器正常关闭时,会执行destroy()方法。
生命周期:
- 服务器启动,filter 创建,只创建一次
- 随机立即初始化,只初始化一次
- 灭磁拦截到都会执行 doFilter 方法
- 服务器宕机销毁
拦截器链:
- 项目中可以设置多个拦截器
- 创建类实现接口,重写方法
- 根据情况放行,放行到下一个拦截
- 多个拦截器的执行顺序,按照web.xml上下顺序执行
- 执行顺序跟
<filter>
的顺序无关<filter-mapping>
的顺序才决定执行顺序 - 如果是注释配置,那么就按照类名首字母顺序执行
过滤器链执行的特点:
- 所有的Filter 和目标资源默认都执行同一个线程
- 多个Filter 过滤器同时执行的时候,它们都要使用同一个Request 对象
全局编码格式过滤:
防止中文乱码,使用拦截器对所有请求拦截,设置编码,然后放行
//编码过滤器
public class EncodingFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException{ }
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
// 1.将request,response强制转换成Http协议下使用request,与response
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 2.操作--将编码问题解决
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
// 1.得到一个request装饰后的对象.
HttpServletRequest myreq=new MyRequest(request);
// 3.放行
chain.doFilter(myreq, response);
}
public void destroy() { }
}
身份认证拦截器:
使用拦截器,将身份过滤的代码前置到拦截器,对每个请求先进行身份认证
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/*")
// @WebFilter("/hw/*")
// @WebFilter("*.do")
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
/**
* 对请求的身份进行认证
* 请求中获得session,且session中有登录时存入的数据,说明登录成功,放行
* 请求中获得session,但是session中没有数据,说明没有登录,重定向到登录页
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 获取session
HttpServletRequest req = (HttpServletRequest) request;
HttpSession session = req.getSession( );
String requestURI = req.getRequestURI( );
/**
* 因为是拦截所有 /*
* 所以要放行 静态资源以及第一次登录的请求
*/
if(requestURI.contains("/login") ||requestURI.contains("html") || requestURI.contains("js") || requestURI.contains("css")) {
// 放行
chain.doFilter(request, response);
return;
}
// 从session获得数据
String username = (String) session.getAttribute("username");
// 判断
if (username != null){
// 放行
chain.doFilter(request, response);
} else {
HttpServletResponse resp = (HttpServletResponse) response;
resp.sendRedirect(req.getContextPath()+"/index.html");
}
}
@Override
public void destroy() { }
}