Filter过滤器
【过滤器的实现】 1、创建普通java类 2、实现Filter接口 implements Filter 3、实现方法 重写 三个方法 4、设置过滤的资源 @WebFilter("/需要过滤的资源路径") 【过滤器的作用】 截取客户端和服务器之间的请求与响应的信息(可以对这些信息进行操作修改),并对这些信息进行过滤 也可以在过滤器中设置编码格式 就可以达到处理乱码的效果 而不需要逐一修改 【过滤器执行的顺序】(过滤器在文件前面谁先执行) 客户端发起请求->过滤器1-放行->过滤器2-放行->资源->过滤器2->过滤器1->客户端 【过滤器生命周期】 Filter接口有三个方法,并且这个三个都是与Filter的生命相关的方法 init(Filterconfig): 代表filter对象初始化方法 filter对象创建时执行 doFilter(ServletRequest,ServletResponse,FilterChain): 代表filter执行过滤的核心方法,如果某资源在已经被配置到这个filter进行过滤的话,那么每次访问这个资源都会执行doFilter方法 destory(): 代表是filter销毁方法 当filter对象销毁时执行该方法1)
实例:非法访问拦截
此时已存在的条件:
在登录的时候会创建session对象,并将当前用户存入sessi\on作用域中
HttpSession session = req.getSession();
session.setAttribute(“myUser”,user1);
import com.hyy.taobao.api.entity.User; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 实例: * 非法访问拦截 * * 拦截的资源 * 拦截所有资源 * 需要放行的资源 * 不需要登录即可访问的页面 * 1、放行指定页面:不需要登录即可访问的页面(例如登录页面、注册页面) * 2、放行静态页面:(例如CSS、JS、Image等资源) * 3、放行指定操作:不需要登录即可进行的操作(如登录操作、注册操作) * 4、登录状态放行:(如果存在指定的session对象,即为登录状态) */ @WebFilter("/过滤(拦截)资源的路径") public class Filter03 implements Filter { /** * 代表filter对象初始化方法 filter对象创建时执行 * * @param filterConfig * @throws ServletException */ @Override public void init(FilterConfig filterConfig) throws ServletException { } /** * 代表是filter销毁方法 当filter对象销毁时执行该方法 */ @Override public void destroy() { } /** * 代表filter执行过滤的核心方法, * 如果某资源在已经被配置到这个filter进行过滤的话, * 那么每次访问这个资源都会执行doFilter方法 * * @param servletRequest tomcat容器在获取到客户端请求时创建的Request和Response对象 * @param servletResponse tomcat容器在获取到客户端请求时创建的Request和Response对象 * @param filterChain ChainFilter链:它可以指向下一个资源,如果还有过滤器,则继续进行下一次的过滤,如果没有过滤器,则会指向资源(servlet)。 * @throws IOException * @throws ServletException */ @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { // 基于HTTP HttpServletRequest httpServletRequest = (HttpServletRequest)servletRequest; HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse; // 得到请求的路径 String path = httpServletRequest.getRequestURI(); // 1、放行指定页面,不需要登录就可与访问的页面(例如登录页面、注册页面) if (path.contains("/login.jsp") || path.contains("register.jsp")){ filterChain.doFilter(servletRequest,servletResponse); return; } // 2、放行静态页面(例如CSS、JS、Image等资源) if (path.contains("/js")){ filterChain.doFilter(servletRequest, servletResponse); return; } // 3、放行指定操作:不需要登录即可进行的操作(如登录操作、注册操作) // 检查你是否在做登录或注册操作 是 放行 否则拦截 if (path.contains("/loginServlet")){ filterChain.doFilter(servletRequest, servletResponse); return; } // 4、登录状态放行:(如果存在指定的session对象,即为登录状态) // 得到Session对象 User myUser = (User) httpServletRequest.getSession().getAttribute("myUser"); if (myUser != null) { filterChain.doFilter(servletRequest,servletResponse); return; } httpServletResponse.sendRedirect("index.jsp"); return;; } }