安全-JAVA开发-第二天

news2025/6/6 13:31:39

Web资源访问的流程

由此可见 客户访问JAVA开发的应用时 会先通过 监听器(Listener)和 过滤器(Filter) 今天简单的了解下这两个模块的开发过程

监听器(Listener)

主要是监听 我们触发了什么行为 并进行反应 下面是一个监听Session的例子

正常创建项目后 目录文件如下

CSession代码
import jakarta.servlet.http.*;
import java.io.IOException;


@WebServlet("/CS")  // 映射到路径 "/CS"
public class CSession extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 控制台输出,表示正在创建 Session
        System.out.println("creat Session");

        // 调用 req.getSession() 方法获取或创建 Session
        // 如果请求中没有 Session,则自动创建新 Session
        req.getSession();
    }
}
DSession代码
package com.example.listendemo1.Servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.*;
import java.io.IOException;


@WebServlet("/DS")  // 映射到路径 "/DS"
public class DSession extends HttpServlet {
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 控制台输出日志,表示正在销毁 Session
        System.out.println("kill Session");

        // 获取当前 Session 并立即使其失效
        // invalidate() 方法会销毁 Session,清除所有存储的属性
        req.getSession().invalidate();
    }
}

以上两个代码操作为 访问路径(/CS|/DS)后对Session进行创建(删除)操作

ListenSession代码
package com.example.listendemo1.Listener;

import jakarta.servlet.annotation.WebListener;
import jakarta.servlet.http.HttpSessionEvent;
import jakarta.servlet.http.HttpSessionListener;


@WebListener
public class ListenSession implements HttpSessionListener {
    
    @Override
    public void sessionCreated(HttpSessionEvent se) {
        // 输出 Session 创建日志(控制台)
        System.out.println("Session created in Listen Session");
        
    }


    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        // 输出 Session 销毁日志(控制台)
        System.out.println("Session destroyed in Listen Session");
        
    }
}

监听器(Listener)运行情况

在没有操作时就会产生默认操作

创建Session

删除Session 监听器监听到了该动作

过滤器(Filter)

路径如下

TextServlet代码
package com.example.filterdemo1.Servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;


@WebServlet("/text")  // 定义Servlet访问路径
public class TextServlet extends HttpServlet {


     //处理HTTP GET请求

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {

        // 从请求中获取名为"code"的参数值
        String code = req.getParameter("code");

        // 获取响应输出流(自动设置text/html内容类型)
        PrintWriter out = resp.getWriter();

        // 将参数值写入响应
        out.println(code);

        // 刷新并关闭输出流
        out.flush();
        out.close();
    }
}

XssFilter代码
package com.example.filterdemo1.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter("/text") // 只过滤/text路径的请求
public class XssFilter implements Filter {

     // 过滤器初始化方法(容器启动时执行一次)
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("XssFilter first"); // 初始化日志
    }

     // 过滤器销毁方法(容器关闭时执行)
    @Override
    public void destroy() {
        System.out.println("XssFilter end"); // 销毁日志
    }
    
     // 过滤处理方法(每次请求时执行)
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        System.out.println("XssFilter now"); // 处理请求日志

        // 类型转换获取HttpServletRequest
        HttpServletRequest requset = (HttpServletRequest) servletRequest;
        // 获取请求参数code的值
        String code = requset.getParameter("code");

        // 检查是否不包含<script>标签
        if (!code.contains("<script>")) {
            // 安全请求,放行
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            // 检测到潜在XSS攻击
            System.out.println("XssFilter fight!!"); // 攻击日志
            // 注意:这里只是记录日志,实际应该阻止请求继续处理
        }
    }
}
测试代码运行如下:

预启动

添加代码--text?code=<script>alert(1)</script>     正常执行可以在页面弹出1

显示受到了攻击

正常情况是这个样子--text?code=123

第二个例子:/admin

AdminServlet代码
package com.example.filterdemo1.Servlet;

import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;


 //管理员后台Servlet

@WebServlet("/admin")  // 定义Servlet访问路径为/admin
public class AdminServlet extends HttpServlet {
    
     // 处理HTTP GET请求
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        // 控制台输出欢迎信息
        System.out.println("Welcome to Admin Servlet");

    }
}
AdminFiler代码
package com.example.filterdemo1.filter;

import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.Cookie;
import jakarta.servlet.http.HttpServletRequest;
import java.io.IOException;

 // 管理员权限过滤器
 // 作用路径:/admin
@WebFilter("/admin") // 过滤所有访问/admin路径的请求
public class AdminFilter implements Filter {
    
     // 过滤器初始化方法(容器启动时执行一次)
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("XssFilter first"); // 初始化日志
    }
    
     // 过滤器销毁方法(容器关闭时执行)
    @Override
    public void destroy() {
        System.out.println("XssFilter end"); // 销毁日志
    }

    /**
     * 过滤处理方法(每次访问/admin时执行)
     * 通过检查Cookie验证管理员权限
     */
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        // 转换请求对象以获取Cookie
        HttpServletRequest requset = (HttpServletRequest) servletRequest;
        // 获取请求中的所有Cookie
        Cookie[] cookies = requset.getCookies();
        // 遍历所有Cookie
        for (Cookie c : cookies) {
            String cName = c.getName(); // 获取Cookie名称
            String cValue = c.getValue(); // 获取Cookie值

            // 打印Cookie信息(调试用)
            System.out.println(cName);
            System.out.println(cValue);

            // 检查是否为管理员Cookie
            if (cName.equals("username") && cValue.equals("admin")) {
                // 验证通过,放行请求
                filterChain.doFilter(servletRequest, servletResponse);
                return; // 找到有效Cookie后立即返回
            } else {
                // 非管理员Cookie
                System.out.println("NO ADMIN");
            }
        }
        
    }
}
实验结果如下:

会打印出Cookie值 因为是循环输出 Cookie都会被输出 admin认证成功 第二个password也会输出 但是没有对password进行判断 所有会输出NO ADMIN

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

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

相关文章

Python基础:文件简单操作

&#x1f343;引言 手把手带你快速上手Python Python基础专栏 一、&#x1f343;文件是什么 变量是把数据保存到内存中. 如果程序重启/主机重启, 内存中的数据就会丢失。 要想能让数据被持久化存储, 就可以把数据存储到硬盘中. 也就是在文件中保存。 通过文件的后缀名, 可以看…

深度学习项目之RT-DETR训练自己数据集

RT-DETR 1.模型介绍&#x1f4cc; 什么是 RT-DETR &#xff1f;&#x1f4d6; 核心改进点&#x1f4ca; 结构示意&#x1f3af; RT-DETR 优势⚠️ RT-DETR 缺点&#x1f4c8; 应用场景&#x1f4d1; 论文 & 官方仓库2.模型框架3.Yaml配置文件4.训练脚本5.训练完成截图6.总结…

以太网帧结构和封装【二】-- IP头部信息

1字节 byte 8比特 bit 【位和比特是同一个概念】 比特/位&#xff0c;字节之间的关系是&#xff1a; 位&#xff08;Bit&#xff09; 中文名&#xff1a;位&#xff08;二进制位&#xff09;。 英文名&#xff1a;Bit&#xff08;Binary Digit 的缩写&#xff09;。 含义&…

Promtail采集服务器本地日志存储到Loki

✅ 一、前提条件 已安装 Loki 服务 日志文件目录可访问&#xff08;如 /var/log&#xff09; 具备 sudo 权限 &#x1f9e9; 二、下载 Promtail 二进制文件 # 替换为你想要的版本 VERSION"3.5.1"# 创建目录 sudo mkdir -p /opt/promtail cd /opt/promtail# 下载并…

学习STC51单片机27(芯片为STC89C52RCRC)

每日一言 你读过的书、走过的路、流过的汗&#xff0c;终将成就独一无二的你。 硬件&#xff1a;LCD1602液晶显示 非标协议外设 概述 LCD1602&#xff08;Liquid Crystal Display&#xff09;是一种工业字符型液晶&#xff0c;能够同时显示 1602 即 32 字符(16列两行) 那我…

DA14531_beacon_大小信标设备开发

蓝牙信标是一款通过广播指定蓝牙信号&#xff0c;实现信标信号扫描、识别和获得辅助信息的电子产品。 不同品名的蓝牙信标采用相同的 UUID 和广播信号格式&#xff0c;但在 MAC 地址、工作寿命、体积和广播周期上有所差异。 小武编程巧用DA14531开发一款蓝牙信标.

【算法训练营Day06】哈希表part2

文章目录 四数相加赎金信三数之和四数之和 四数相加 题目链接&#xff1a;454. 四数相加 II 这个题注意它只需要给出次数&#xff0c;而不是元组。所以我们可以分治。将前两个数组的加和情况使用map存储起来&#xff0c;再将后两个数组的加和情况使用map存储起来&#xff0c;ke…

Word双栏英文论文排版攻略

word写双栏英文论文的注意事项 排版首先改字体添加连字符还没完呢有时候设置了两端对齐会出现这样的情况&#xff1a; 公式文献 等我下学期有时间了&#xff0c;一定要学习Latex啊&#xff0c;word写英文论文&#xff0c;不论是排版还是公式都很麻烦的&#xff0c;而Latex一键就…

乡村三维建模 | 江苏农田无人机建模案例

测绘是农田建设的基础工作&#xff0c;测绘的质量和效率直接影响农田建设的进度和成果。传统的人工测量、地面测量等测绘手段&#xff0c;存在效率低、精度差、受环境影响大、成本高等缺点&#xff0c;难以满足高标准农田建设的要求。而无人机倾斜摄影技术具有高效、精确、灵活…

2025 5 月 学习笔记

计算高斯半径&#xff0c;用于生成高斯热图 这个的意义是什么 有什么作用&#xff1f; 14 核心意义&#xff1a;平衡定位精度与检测鲁棒性 在基于热图的目标检测方法&#xff08;如CenterNet、CornerNet等&#xff09;中&#xff0c;计算高斯半径的核心意义在于​​在精确…

SpringBoot(七) --- Redis基础

目录 前言 一、Redis入门 二、Redis常用数据类型 三、Redis常用命令 1. 字符串操作命令 2. 哈希操作命令 3. 列表操作命令 4. 集合操作命令 5. 有序集合操作命令 6.通用命令 四、在Java中操作Redis 前言 Redis是一个基于内存的key-value结构数据库&#xff0c;有以下…

从OSI到TCP/IP:网络协议的演变与作用

个人主页&#xff1a;chian-ocean 文章专栏-NET 从OSI到TCP/IP&#xff1a;网络协议的演变与作用 个人主页&#xff1a;chian-ocean文章专栏-NET 前言网络发展LANWAN 协议举个例子&#xff1a; 协议的产生背景 协议的标准化OSI模型参考OSI各个分层的作用各层次的功能简介 TCP/…

Stream流性能分析及优雅使用

文章目录 摘要一、Stream原理解析1.1、Stream总概1.2、Stream运行机制1.2.1、创建结点1.2.1、搭建流水线1.2.3、启动流水线 1.3、ParallelStream 二、性能对比三、优雅使用3.1 Collectors.toMap()3.2 findFirst()&#xff0c;findAny()3.3 增删元素3.4 ParallelStream 四、总结…

【和春笋一起学C++】(十七)C++函数新特性——内联函数和引用变量

C提供了新的函数特性&#xff0c;使之有别于C语言。主要包括&#xff1a; 内联函数&#xff1b;按引用传递变量&#xff1b;默认参数值&#xff1b;函数重载&#xff08;多态&#xff09;&#xff1b;模版函数&#xff1b; 因篇幅限制&#xff0c;本文首先介绍内联函数和引用…

proteus新建工程

1 点击新建工程 2 输入项目名&#xff0c;选择工程文件夹 3 下一步 4 不创建pcb 5 直接下一步 6 点击完成 7 创建完毕

RTC实时时钟DS1338Z-33/PT7C433833WEX国产替代FRTC1338S

FRTC1338S是NYFEA徕飞公司推出的一种高性能的实时时钟芯片&#xff0c;它采用了SOP8封装技术&#xff0c;这种技术因其紧凑的尺寸和出色的性能而被广泛应用于各类电子设备中。 FRTC1338S串行实时时钟(RTC)是一种低功耗的全二进制编码十进制(BCD)时钟/日历外加56字节的非易失性…

Redis命令使用

Redis是以键值对进行数据存储的&#xff0c;添加数据和查找数据最常用的2个指令就是set和get。 set&#xff1a;set指令用来添加数据。把key和value存储进去。get&#xff1a;get指令用来查找相应的键所对应的值。根据key来取value。 首先&#xff0c;我们先进入到redis客户端…

【免费数据】1980-2022年中国2384个站点的水质数据

水&#xff0c;是生命之源&#xff0c;关乎着地球上每一个生物的生存与发展。健康的水生生态系统维持着整个水生态的平衡与活力&#xff1b;更是确保人类能持续获得清洁水源的重要保障。水质数据在水质研究、海洋生物量测算以及生物多样性评估等诸多关键领域都扮演着举足轻重的…

Git 极简使用指南

Git 是一个强大的分布式版本控制系统&#xff0c;但入门只需要掌握几个核心概念和命令。本指南旨在帮助你快速上手&#xff0c;处理日常开发中最常见的 80% 的场景。 核心概念 仓库 (Repository / Repo): 你的项目文件夹&#xff0c;包含了项目的所有文件和完整的历史记录。…

力扣刷题Day 69:搜索二维矩阵(74)

1.题目描述 2.思路 首先判断target是否有可能在矩阵的某一行里&#xff0c;没可能直接返回False&#xff0c;有可能就在这一行里二分查找。 3.代码&#xff08;Python3&#xff09; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> boo…