首页 > 其他分享 >Filter拦截器从入门到快速上手

Filter拦截器从入门到快速上手

时间:2022-10-21 13:00:07浏览次数:68  
标签:拦截器 入门 登录 req Filter 放行 过滤器 public

前置内容:

1、 Filter快速入门

  • 使用步骤

    1. 定义类并实现Filter接口
    2. 定义@WebFilter注解,配置拦截路径
    3. 放行
    4. (请求其他资源)
  • Demo

    package priv.dandelion.controller.filter;
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    
    @WebFilter("/*")
    public class FilterDemo implements Filter {
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            // 放行前逻辑
            System.out.println("FilterDemo...");
    
            // 放行
            filterChain.doFilter(servletRequest, servletResponse);
    
            // 放行后逻辑
        }
    
        @Override
        public void destroy() {
    
        }
    }
    
    

2、 Filter执行流程

  1. 浏览器发送请求到服务器
  2. Filter拦截请求
  3. 执行放行前逻辑
  4. 放行请求
  5. 访问对应资源
  6. 执行放行后逻辑
  7. 服务器对浏览器做出响应

3、 Filter使用细节

  • 拦截路径配置

    • 拦截具体资源:/index.jsp
    • 目录拦截:/user/*
    • 后缀名拦截:*.jsp
    • 拦截所有:/*
  • 过滤器链

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

      • 多个过滤器逐一放行
      • 请求资源
      • 按照递归顺序执行过滤器链的放行后逻辑
    • 过滤器链的过滤顺序

      • 若使用注解配置过滤器,则按照全类名进行排序,即为过滤器链的执行顺序
      • 可在XML中配置顺序

4、 案例

  • 需求

    • 访问服务器资源时,需要先进行登录验证,如果没有登录则自动跳转到登录页面
  • 方式

    • 判断请求资源是否和登录注册相关,若是则放行
    • 判断Session中是否有User对象,若有则放行,否则跳转到登录
  • 环境准备

    环境和案例框架见:用户登录注册案例

  • 代码实现

    package priv.dandelion.controller.filter;
    
    
    import javax.servlet.*;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import java.io.IOException;
    
    @WebFilter("/*")
    public class LoginFilter implements Filter {
    
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
    
        }
    
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
            HttpServletRequest req = (HttpServletRequest) servletRequest;
    
            // 判断访问的资源是否和登录注册相关
            String[] urls = {"/login.jsp", "/register.jsp", "/imgs/", "/css/", "/login", "/register", "/checkCode"};
            // 获取当前访问资源的路径
            String requestURL = req.getRequestURL().toString();
    
            for (String url : urls) {
                if (requestURL.contains(url)) {
                    // 若为和登录注册相关的资源,则放行并直接结束过滤器执行
                    System.out.println(url);
                    filterChain.doFilter(req, servletResponse);
                    return;
                }
            }
    
            // 判断Session中是否有user
            // 获取Session
            Object user = req.getSession().getAttribute("user");
    
            if (user != null) {
                // 放行
                System.out.println("已登录,放行"+ user);
                filterChain.doFilter(servletRequest, servletResponse);
            } else {
                // 存储提示信息,拦截跳转到登录页面
                System.out.println("未登录,将跳转到登录页面");
                req.setAttribute("login_msg", "您尚未登录!");
                req.getRequestDispatcher("/login.jsp").forward(req, servletResponse);
            }
    
        }
    
        @Override
        public void destroy() {
    
        }
    }
    

标签:拦截器,入门,登录,req,Filter,放行,过滤器,public
From: https://www.cnblogs.com/dandelion-000-blog/p/16813114.html

相关文章

  • JMETER入门-简介和安装
    ApacheJMeter是Apache组织基于Java开发的压力测试工具,用于对软件做压力测试。一、什么是JMETER?    JMeter最初被设计用于Web应用测试,但后来扩展到了其......
  • 【C++入门】(九)使用继承拓展类
    1.什么是继承?基类(classAnimal)可以有多个派生类(classDog:publicAnimal)classAnimal//基类{public:stringname="123";intage;};​classDo......
  • 【C++入门】(七)高级函数
    1.如何重载成员函数?函数重载:编写多个名称相同但参数不同的函数成员函数也可以重载编译器根据参数数量和类型决定调用哪个构造函数classRectangle{public......
  • 过滤器和拦截器的区别
    过滤器是基于函数回调,拦截器是基于java的反射机制;过滤器依赖于servlet容器,拦截器不依赖servlet容器;过滤器几乎可以对所有请求起作用,但是拦截器只对action请求起作用;拦......
  • AJAX入门
    AJAX入门概念:AJAX:异步的JavaScript和XMLAJAX的作用:与服务器进行数据交换:通过AJAX可以给服务器发送请求,并获取服务器响应数据使用了AJAX和服务器进行通信,就可以使用HTM......
  • JSP入门
    JSP入门JSP(全称JavaServerPages)是由SunMicrosystems公司倡导和许多公司参与共同创建的一种使软件开发者可以响应客户端请求,而动态生成HTML、XML或其他格式文档的We......
  • Element快速入门
    Element快速入门概念:Element,一套为开发者、设计师和产品经理准备的基于Vue2.0的组件库,提供了配套设计资源,帮助你的网站快速成型。由饿了么公司前端团队开源。搭建Elem......
  • Go 语言入门很简单:什么是 Golang
    Golang是一种相对较新的编程语言,很快就流行起来。StackOverflow对开发人员进行了民意调查,发现Golang是学习Go编程语言的第三大热门。为了更好地理解为什么Go如此......
  • SpringBoot 过滤器、监听器、拦截器
    过滤器过滤器Filter,是Servlet的的一个实用技术了。可通过过滤器,对请求进行拦截,比如读取session判断用户是否登录、判断访问的请求URL是否有访问权限(黑白名单)等。主要还......
  • 数据行业非完全入门指南!
    作者:桔了个仔,南洋理工大学,Datawhale成员之前给从传统制造业转行的数据行业的朋友列的一个笔记,这里把原文贴出来。现在看来概括性不够,不过适合对大数据没有太多了解但想入行......