java web过滤器的使用

过滤器只是服务器端的组件,它可以截取客户端的请求和响应信息

过滤器的生命周期:
实例化:在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()方式进行跳转
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44095453/article/details/106312195