Web三大组件之Filter,Listener和Servlet详解

Web三大组件之Filter, Listener和Servlet,是Java Web应用程序开发中不可缺少的三个组件。Servlet是用于处理请求的Java类,Listener是用于监听Web应用程序的状态变化的组件,而Filter是用于对请求和响应进行过滤处理的组件。

Filter详解

Filter是对请求和响应进行过滤处理的组件。它可以对请求参数、请求头、请求URL进行修改或拦截。Filter是在Servlet容器加载Servlet之前进行拦截处理的,与Servlet是一样级别的组件,不需要在web.xml配置中指定Filter,只需要在Filter类中使用@WebFilter()注解即可。

示例1:过滤敏感词汇

@WebFilter(filterName = "SensitiveWordFilter", urlPatterns = {"/*"})
public class SensitiveWordFilter implements Filter {

    private static final Logger logger = LoggerFactory.getLogger(SensitiveWordFilter.class);

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("SensitiveWordFilter init...");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;

        String uri = request.getRequestURI();
        if (uri.contains("sensitiveWord")) {
            String content = request.getParameter("content");
            String filter = "敏感词汇1,敏感词汇2,敏感词汇3"; // 假设这是过滤的词汇
            String[] filters = filter.split(",");
            for (String s : filters) {
                content = content.replaceAll(s, "**");
            }
            request.setAttribute("content", content);
        }

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        logger.info("SensitiveWordFilter destroy...");
    }
}

在上面的代码中,实现了对请求参数中包含特定关键字的拦截处理,将敏感词汇替换为**。

示例2:跨域请求

@WebFilter(filterName = "CorsFilter", urlPatterns = {"/*"})
public class CorsFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CorsFilter init...");
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) resp;
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, PUT, DELETE, OPTIONS");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization, Accept, X-Requested-With, remember-me");

        chain.doFilter(req, resp);
    }

    @Override
    public void destroy() {
        System.out.println("CorsFilter destroy...");
    }
}

在上面的代码中,实现了对跨域请求的拦截处理,允许前端发送跨域请求。

Listener详解

Listener是监听Web应用程序状态变化的组件,包括ServletRequest、HttpSession、ServletContext等的生命周期事件。Listener是一种特殊的Java类,需要实现Servlet规范中的javax.servlet.ServletContextListener、javax.servlet.http.HttpSessionListener、javax.servlet.ServletRequestListener等接口,用@WebListener()标识。

示例1:监听Servlet上下文

@WebListener
public class MyServletContextListener implements ServletContextListener {

    private static final Logger logger = LoggerFactory.getLogger(MyServletContextListener.class);

    @Override
    public void contextInitialized(ServletContextEvent sce) {
        logger.info("ServletContextListener contextInitialized...");
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        logger.info("ServletContextListener contextDestroyed...");
    }
}

在上面的代码中,实现了对Servlet上下文状态变化的监听,包括ServletContext的初始化和销毁事件。

示例2:监听HttpSession

@WebListener
public class MySessionListener implements HttpSessionListener {

    private static final Logger logger = LoggerFactory.getLogger(MySessionListener.class);

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        logger.info("SessionListener sessionCreated...");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        logger.info("SessionListener sessionDestroyed...");
    }
}

在上面的代码中,实现了对HttpSession状态变化的监听,包括HttpSession的创建和销毁事件。

Servlet详解

Servlet是用于处理请求的Java类。它是一种基于Java的Web组件,用于扩展Web服务器的能力。实现Servlet需要扩展javax.servlet.http.HttpServlet类,同时需要在web.xml中进行配置。

示例1:Hello World Servlet

@WebServlet(name = "HelloWorldServlet", value = "/hello")
public class HelloWorldServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html><body>");
        out.println("<h3>Hello World Servlet!</h3>");
        out.println("</body></html>");
    }
}

在上面的代码中,实现了简单的Hello World Servlet,当浏览器请求/hello URL时,返回一个简单的HTML页面。

示例2:文件上传Servlet

@WebServlet(name = "FileUploadServlet", urlPatterns = {"/fileUpload"})
@MultipartConfig(location = "D:/temp")
public class FileUploadServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");

        String savePath = request.getServletContext().getRealPath("/upload");// 上传文件存储目录
        File saveDir = new File(savePath);

        if (!saveDir.exists() && !saveDir.isDirectory()) {
            saveDir.mkdir();
        }

        // 消息提示
        String message = "";
        try {
            Part part = request.getPart("file");// 获取上传文件
            String fileName = getFileName(part);// 文件名
            part.write(savePath + "\\" + fileName);
            message = "文件上传成功!";
        } catch (Exception e) {
            e.printStackTrace();
            message = "文件上传失败!";
        }
        request.setAttribute("message", message);
        request.getRequestDispatcher(request.getContextPath() + "/index.jsp").forward(request, response);
    }

    // 获取文件名
    private String getFileName(Part part) {
        String header = part.getHeader("content-disposition");
        String[] arr = header.split(";");
        for (String s : arr) {
            if (s.trim().startsWith("filename")) {
                return s.substring(s.indexOf("=") + 2, s.length() - 1);
            }
        }
        return "";
    }
}

在上面的代码中,实现了一个文件上传Servlet,使用了@MultipartConfig注解来配置文件上传的存储位置,当有文件上传时,将其保存到指定目录,并返回上传成功或失败的消息提示。

综上所述,Filter, Listener和Servlet是Java Web应用程序开发中不可缺少的三大组件。通过本文的介绍,相信您已经了解了它们的作用和使用方法。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Web三大组件之Filter,Listener和Servlet详解 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • 浅谈pandas关于查看库或依赖库版本的API原理

    要想查看pandas库或其它Python库的版本,可以使用pandas库中提供的__version__属性或者pd.show_versions()方法。 对于使用属性__version__的方式,可以直接通过以下代码查看pandas的版本号: import pandas as pd print(pd.__version__) # 输出pandas库的版本号 …

    云计算 2023年5月18日
    00
  • ASP.NET Core使用NLog记录日志

    ASP.NET Core使用NLog记录日志 在ASP.NET Core应用程序中,记录日志是非常重要的。NLog是一个流行的日志记录库,可以帮助我们记录日志。本文将提供一个完整的攻略,包括如何使用NLog记录日志。以下是详细步骤: 步骤1:安装NLog 在使用NLog之前,我们需要安装NLog。以下是一个示例说明,演示如何安装NLog: dotnet ad…

    云计算 2023年5月16日
    00
  • python分析inkscape路径数据方案简单介绍

    Python分析Inkscape路径数据方案简单介绍 什么是Inkscape路径数据? 在Inkscape中,路径是由节点和线段组成的,其中节点用于确定路径方向和曲率,线段用于连接节点并绘制路径。路径数据是描述路径的元素、属性和值的集合。 路径数据通常使用SVG(Scalable Vector Graphics)语法进行描述,SVG是一种可缩放的矢量图形语言…

    云计算 2023年5月18日
    00
  • Crane如何做到利用率提升3倍稳定性还不受损?

    作为云平台用户,我们都希望购买的服务器物尽其用,能够达到最大利用率。然而要达到理论上的节点负载目标是很的,计算节点总是存在一些装箱碎片和低负载导致的闲置资源。下图展示了某个生产系统的CPU资源现状,从图中可以看出,浪费主要来自以下几个方面: 业务需求与节点可调度资源很难完全匹配,因此在每个节点上都可能剩余一些碎片资源无法被分配出去。 业务通常为了绝对稳定,会…

    2023年4月10日
    00
  • 云技术入门指导:什么是云计算技术,云技术用什么语言开发 – 咖啡猫1292

    云技术入门指导:什么是云计算技术,云技术用什么语言开发 云计算技术:这里只是列出我所知道的,希望大家对云计算技术有所了解:一首先让大家明白什么是云端,所谓云端需要两层理解(1)服务不在本地,这一层可以理解为服务器(2)它和普通的服务器是不一样的,这些云端的服务器的资源是共享的,一旦一个服务器不能承受,将会把任务分配给其他机器。二、云技术与其他技术的区别:云技…

    云计算 2023年4月13日
    00
  • 云从智慧4S店解决方案:让计算机视觉由“刷脸”迈入“识人”时代 |百万人学AI评选

    2020 无疑是特殊的一年,而 AI 在开年的这场”战疫“中表现出了惊人的力量。站在“新十年”的起点上,CSDN【百万人学AI】评选活动正式启动。本届评选活动在前两届的基础上再度升级,设立了「AI优秀案例奖Top 30」、「AI新锐公司奖Top 10」、「AI开源贡献奖Top 5」三大奖项。我们相信,榜样的力量将成为促进AI行业不断发展的重要基石,而CSDN…

    云计算 2023年4月13日
    00
  • Python爬取科目四考试题库的方法实现

    下面是Python爬取科目四考试题库的方法实现的攻略。 1. 前置知识 在实现爬虫之前,我们需要掌握以下知识: HTML基础知识,包括HTML标签、DOM结构、CSS样式等 Python编程基础,包括基本数据类型、流程控制、函数、模块等 requests库的基本使用方法 BeautifulSoup库的基本使用方法 2. 爬虫实现步骤 2.1 获取网页源代码 …

    云计算 2023年5月18日
    00
  • C# 调用WebApi的实现

    一、前言 C#作为一门高级编程语言,常常被用来开发Web端及其他各种应用程序。而WebApi作为一种服务端开发常用的技术,其典型的使用场景包括移动应用程序的后台服务以及web应用程序的API 接口等。 在本文中,我们将会详细讲解如何使用C#调用WebApi,包括如何发送HTTP请求,如何编写数据模型类以及如何解析返回的数据。 二、发送HTTP请求 在访问We…

    云计算 2023年5月17日
    00
合作推广
合作推广
分享本页
返回顶部