Java研学-过滤与监听

news2024/11/19 15:24:59

一 过滤器 Filter

1 介绍

  Java Web 组件之一(Servlet 的功能),可改变一个request和修改一个response。Filter不是Servlet,不能产生一个response,它是在一个request 到达Servlet之前预处理 request,也可以在response离开Servlet 后处理 response。
Filter流程
  过滤器通常使用在字符编码处理;登录校验;论坛敏感字过滤;做前端框架的分发器等场景

2 语法

// 类似Servlet 定义类实现Filter接口 覆盖其中三个方法
void destroy()
// 处理请求响应
void doFilter(ServletRequest req,ServletResponse resp,FilterChain chain)
void init(FilterConfig filterConfig)
// 编辑完成后交给Tomcat管理

3 demo

① HelloFilter

public class HelloFilter implements Filter {
    // 初始化方法
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    // 过滤方法
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("This Filter");
        filterChain.doFilter(req,resp);
    }
    // 销毁方法
    @Override
    public void destroy() {
    }
}

② web.xml配置

	<filter>
        <filter-name>HelloFilter</filter-name>
        <filter-class>cn.tj.web.servlet.HelloFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HelloFilter</filter-name>
        <url-pattern>/hello</url-pattern>
    </filter-mapping>

4 过滤路径

  不同于 Servlet 的 url-pattern,过滤器的url-pattern 是指 Filter 对哪些资源做过滤操作。
  Servlet 的 url-pattern:为当前Servlet起一个资源名称,可通过该名字找到对应的Servlet 对象。

  Filter 的 url-pattern:指定对哪些资源做过滤, 配置过滤器路径。

//当前 Filter 只会对/hello 做拦截/过滤。
/hello
//当前 Filter 只会对/employee 资源做过滤
/employee
//当前 Filter 只会对以/system/作为前缀的资源路径做拦截。
/system/*
//当前Filter 会对所有资源访问进行拦截
/*

5 Filter生命周期

  Filter的生命周期:指Filter从创建到销毁的整个过程。

对象创建:启动服务器时创建所有Filter对象

init方法执行:启动服务器时调用 Filter对象中的init方法。

doFilter方法执行:每次请求对应的资源时都会执行,只要路径符合。

destroy方法执行:正常关闭服务器的时候,执行销毁操作,非正常关闭不会执行。

  执行顺序:创建对象(1次)→init方法(1次)→doFilter方法(N次)→destroy方法(1次/0次)

public class HelloFilter implements Filter {
    public HelloFilter(){
        System.out.println("Filter is ok");
    }
    // 初始化方法
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 通常用来获取配置初始化参数
        System.out.println("This Filter init");
    }
    // 过滤方法
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {
        // 执行过滤操作
        System.out.println("This doFilter");
        // 放行
        filterChain.doFilter(req,resp);
    }
    // 销毁方法
    @Override
    public void destroy() {
        System.out.println("clean");
    }
}

6 FilterChain(过滤器链)

  配置多个过滤器时,多个过滤器按照一定的顺序,排列组合在一起都形成一个Filter链,使用FilterChain对象来做牵引关联。
过滤器链
多个过滤器的先后执行顺序

  ① 由在web.xml中配置的<filter-mapping>的先后顺序来决定

  ② 注解配置时则是由Filter的名称的字母先后顺序来决定

7 过滤方式

  过滤器默认只对请求操作做过滤,转发是没有做过滤的,若对转发方式等做过滤,需设置过滤方式。

REQUEST:一次全新的请求,只有全新的请求才会经过过滤器(默认)。
FORWARD:请求转发。
ERROR:错误页面跳转。

// 例如
    <filter>
        <filter-name>HelloFilter</filter-name>
        <filter-class>cn.tj.web.servlet.HelloFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HelloFilter</filter-name>
        <url-pattern>/hello</url-pattern>
        <dispatcher>FORWARD</dispatcher>
        <dispatcher>REQUEST</dispatcher>
        <dispatcher>ERROR</dispatcher>
    </filter-mapping>

8 过滤器错误

  web目录下创建404.jsp,实现错误页面的转发,根据报错信息给予页面提示

// web.xml
<error-page>
	<error-code>404</error-code>
	<location>/404.jsp</location>
</error-page>
<filter>
	<filter-name>HelloFilter</filter-name>
	<filter-class>cn.tj.web.servlet.HelloFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>HelloFilter</filter-name>
	<url-pattern>/hello</url-pattern>
	<dispatcher>FORWARD</dispatcher>
	<dispatcher>REQUEST</dispatcher>
	<dispatcher>ERROR</dispatcher>
</filter-mapping>

// 404.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<span>错误页面</span>
</body>
</html>

9 字符编码过滤器 – CharacterEncodingFilter

  将编码格式的设置从Servlet拿到Filter中

@WebFilter("/*")
public class CharacterEncodingFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    /*设置请求和响应的编码格式*/
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //创建http请求和响应对象
        HttpServletRequest req= (HttpServletRequest) servletRequest;
        HttpServletResponse resp= (HttpServletResponse) servletResponse;
        //设置请求响应编码
        req.setCharacterEncoding("utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //放行
        filterChain.doFilter(req,resp);
    }
    @Override
    public void destroy() {
    }
}

10 登录校验过滤器 – LoginFilter

  判断用户是否登录,登录则放开资源,未登录则跳转到登录页面

@WebFilter("/check/*")
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;
        HttpServletResponse resp= (HttpServletResponse) servletResponse;
        /*判断是否拦截请求路径:index.jsp  login.jsp /user?cmd=login /*/
        String uri = req.getRequestURI();
        System.out.println(uri);
        if (uri.equals("/")||uri.equals("/index.jsp")||uri.equals("/login.jsp")){
            //如果是不需要拦截的路径,直接放行
            filterChain.doFilter(req,resp);
        }
        /*判断是否登录*/
        HttpSession session = req.getSession();
        Users users = (Users) session.getAttribute("USER_IN_SESSION");
        if (users==null){//如果没有登录,跳转登录页面,给出提示
            req.setAttribute("msg","请先登录再操作!");
            req.getRequestDispatcher("/login.jsp").forward(req,resp);
            return;
        }else{
            filterChain.doFilter(req,resp);
        }
    }
    @Override
    public void destroy() {
    }
}

  @WebFilter(“/check/*”)将需要受登录校验检查的资源放在check路径下,保证资源安全性,若对所有资源进行校验,会导致匿名资源不可被访问到
  匿名资源指不需登录也可以访问的资源,/login.jsp,/login,静态资源等等

二 监听器 Listener

  Java Web组件之一,用于监听作用域对象的创建和销毁动作以及作用域属性值的改变动作。触发动作,执行相应的的监听器操作。

1 介绍

① 监听的对象:
  作用域对象
  作用域属性
② 监听的动作:
  作用域对象的创建和销毁
  作用域属值的增删改
③ 监听器分类
  按作用域对象:
    ServletRequestListener
    HttpSessionListener
    ServletContextListener
  按作用域属性分:
    ServletRequestAttributeListener
    HttpSessionAttributeListener
    ServletContextAttributeListener

2、开发监听器的步骤

  ① 创建java类,根据需求实现对应的接口。
  ② 实现其中的方法。
  ③ 将监听器交给Tomcat管理。

3 demo

// 假设每个新会话对应一个新游客
// 每打开关闭一个会话 游客数+1
@WebListener
public class VisitorListener implements HttpSessionListener {
    /*初始化游客数量*/
    int total=0;
    /*session创建*/
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        total++;
        System.out.println("游客数量:"+total);
    }
    /*session销毁*/
    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
       total--;
        System.out.println("游客退出了,游客数量:"+total);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1384536.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

新一代数字原住民:市场痛点与“繁”思维应对之道

随着科技的迅速发展&#xff0c;尤其是互联网的普及&#xff0c;新一代数字原住民经营者已经逐渐成为市场的主力军。不同于传统的消费者&#xff0c;有着独特的消费习惯和心理需求。企业要在这激烈的市场竞争中获得优势&#xff0c;深入了解这一群体的特征和心理、行为&#xf…

【EMC专题】浪涌的成因与ICE 61000-4-5标准

什么是浪涌? 浪涌是一种无法预料的瞬态电压或电流尖峰,由附近的电子产品或是环境导致。 了解浪涌非常重要,因为浪涌有可能会导致设备的电气过应力损坏,造成系统故障等。 对于系统设计来说,重要的一点是我们如果无法控制浪涌的产生,那么只能通过将瞬态峰值电流导入到地,…

Pyside6/PyQt6中的QTimer类:轻松实现定时任务

文章目录 📖 介绍 📖🏡 环境 🏡📒 使用方法 📒📝 参数说明📝 常用方法⚓️ 相关链接 ⚓️📖 介绍 📖 在PySide/PyQt框架中,QTimer是一个核心类,主要用于在指定的间隔时间后触发某些事件。QTimer为开发者提供了一种处理和调度重复或单次动作的简便方式。 …

CSP网络结构实战 - 降低计算量的特征融合方式

CSP网络结构实战 - 降低计算量的特征融合方式 CSP网络结构实战 - 降低计算量的特征融合方式0. 引言1. CSP网络结构简介1.1 核心思想1.2 解决的问题 2. 实验验证2.1 CSP网络模型构建2.2 数据读取与预处理2.3 模型训练与验证 3. 对比实验4. 结果与总结 CSP网络结构实战 - 降低计算…

change事件传递多个参数

1.传递value页面参数 change"handleChange($event,123)" 2.传递选中的keyvalue或是选中的item 我用的是a-auto-complete&#xff0c;试验了用a-select也可以 就是在option里面&#xff0c;:value"JSON.stringify(d)" 然后在eval(( value ))转化就可…

Python中如何简化if...else...语句

一、引言 我们通常在Python中采用if...else..语句对结果进行判断&#xff0c;根据条件来返回不同的结果&#xff0c;如下面的例子。这段代码是一个简单的Python代码片段&#xff0c;让用户输入姓名并将其赋值给变量user_input。我们能不能把这几行代码进行简化&#xff0c;优化…

CTFhub-HTTP响应包源代码查看

CTFhub-Web-Web前置技能-“HTTP响应包源代码查看” 题目分析 页面空白&#xff0c;想到flag也许在源代码中 解题过程 F12&#xff0c;在element中&#xff0c;看到html代码&#xff0c;在其body中找到flag

对闭包的理解

概念&#xff1a; 一个函数对周围状态的引用捆绑在一起&#xff0c;闭包让开发者可以从内部函数访问外部 函数的作用域 简单理解&#xff1a;闭包 内层函数 外层函数的变量 一个函数对周围状态的引用捆绑在一起&#xff0c;闭包让开发者可以从内部函数访问外部 函数的作…

10.9.2 std::function 存储函数对象 Page184

41行&#xff0c;pending只是inc的复制品&#xff0c;所以43&#xff0c;44行&#xff0c;不会改变inc()的值 demo_function2()的运行结果&#xff1a; 59行&#xff0c;pending是inc的引用&#xff0c;所以61,62行将会改变inc()的值

如何在Windows 10/11的防火墙中禁止和允许某个应用程序,这里提供详细步骤

想阻止应用程序访问互联网吗&#xff1f;以下是如何通过简单的步骤阻止和允许Windows防火墙中的程序。​ 一般来说&#xff0c;大多数用户永远不需要担心应用程序访问互联网。然而&#xff0c;在某些情况下&#xff0c;你需要限制应用程序访问互联网。 例如&#xff0c;有问题…

webstorm最新版 激活 成功了

使用webstorm开发工具 很完美&#xff0c;第一次用webstorm IDE 开发工具就完美的激活了&#xff0c;你也不妨试试 链接地址&#xff1a;http://mano100.cn/thread-1942-1-1.html 激活后如下

Django数据库选移的preserve_default=False是什么意思?

有下面的迁移命令&#xff1a; migrations.AddField(model_namemovie,namemov_group,fieldmodels.CharField(defaultdjango.utils.timezone.now, max_length30),preserve_defaultFalse,),迁移命令中的preserve_defaultFalse是什么意思呢&#xff1f; 答&#xff1a;如果模型定…

Vue-Router 路径匹配与重定向

一、效果与描述 通过设置路由匹配同时设置重定向&#xff0c;让输错的网址重定向到指定页面&#xff0c;例如在网页输入网页地址把路径进行任意修改&#xff0c;重定向到登录页面。 二、Vue-Router代码 import { createRouter, createWebHashHistory } from vue-routerimport …

二、MySQL安装

目录 1、双击mysql8的安装向导 2、分为首次安装和再安装 1&#xff09;、首次安装 &#xff08;1&#xff09;如果是首次安装mysql系列的产品&#xff0c;需要先安装mysql产品的安装向导 &#xff08;2&#xff09;选择安装模式 2&#xff09;、不是首次安装 &#xff0…

在加载第三方库过程中,无法加载到库的问题(使用readelf, patchelf命令)

无法加载到库问题 问题及分析过程readelf 命令patchelf命令 问题及分析过程 在开发一个程序过程中&#xff0c;需要加载第三方库iTapTradeAPI, 在CMakeList.txt中已经设置了CMAKE_INSTALL_RPATH&#xff0c;但是发布到生产之后由于目录问题无法加载到libiTapTradeAPI库了 下面…

RH850P1X芯片学习笔记-Flash Memory

文章目录 FeaturesClock Supply Block DiagramFlash SizeMemory ConfigurationRegistersRegister Base AddressList of RegistersRegister Reset Condition 与Flash Memory相关的操作模式Functional OverviewOption BytesOPBT0 — Option Byte 0OPBT1 — Option Byte 1OPBT2 —…

超简单的简历模板精选5篇

HR浏览一份简历也就25秒左右&#xff0c;如果你连「好简历」都没有&#xff0c;怎么能找到好工作呢&#xff1f; 如果你不懂得如何在简历上展示自己&#xff0c;或者觉得怎么改简历都不出彩&#xff0c;那请你一定仔细读完。 个人求职简历第 1 篇 男 22 本科 AI简历 市场营…

ZZULIOJ 1112: 进制转换(函数专题)

题目描述 输入一个十进制整数n&#xff0c;输出对应的二进制整数。常用的转换方法为“除2取余&#xff0c;倒序排列”。将一个十进制数除以2&#xff0c;得到余数和商&#xff0c;将得到的商再除以2&#xff0c;依次类推&#xff0c;直到商等于0为止&#xff0c;倒取除得的余数…

零零鸡生态养殖农场“出圈”,有“智”更有“质”,助力本土品牌高质量发展

什么是生态农场&#xff1f;不同于常规农场&#xff0c;它对农业生产经营单元的各个关键环节有着极为严格的要求&#xff0c;强调整体、协调、循环、再生、多样&#xff0c;产品质量自然更好&#xff0c;附加值也更高&#xff0c;更能满足日趋多样化的巨大市场。零零鸡生态农场…

《Git学习笔记:Git入门 常用命令》

1. Git概述 1.1 什么是Git&#xff1f; Git是一个分布式版本控制工具&#xff0c;主要用于管理开发过程中的源代码文件&#xff08;Java类、xml文件、html页面等&#xff09;&#xff0c;在软件开发过程中被广泛使用。 其它的版本控制工具 SVNCVSVSS 1.2 学完Git之后能做…