过滤器只是服务器端的组件,它可以截取客户端的请求和响应信息
过滤器的生命周期:
实例化:在web容器启动时,通过web.xml进行配置,然后就会加载过滤器,实例化只进行一次。
初始化:过滤器加载成功,初始化一些初始化信息,会调用过滤器的init(),进行初始化相关操作,初始化也只执行一次。
过滤方法:是针对过滤器中的doFilter()方法;过滤方法执行n多次,因为每次客户端请求都会执行过滤方法。
销毁生命周期:它执行的是过滤器的destroy()方法,该方法在web容器关闭时进行使用,做一些处理工作。
创建一个过滤器类
package com.whc.noteserver.web;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
public class AccessFilter implements Filter{
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
//这个方法完成实际的过滤操作。这个地方是过滤器的核心方法。
// 当用户请求访问与过滤器关联的URL时,web容器将先调用过滤器的doFilter方法。
// FilterChain参数可以调用chain.doFilter方法,
// 将请求传给下一个过滤器(或目标资源),或利用转发,重定向将请求转发到其他资源。
HttpServletResponse res=(HttpServletResponse)response;//子类
HttpServletRequest req=(HttpServletRequest)request;
String path=req.getRequestURI();
System.out.println(path);
if (path.endsWith("login.html") || path.endsWith("register.html")) {
chain.doFilter(request, response);
return;
}
HttpSession session =req.getSession();
Object id=session.getAttribute("id");
if (id==null) {
//System.out.println("用户未登录");
String contextPath=req.getContextPath();
res.sendRedirect(contextPath+"/login.html");
return;
}
chain.doFilter(request, response);
} }
web.xml的配置
FirstFilter com.great.filter.FirstFilter FirstFilter /index.jsp 多个过滤器的情况下,会先执行第一个过滤器chain.doFilter()前的代码,然后doFilter()到达第二个过滤器。第二个过滤器也会先执行chain.doFilter()前的代码,然后doFilter()到达Servlet.service()方法。之后在返回过滤器2 doFilter()之后的代码,在返回过滤器1doFilter之后的代码,最后才返回用户。
过滤器的分类:request,forward,include,error 默认是request
1.forward 与request 的区别:forward 指的是使用了服务器跳转时需要经过过滤器(在请求转发时,服务器的内部转发),而request表示使用客户端跳转时需要经过过滤器(重定向时,客户端的地址改变),
服务器跳转采用jsp:forward动作标签和request.getRequestDispatcher(“login.jsp”).forward(request,response)方式进行跳转
客户端跳转表示使用response.sendRedirect()方式进行跳转