Java研学-过滤与监听

一 过滤器 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.mfbz.cn/a/320269.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

音频和视频基础知识

声音 什么是声音&#xff1a; 声音是由物体振动产生的&#xff0c;物体发生振动&#xff0c;对周围的空气产生挤压&#xff0c;从而产生声音。声音是一种压力波&#xff0c;使周围的空气产生疏密变化&#xff0c;形成疏密相间的纵波&#xff0c;由此产生了声波。 声波三要素&…

HTML如何设置背景图片?有几种设置背景图片的办法?

我们在编辑网页时&#xff0c;如果觉得网页过于单调&#xff0c;这时便可以加上一张自己喜欢的背景图。这篇文章中&#xff0c;W3Cschool 小编给大家介绍下 HTML 中如何设置背景图片&#xff0c;分别有哪几种设置背景图片的方法。 方法一、HTML中设置背景图片 HTML中的<bo…

5.Pytorch模型单机多GPU训练原理与实现

文章目录 Pytorch的单机多GPU训练1)多GPU训练介绍2)pytorch中使用单机多GPU训练DistributedDataParallel(DDP)相关变量及含义a)初始化b)数据准备c)模型准备d)清理e)运行 3)使用DistributedDataParallel训练模型的一个简单实例 欢迎访问个人网络日志&#x1f339;&#x1f339;知…

HTML登录页面透明样式

html <body> <form> <h4 style"text-align:center">登录中心</h4> <hr /> <br /> <div class"row mb-5"> <label class"col-sm-2 col-form-label"…

【GitHub项目推荐--国外大神复刻暗黑2】【转载】

《暗黑破坏神2》&#xff0c;由顶尖游戏公司暴雪研发&#xff0c;2000 年上市&#xff0c;其资料片 2001 年上市&#xff0c;2D 画面。相信这款游戏已经成为很多人的回忆了&#xff0c;不知道当时是不是也和我一样沉迷于收集套装呢&#xff1f; 这款游戏的剧情设计、画面感都令…

Deepin使用记录-deepin安装docker

引用 本来想在deepin中直接安装mysql的开发环境的&#xff0c;但想到还是安装docker&#xff0c;然后在docker下安装比较方便&#xff0c;所以就有了本篇文章&#xff0c;先在deepin下安装docker。 经过本次安装&#xff0c;发现在deepin下安装docker是非常的简单&#xff0c…

企业异地访问办公系统:对比运营商MPLS专线,内网穿透有何优势?

为了实现连锁门店、企业内部各地分支机构ERP、OA、远程监控、自建邮件服务器、智能网络设备等数据传输、互访&#xff0c;使用运营商专线或是采用内网穿透方案&#xff0c;彼此之间究竟有何区别呢&#xff1f; 简单来说&#xff0c;MPLS专线和普通宽带类似是运营商提供的网络租…

数学建模day15-时间序列分析

时间序列也称动态序列&#xff0c;是指将某种现象的指标数值按照时间顺序排列而成的数值序列。时间序列分析大致可分成三大部分&#xff0c;分别是描述过去、分析规律和预测未来&#xff0c;本讲将主要介绍时间序列分析中常用的三种模型&#xff1a;季节分解、指数平滑方法和AR…

20240112-剑来的小文字大道理

– 烽火戏诸侯 《剑来》 与亲近之人不要说气话&#xff0c;不要说反话&#xff0c;不要不说话。 请不要把陌生人的些许善意&#xff0c;视为珍惜的瑰宝&#xff0c;却把身边亲近人的全部付出&#xff0c;当做天经地义的事情&#xff0c;对其视而不见。 读过多少书&#xff0…

java基础知识点系列——分支语句(六)

java基础知识点系列——分支语句&#xff08;六&#xff09; 流程控制 流程控制语句分类 顺序结构分支结构循环结构 顺序结构 顺序结构是程序中最简单最基本的流程控制&#xff0c;没有特定的语法结构&#xff0c;按照代码的先后顺序&#xff0c;依次执行。 if语句 if语…

利益兑现期越短,积极性越高

在2023年一次部门项目提成时间节点的调整&#xff0c;引发了相关的销售部门 &#xff0c;项目集成部门&#xff0c;软件开发部门截然不同的工作积极性。 公司案例 公司做项目的时候&#xff0c;采用的是相关部门都可以在项目获取提成 &#xff0c;之前的提成方式为销售部门为…

openfeign服务启动成功但是注册不上nacos? 我看看怎么个事儿!

spring-cloud-starter-alibaba-nacos-discovery和spring-boot-starter-web不得不说的秘密 ! 直接上答案: 给你的服务加上springbootweb依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifa…

lv14 多路复用及信号驱动 8

1 多路复用 描述符&#xff1a; 文件描述符&#xff1a;设备文件、管道文件 socket描述符 1.1 应用层&#xff1a;三套接口select、poll、epoll select&#xff1a;位运算实现 监控的描述符数量有限&#xff08;32位机1024,64位机2048,监控对象有限&#xff09; 效率差 p…

【MATLAB】VMD_LSTM神经网络时序预测算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 变分模态分解&#xff08;Variational Mode Decomposition&#xff0c;VMD&#xff09;和LSTM&#xff08;Long Short-Term Memory&#xff09;神经网络结合的算法是一种用于处理时间序列…

国家注册信息安全专业人员十五类CISP证书

国家注册信息安全专业人员&#xff08;Certified Information Security Professiona&#xff0c;简称CISP&#xff09;&#xff0c;是面向党政机关、关键信息基础设施运营单位、各类企事业单位和社会组织以及网络与信息安全企业、测评和咨询服务机构等工作的信息安全人员颁发的…

ELK之Filebeat安装配置及日志抓取

一、Filebeat是什么 轻量型日志采集器 无论您是从安全设备、云、容器、主机还是 OT 进行数据收集,Filebeat 都将为您提供一种轻量型方法,用于转发和汇总日志与文件,让简单的事情不再繁杂。 Filebeat 随附可观测性和安全数据源模块,这些模块简化了常见格式的日志的收集、解…

MyBatis的配置及简单使用

1.配置myBatis 1.myBatis的作用 MyBatis 是一个开源的持久层框架&#xff0c;它的主要作用是简化数据库操作&#xff0c;使得开发者能够更方便地与数据库进行交互。 MyBatis 允许开发者使用简单的 XML 或注解配置 SQL 映射&#xff0c;从而实现数据库操作&#xff0c;而不需要…

MATLAB Deep learning

文章目录 Chapter 1: Machine Learning存在的问题过拟合Overfitting解决过拟合 regularization and validationregularization 正则化validation 验证 机器学习的类型有监督学习分类Classification回归Regression 无监督学习聚类 强化学习 Chapter 2: Neural NetworkChapter 3:…

Danswer部署指南

Quickstart How to deploy Danswer on your local machine ​ Requirements gitdocker with compose (docker version > 1.13.0) ​ Setup This quickstart guide covers setting up Danswer for local execution Clone the Danswer repo: git clone https://github.com…

高效学习新编程语言的实践指南

学习一门新的编程语言或框架对于新手和有经验的程序员来说都是一个挑战。然而&#xff0c;通过采用一些有效的策略和方法&#xff0c;我们可以快速入门并掌握新的编程工具。本文将从新手和有编程经验两个不同的角度&#xff0c;分享一些实用的建议和技巧&#xff0c;帮助读者在…