Javaweb学习笔记之filter

Filter

  • 概念:Filter表示过滤器,是JavaWeb三大组件(Servlet、Filter、Listener)之一。
  • 过滤器可以把对资源的请求拦截下来,从而实现一些特殊的功能。
  • 过滤器一般完成一些通用的操作,比如:权限控制、统一编码处理、敏感字符处理等等

Filter快速入门

  1. 定义类,实现Filter接口,并重写其所有方法

    public class FilterDemo implements Filter {
    	public void init(FilterConfig filterConfig);
        public void doFilter(ServletRequest request);
        public void destroy() {}
    }
    
  2. 配置Filter拦截资源的路径:在类上定义@WebFilter注解

    @WebFilter
    public class FilterDemo implements Filter{
        
    }
    
  3. doFilter方法中输出一句话,并放行

    public void doFilter(ServletRequest request,ServletResponse response) {
    	System.out.println( "filter被执行了...");//放行
    	chain.doFilter(request, response);
    }
    

Filter 执行流程

在这里插入图片描述

  1. 放行后访问对应资源,资源访问完成后,还会回到Filter中吗?

  2. 如果回到Filter中,是重头执行还是执行放行后的逻辑呢?

    放行后逻辑

    执行放行前逻辑
    放行
    访问资源
    执行放行后逻辑
  3. 放行前,对Request数据进行处理

  4. 放行后,对Response数据进行处理

Filter使用细节

Filter拦截路径配置

  • Filter可以根据需求,配置不同的拦截资源路径

    @WebFilter("/*")
    public class FilterDemo
    
  • 拦截具体的资源:/index.jsp:只有访问index.jsp时才会被拦截

  • 目录拦截:/user/*:访问/user下的所有资源,都会被拦截

  • 后缀名拦截: *.jsp:访问后缀名为jsp的资源,都会被拦截

  • 拦截所有:/*:访问所有资源,都会被拦截

过滤器链

  • 一个Web应用,可以配置多个过滤器,这多个过滤器称为过滤器链

在这里插入图片描述

  • 注解配置的Filter,优先级按照过滤器类名(字符串)的自然排序

案例

在这里插入图片描述

package com.jihua.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 登录验证 filter
 */

@WebFilter("/*")
public class LoginFilter implements Filter {

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest sq = (HttpServletRequest) servletRequest;
        //判断访问资源是否和登录注册相关
        String[] urls = {"index","/login.jsp", "/imgs", "css", "loginServlet", "register.jsp", "registerServlet"};
        String requestURL = sq.getRequestURL().toString();
        //遍历判断
        for (String url : urls) {
            if (requestURL.contains(url)) {
                //是登录注册页面,放行
                filterChain.doFilter(servletRequest, servletResponse);
                return;
            }
        }
        //判断Session中是否有User
        HttpSession session = sq.getSession();
        Object user = session.getAttribute("user");
        if (user != null) {
            //登陆了,放行
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //没登陆,拦截,跳转到登录页面
            servletRequest.setAttribute("login_msg", "您尚未登录");
            servletRequest.getRequestDispatcher("/login.jsp").forward(servletRequest, servletResponse);
        }
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    @Override
    public void destroy() {

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值