Servlet学习——过滤器

2023-04-16 14:48:10 浏览数 (2)

Filter过滤器

代码语言:javascript复制
【过滤器的实现】
         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对象,并将当前用户存入session作用域中 HttpSession session = req.getSession(); session.setAttribute(“myUser”,user1);

代码语言:javascript复制
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;;
    }
}

0 人点赞