Java研学-过滤与监听

这篇具有很好参考价值的文章主要介绍了Java研学-过滤与监听。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一 过滤器 Filter

1 介绍

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

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对象来做牵引关联。
Java研学-过滤与监听,# Java研学,java,开发语言
多个过滤器的先后执行顺序

  ① 由在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管理。文章来源地址https://www.toymoban.com/news/detail-800067.html

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);
    }
}

到了这里,关于Java研学-过滤与监听的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA开发(通过网关gateway过滤器进行返回结果加密)

    在对C的网站或者APP后端接口中,参数的传输往往需要加密传输。这时我们 可以通过springcloud的网关过滤器进行统一的控制。 网关过滤器的执行顺序: 请求进入网关会碰到三类过滤器:当前路由过滤器、DefaultFilter、GlobalFilter。 请求路由后,会将当前路由过滤器和DefaultFilter、

    2023年04月17日
    浏览(55)
  • 基于Java+Vue+uniapp微信小程序研学自习室选座与门禁系统设计和实现

    博主介绍 : ✌ 全网粉丝30W+,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专栏 推荐订阅 👇🏻 不然下次找不到哟 2022-2024年

    2024年02月02日
    浏览(59)
  • 开发笔记 | JAVA过滤器Filter实现全局接口入参去除前后空格

    目录 思考过程 遇到的问题 过滤器Filter使用步骤 全局去除入参前后空格代码实现 处理过程中自己造成的一些问题 需求背景: 前端所有的条件查询去除前后空格,如搜 【\\\"   测试    \\\"】后端将其转为【测试】。之前都是前端统一处理的,但是这次要后端处理,那么就得考虑

    2024年02月12日
    浏览(41)
  • 033-安全开发-JavaEE应用&SQL预编译&Filter过滤器&Listener监听器&访问控制

    1、JavaEE-JDBC-SQL预编译 2、JavaEE-HTTP-Filter过滤器 3、JavaEE-对象域-Listen监听器 演示案例: ➢JavaEE-预编译-SQL ➢JavaEE-过滤器-Filter ➢JavaEE-监听器-Listen 提前编译好执行逻辑,你注入的语句不会改变原有逻辑! 预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ? 是一个占位符

    2024年02月22日
    浏览(51)
  • 开发语言漫谈-Java

            由于C++过于复杂,Java诞生了。与C++相比,Java更易于学习和使用,它去掉C++中的指针和解决了内存管理问题。Java提供了垃圾自动回收机制,自动管理不再使用的内存。Python又进一步简化,使得语法更简洁,更易于阅读和编写。当然随着简化,性能就越来越低。    

    2024年04月10日
    浏览(49)
  • 【Java 进阶篇】保护你的应用:Java 过滤器实现敏感词汇过滤

    在开发 Web 应用程序时,安全性是至关重要的一环。保护用户免受恶意内容的侵害是开发者义不容辞的责任之一。在这篇博客中,我们将深入研究如何使用 Java 过滤器来过滤敏感词汇,确保用户输入的内容不包含不良信息。我们将采用简单而实用的方法,让即使是初学者也能

    2024年02月03日
    浏览(40)
  • 海康威视相机SDK二次开发(JAVA语言)

    前言 有个项目需要使用java程序读取海康威视的相机图片。相机通过以太网连接服务器,部署在服务器上的java程序将相机拍摄的画面保存在指定路径下。 海康威视提供了sdk开发包,可以在官网中下载,windows和linux系统都有。但是开发包中给出的示例代码,无法满足实际需要,

    2024年04月29日
    浏览(51)
  • 【Java】后端开发语言Java和C#,两者对比注解和属性的区别以及作用

    欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《Java》序列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。 温馨提示:博主能力有限,理解水平有限

    2024年01月16日
    浏览(53)
  • BsinCopilot:Java版端到端大语言模型开发框架

    BsinCopilot是基于BsinPaaS开源框架构建的大语言模型应用SaaS服务,借鉴langchain的框架思想,引入  langchian4j组件,微前端微服务的架构设计,可快速助您构建和体验端到端的AI应用。 概念 说明 Bsin 毕昇缩写,毕昇,中国北宋发明家,活字印刷术的发明者。毕昇出身平民,长期在

    2024年03月13日
    浏览(61)
  • Android 安卓开发语言kotlin与Java该如何选择

            如今在Android开发中,应用层开发语言主要是Java和Kotlin,Kotlin是后来加入的,主导的语言还是Java。kotlin的加入仿佛让会kotlin语言的开发者更屌一些,其实不然。         有人说kotlin的引入是解决开发者复杂的逻辑,并且对空指针控制的比较友好,但是我们在开

    2024年02月11日
    浏览(66)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包