3.2 深入学习:自定义请求处理 - 拦截网络请求、修改请求头、实现自定义协议

从这里开始上强度了!!!先看‘形象比喻’。

📚 学习建议

初学路径

  1. 先理解概念 → 阅读"核心概念讲解",理解7个参数的作用

  2. 运行示例 → 跑起来代码,看到实际效果

  3. 逐个测试 → 按顺序测试4个功能:图片拦截 → 网站拦截 → 请求头修改 → API请求

  4. 查看日志 → 对照日志和代码,理解执行流程

  5. 动手修改 → 改改代码,比如改变拦截的URL,加入自己的逻辑

进阶练习

  • 实现白名单模式(只允许访问指定网站)

  • 添加访问时间限制(工作时间禁止视频网站)

  • 记录所有访问历史到文件

  • 实现简单的家长控制系统

1️⃣ 什么是自定义请求处理?

这是JCEF的另一个强大功能。简单理解:当浏览器要加载网页、图片、CSS等资源时,可以在Java中"拦截"这些请求,然后:

  • 查看请求的详细信息

  • 修改请求(比如添加请求头)

  • 阻止某些请求

  • 自己提供内容(不从网络加载)

  • 创建自定义协议(比如 myapp:// 而不是 http://

🤔 形象比喻

想象浏览器是一个外卖员

  • 用户点击链接 = 顾客下单

  • 浏览器发出请求 = 外卖员去取餐

  • RequestHandler(请求处理器) = 调度员,可以:

    • 查看订单内容

    • 修改送餐地址

    • 取消某些订单

    • 自己做餐(不去餐厅取)

2️⃣ 创建一个完整的示例

创建新文件 RequestInterceptDemo.java

package cn.why;

import me.friwi.jcefmaven.CefAppBuilder;
import me.friwi.jcefmaven.MavenCefAppHandlerAdapter;
import org.cef.CefApp;
import org.cef.CefClient;
import org.cef.browser.CefBrowser;
import org.cef.browser.CefFrame;
import org.cef.handler.CefRequestHandlerAdapter;
import org.cef.handler.CefResourceRequestHandler;
import org.cef.misc.BoolRef;
import org.cef.network.CefRequest;

import javax.swing.*;
import java.awt.*;
import java.io.File;
import java.io.FileWriter;
import java.util.HashMap;
import java.util.Map;

public class O3_RequestInterceptDemo {

    private static CefBrowser browser;
    private static JTextArea logArea;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> createAndShowGUI());
    }

    private static void createAndShowGUI() {
        System.out.println("🚀 开始创建GUI");

        JFrame frame = new JFrame("JCEF 请求拦截演示");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(1400, 900);
        frame.setLayout(new BorderLayout());

        try {
            CefAppBuilder builder = new CefAppBuilder();
            builder.setAppHandler(new MavenCefAppHandlerAdapter() {
                @Override
                public void stateHasChanged(CefApp.CefAppState state) {
                    if (state == CefApp.CefAppState.TERMINATED) {
                        System.exit(0);
                    }
                }
            });

            builder.getCefSettings().windowless_rendering_enabled = false;
            CefApp cefApp = builder.build();
            CefClient client = cefApp.createClient();

            client.addRequestHandler(new CefRequestHandlerAdapter() {
                @Override
                public CefResourceRequestHandler getResourceRequestHandler(
                        CefBrowser browser, CefFrame frame, CefRequest request,
                        boolean isNavigation, boolean isDownload,
                        String requestInitiator, BoolRef disableDefaultHandling) {

                    String url = request.getURL();
                    String method = request.getMethod();
                    log("📡 [" + method + "] " + url);

                    if (url.contains("blocked.jpg") || url.contains("blocked.png")) {
                        log("🚫 阻止加载: " + url);
                        disableDefaultHandling.set(true);
                        return null;
                    }

                    if (url.contains("baidu.com") || url.contains("api")) {
                        Map<String, String> headerMap = new HashMap<>();
                        request.getHeaderMap(headerMap);
                        headerMap.put("X-Custom-Header", "From-Java-JCEF");
                        headerMap.put("X-My-Token", "my-secret-token-12345");
                        request.setHeaderMap(headerMap);
                        log("🔧 添加自定义请求头");
                    }

                    return null;
                }

                @Override
                public boolean onBeforeBrowse(CefBrowser browser, CefFrame frame,
                                              CefRequest request, boolean userGesture,
                                              boolean isRedirect) {
                    String url = request.getURL();

                    if (url.contains("example.com") && !url.contains("api.example.com")) {
                        log("⛔ 阻止访问网站: " + url);
                        SwingUtilities.invokeLater(() -> JOptionPane.showMessageDialog(null,
                                "该网站已被阻止访问!\n" + url, "访问被阻止", JOptionPane.WARNING_MESSAGE));
                        return true;
                    }

                    log("✅ 允许导航: " + url);
                    return false;
                }
            });

            browser = client.createBrowser("about:blank", false, false);

            JSplitPane splitPane = new JSplitPane(JSplitPane.VERTICAL_SPLIT);
            splitPane.setTopComponent(browser.getUIComponent());
            splitPane.setBottomComponent(createLogPanel());
            splitPane.setDividerLocation(600);

            frame.add(createControlPanel(), BorderLayout.NORTH);
            frame.add(splitPane, BorderLayout.CENTER);

            frame.setVisible(true);
            System.out.println("✅✅✅ 窗口已显示!");

            new Timer(2000, e -> {
                System.out.println("⏰ 定时器触发");
                try {
                    File htmlFile = createTestHTML();
                    browser.loadURL(htmlFile.toURI().toString());
                    log("📄 测试页面已加载");
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                ((Timer) e.getSource()).stop();
            }).start();

        } catch (Exception e) {
            System.out.println("❌ 异常: " + e.getMessage());
            e.printStackTrace();
        }
    }

    private static File createTestHTML() throws Exception {
        File tempFile = File.createTempFile("request_test", ".html");
        tempFile.deleteOnExit();

        String html = """
<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>请求拦截测试</title>
    <style>
        body {
            font-family: 'Microsoft YaHei', Arial;
            padding: 30px;
            background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
            color: white;
        }
        .container {
            max-width: 900px;
            margin: 0 auto;
            background: rgba(255,255,255,0.1);
            padding: 30px;
            border-radius: 10px;
        }
        h1 { text-align: center; }
        .box {
            background: rgba(255,255,255,0.2);
            padding: 20px;
            margin: 15px 0;
            border-radius: 8px;
        }
        button {
            background: #4CAF50;
            color: white;
            border: none;
            padding: 12px 24px;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
            margin: 5px;
        }
        button:hover { background: #45a049; }
        button.danger { background: #f44336; }
        button.danger:hover { background: #da190b; }
        #result {
            margin-top: 20px;
            padding: 15px;
            background: rgba(0,0,0,0.3);
            border-radius: 5px;
            min-height: 50px;
        }
        img {
            max-width: 200px;
            border: 3px solid white;
            border-radius: 5px;
        }
        .info {
            background: rgba(33, 150, 243, 0.3);
            padding: 10px;
            border-radius: 5px;
            margin: 10px 0;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>🔌 JCEF 请求拦截测试</h1>
        
        <div class="box">
            <h2>📋 功能说明</h2>
            <div class="info">
                <p>✅ 所有请求都会被Java拦截并记录在下方日志中</p>
                <p>✅ 访问百度时会自动添加自定义请求头</p>
                <p>✅ 尝试加载blocked图片会被阻止</p>
                <p>✅ 尝试访问example.com会被阻止</p>
            </div>
        </div>
        
        <div class="box">
            <h2>1️⃣ 测试图片拦截</h2>
            <p>尝试加载这张图片(会被阻止):</p>
            <img src="blocked.jpg" onerror="this.alt='❌ 图片被Java阻止加载'" alt="加载中...">
            <br>
            <button onclick="loadImage()">重新加载图片</button>
        </div>
        
        <div class="box">
            <h2>2️⃣ 测试网站拦截</h2>
            <button class="danger" onclick="loadBlockedSite()">访问 example.com(会被阻止)</button>
            <div id="result"></div>
        </div>
        
        <div class="box">
            <h2>3️⃣ 测试请求头修改</h2>
            <p>访问百度时,Java会自动添加自定义请求头</p>
            <button onclick="loadBaidu()">访问百度(查看日志)</button>
        </div>
        
        <div class="box">
            <h2>4️⃣ 测试API请求</h2>
            <p>发送API请求时会添加Token</p>
            <button onclick="fetchAPI()">发送API请求</button>
        </div>
    </div>
    
    <script>
        function loadImage() {
            const img = document.querySelector('img');
            img.src = 'blocked.jpg?' + Date.now();
        }
        
        function loadBlockedSite() {
            document.getElementById('result').innerHTML = '⏳ 正在尝试访问 example.com...';
            setTimeout(() => window.location.href = 'https://www.example.com', 500);
        }
        
        function loadBaidu() {
            document.getElementById('result').innerHTML = '⏳ 正在访问百度...';
            setTimeout(() => window.location.href = 'https://www.baidu.com', 500);
        }
        
        function fetchAPI() {
            document.getElementById('result').innerHTML = '⏳ 发送API请求...';
            fetch('https://api.example.com/data')
                .then(() => document.getElementById('result').innerHTML = '✅ API请求已发送')
                .catch(() => document.getElementById('result').innerHTML = '⚠️ API请求失败(正常现象)');
        }
        
        console.log('📄 测试页面已加载');
    </script>
</body>
</html>
""";

        try (FileWriter writer = new FileWriter(tempFile)) {
            writer.write(html);
        }
        return tempFile;
    }

    private static JPanel createControlPanel() {
        JPanel panel = new JPanel(new FlowLayout(FlowLayout.LEFT));
        panel.setBackground(new Color(50, 50, 50));

        JButton btn1 = new JButton("🔄 重新加载");
        btn1.addActionListener(e -> browser.reload());

        JButton btn2 = new JButton("🧹 清空日志");
        btn2.addActionListener(e -> { logArea.setText(""); log("日志已清空"); });

        JButton btn3 = new JButton("🌐 访问百度");
        btn3.addActionListener(e -> { log("访问百度..."); browser.loadURL("https://www.baidu.com"); });

        JButton btn4 = new JButton("🏠 返回测试页");
        btn4.addActionListener(e -> {
            try {
                browser.loadURL(createTestHTML().toURI().toString());
                log("返回测试页");
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        });

        panel.add(btn1);
        panel.add(btn2);
        panel.add(btn3);
        panel.add(btn4);
        return panel;
    }

    private static JScrollPane createLogPanel() {
        logArea = new JTextArea();
        logArea.setEditable(false);
        logArea.setBackground(Color.BLACK);
        logArea.setForeground(Color.GREEN);
        logArea.setFont(new Font("Consolas", Font.PLAIN, 13));

        JScrollPane scrollPane = new JScrollPane(logArea);
        scrollPane.setBorder(BorderFactory.createTitledBorder("📜 请求拦截日志"));

        log("=== JCEF 请求拦截系统已启动 ===");
        log("等待拦截请求...\n");
        return scrollPane;
    }

    private static void log(String message) {
        String timestamp = String.format("[%tT]", System.currentTimeMillis());
        String logMessage = timestamp + " " + message;
        SwingUtilities.invokeLater(() -> {
            logArea.append(logMessage + "\n");
            logArea.setCaretPosition(logArea.getDocument().getLength());
        });
        System.out.println(logMessage);
    }
}

功能总结:

功能

使用的方法

关键操作

返回值/设置

实际应用

图片拦截

getResourceRequestHandler()

disableDefaultHandling.set(true)

返回 null

广告拦截、隐私保护

网站拦截

onBeforeBrowse()

return true & 判断URL

返回 true/false

家长控制、企业限制

请求头修改

getResourceRequestHandler()

request.setHeaderMap()

返回 null

统一认证、追踪ID

API请求

getResourceRequestHandler()

request.setHeaderMap()

返回 null

API Token、密钥

代码讲解:

  1. 图片拦截

完整流程图

用户点击按钮 → JavaScript执行 → 浏览器尝试加载图片 → Java拦截请求 → 阻止加载 → 图片失败


第一步:用户点击"重新加载图片"按钮

HTML代码(在 createTestHTML() 方法中)


<button onclick="loadImage()">重新加载图片</button>

发生了什么

  • 用户点击绿色按钮

  • 触发 onclick 事件

  • 调用JavaScript函数 loadImage()


第二步:JavaScript尝试加载图片

JavaScript代码(也在HTML中)


function loadImage() { const img = document.querySelector('img'); // 1. 找到页面上的<img>标签 img.src = 'blocked.jpg?' + Date.now(); // 2. 修改src属性,添加时间戳 }

详细解释

  1. 找到图片元素


const img = document.querySelector('img');

  • 找到HTML中的 <img> 标签

2. 修改图片地址


img.src = 'blocked.jpg?' + Date.now();

  • 'blocked.jpg' - 图片文件名

  • ? - 添加查询参数

  • Date.now() - 当前时间戳(例如:1770832244864)

  • 最终结果blocked.jpg?1770832244864

为什么要加时间戳

  • 防止浏览器缓存

  • 每次点击都是"新"请求

  • 浏览器会重新尝试加载

完整URL

file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864

  • file:// - 协议(本地文件)

  • /C:/Users/why/AppData/Local/Temp/ - 临时文件夹路径

  • blocked.jpg - 文件名

  • ?1770832244864 - 时间戳参数


第三步:浏览器发起GET请求

浏览器内部

  1. 看到 img.src 改变

  2. 准备发起HTTP GET请求

  3. 构建完整URL

  4. 准备加载图片


第四步:Java拦截到这个请求

Java代码(在 getResourceRequestHandler() 方法中)

@Override
public CefResourceRequestHandler getResourceRequestHandler(
        CefBrowser browser,
        CefFrame frame,
        CefRequest request,          // ← 这里包含请求的所有信息
        boolean isNavigation,
        boolean isDownload,
        String requestInitiator,
        BoolRef disableDefaultHandling) {  // ← 这个用来阻止请求

    // 第1步:获取请求的URL
    String url = request.getURL();
    // url = "file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864"
    
    // 第2步:获取请求方法
    String method = request.getMethod();
    // method = "GET"
    
    // 第3步:记录日志
    log("📡 [" + method + "] " + url);
    // 输出:📡 [GET] file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864

详细解释每一步

第1步:获取URL


String url = request.getURL();

  • request 是一个包含请求信息的对象

  • getURL() 方法返回完整的请求地址

  • 此时 url 的值是:"file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864"

第2步:获取请求方法


String method = request.getMethod();

  • 获取HTTP方法(GET、POST、PUT等)

  • 加载图片通常是 GET 请求

第3步:记录日志


log("📡 [" + method + "] " + url);

  • 调用 log() 方法输出日志

  • 输出到控制台和日志窗口

  • 显示:[01:50:44] 📡 [GET] file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864


第五步:检查是否要阻止(关键!)

    // 检查URL是否包含 "blocked.jpg" 或 "blocked.png"
    if (url.contains("blocked.jpg") || url.contains("blocked.png")) {
        
        // 步骤A:记录阻止日志
        log("🚫 阻止加载: " + url);
        
        // 步骤B:设置阻止标志(最关键!)
        disableDefaultHandling.set(true);
        
        // 步骤C:返回null(不提供自定义处理)
        return null;
    }
    
    return null; // 默认:正常处理
}

详细解释

判断条件

if (url.contains("blocked.jpg") || url.contains("blocked.png"))

url.contains("blocked.jpg") 的工作原理

url = "file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864"

url.contains("blocked.jpg")
// 检查这个字符串里是否包含 "blocked.jpg"
// 结果:true(包含)

因为:


file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864 ^^^^^^^^^^^ 找到了!

步骤A:记录阻止日志


log("🚫 阻止加载: " + url);

  • 输出:[01:50:44] 🚫 阻止加载: file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864

  • 这就是你在控制台看到的第二行日志

步骤B:设置阻止标志(核心!)


disableDefaultHandling.set(true);

这是最关键的一行!

disableDefaultHandling 是什么

  • 类型:BoolRef(布尔值的引用)

  • 作用:告诉浏览器"不要用默认方式处理这个请求"

为什么用 BoolRef 而不是 boolean



// 错误方式(不起作用)
boolean disable = true;  // 这只是局部变量,浏览器看不到

// 正确方式
disableDefaultHandling.set(true);  // 这会真正通知浏览器

BoolRef 的工作原理

// BoolRef 是一个容器,可以传递引用
BoolRef disableDefaultHandling = new BoolRef(false);  // 初始值false

// Java代码修改它
disableDefaultHandling.set(true);  // 设置为true

// 浏览器引擎读取它
if (disableDefaultHandling.get()) {
    // 哦,Java告诉我不要加载这个资源
    // 我停止加载!
}

步骤C:返回null


return null;

返回值的含义:

返回值

含义

null

使用默认处理(或者被阻止)

new CustomHandler()

使用自定义处理器(可以返回自己的内容)

在这里:

  • 返回 null

  • 加上 disableDefaultHandling.set(true)

  • 结果:彻底阻止加载,不提供任何内容


第六步:浏览器接收阻止信号

浏览器内部处理:

  • 浏览器:我要加载 blocked.jpg

  • Java:不行!disableDefaultHandling = true

  • 浏览器:好的,我停止加载

  • 浏览器:触发图片的 onerror 事件


第七步:触发onerror事件HTML代码

<img src="blocked.jpg" 
     onerror="this.alt='❌ 图片被Java阻止加载'" 
     alt="加载中...">

onerror 的作用 : 当图片加载失败时触发 执行:this.alt='❌ 图片被Java阻止加载' this 指向这个 <img> 标签 alt是图片的替代文本 结果 : 图片显示:❌ 图片被Java阻止加载

完整时间线:

时间

事件

代码位置

01:50:44.000

用户点击按钮

HTML: `οnclick="loadImage()"`

01:50:44.001

JavaScript修改src

JS: `img.src = 'blocked.jpg?...'`

01:50:44.002

浏览器发起请求

浏览器内部

01:50:44.003

Java拦截请求

Java: `getResourceRequestHandler()`

01:50:44.004

记录第一行日志

Java: `log("📡 [GET] ...")`

01:50:44.005

检查URL包含blocked

Java: `if (url.contains("blocked.jpg"))`

01:50:44.006

记录第二行日志

Java: `log("🚫 阻止...")`

01:50:44.007

设置阻止标志

Java: `disableDefaultHandling.set(true)`

01:50:44.008

浏览器停止加载

浏览器内部

01:50:44.009

触发onerror

HTML: `οnerrοr="..."`

01:50:44.010

显示错误文本

页面显示"❌ 图片被Java阻止加载"

控制台日志


[01:50:44] 📡 [GET] file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864 [01:50:44] 🚫 阻止加载: file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864

对应的Java代码:


// 第一行日志 log("📡 [" + method + "] " + url); // 输出:📡 [GET] file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864 // 第二行日志 log("🚫 阻止加载: " + url); // 输出:🚫 阻止加载: file:///C:/Users/why/AppData/Local/Temp/blocked.jpg?1770832244864


如果不阻止会怎样?

假设注释掉阻止代码


// if (url.contains("blocked.jpg")) { // log("🚫 阻止加载: " + url); // disableDefaultHandling.set(true); // return null; // }

流程变化

  1. ✅ 用户点击按钮

  2. ✅ JavaScript修改src

  3. ✅ 浏览器发起请求

  4. ✅ Java拦截请求

  5. ✅ 记录日志:📡 [GET] ...

  6. 不检查URL,不阻止

  7. ✅ 浏览器尝试加载 blocked.jpg

  8. ❌ 文件不存在(因为我们没创建这个文件)

  9. ✅ 浏览器加载失败

  10. ✅ 触发onerror

  11. ✅ 显示"❌ 图片被Java阻止加载"

区别

  • 有阻止:Java主动阻止,浏览器不尝试加载

  • 无阻止:浏览器尝试加载,但文件不存在自然失败


总结

这个例子展示了完整的请求拦截 → 判断 → 阻止流程:

  1. ✅ JavaScript发起请求

  2. ✅ Java拦截到请求

  3. ✅ Java检查URL

  4. ✅ Java设置阻止标志

  5. ✅ 浏览器停止加载

  6. ✅ 页面显示错误

核心代码就是这一行

java


disableDefaultHandling.set(true); // 阻止加载!


  1. 网站拦截

操作一下:

  • 在页面上找到 "2️⃣ 测试网站拦截" 区域

  • 点击红色按钮:"访问 example.com(会被阻止)"

会看到

  1. 弹出一个警告对话框:"该网站已被阻止访问!"

  2. 控制台日志显示:⛔ 阻止访问网站: https://www.example.com

  3. 页面不会跳转到 example.com

完整流程图

用户点击按钮 → JavaScript设置跳转 → 浏览器准备导航 → Java拦截导航 → 返回true阻止 → 弹出警告 → 停止跳转

第一步:用户点击红色按钮


<button class="danger" onclick="loadBlockedSite()"> 访问 example.com(会被阻止) </button>

发生了什么

  • 用户点击红色按钮(class="danger"让按钮变红色)

  • 触发 onclick 事件

  • 调用JavaScript函数 loadBlockedSite()


第二步:JavaScript准备跳转


function loadBlockedSite() { // 第1步:在页面上显示提示 document.getElementById('result').innerHTML = '⏳ 正在尝试访问 example.com...'; // 第2步:延迟500毫秒后跳转 setTimeout(() => { window.location.href = 'https://www.example.com'; }, 500); }

详细解释

第1步:显示提示信息


document.getElementById('result').innerHTML = '⏳ 正在尝试访问 example.com...';

  • document.getElementById('result') - 找到id为'result'的div

  • .innerHTML = ... - 修改div里的HTML内容

  • 显示:"⏳ 正在尝试访问 example.com..."

对应的HTML


<div id="result"></div>

第2步:延迟后跳转


setTimeout(() => { window.location.href = 'https://www.example.com'; }, 500); ``` **`setTimeout` 的作用**: - 延迟执行代码 - `500` 表示500毫秒(0.5秒) - 让用户能看到"正在尝试访问"的提示 **`window.location.href = '...'` 的作用**: - 修改当前页面的URL - 触发页面导航(跳转) - 类似于你在地址栏输入网址后按回车 **时间线**: ``` 0ms: 用户点击按钮 1ms: 显示"正在尝试访问..." 500ms: 执行 window.location.href = 'https://www.example.com' 501ms: 浏览器准备跳转


第三步:浏览器准备导航

浏览器内部

  1. 检测到 window.location.href 改变

  2. 解析新URL:https://www.example.com

  3. 准备离开当前页面

  4. 准备导航到新页面

注意:此时还没有真正跳转,只是准备跳转


第四步:Java拦截导航(关键!)

这次不是 getResourceRequestHandler(),而是 onBeforeBrowse()


@Override public boolean onBeforeBrowse( CefBrowser browser, // 浏览器对象 CefFrame frame, // 框架对象 CefRequest request, // 请求对象 boolean userGesture, // 是否用户手势触发 boolean isRedirect) { // 是否重定向 // 第1步:获取要访问的URL String url = request.getURL(); // url = "https://www.example.com" // 第2步:检查是否要阻止 if (url.contains("example.com") && !url.contains("api.example.com")) { // 步骤A:记录日志 log("⛔ 阻止访问网站: " + url); // 步骤B:弹出警告对话框 SwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog(null, "该网站已被阻止访问!\n" + url, "访问被阻止", JOptionPane.WARNING_MESSAGE); }); // 步骤C:返回true,阻止导航 return true; // true = 阻止! } // 第3步:允许其他网站 log("✅ 允许导航: " + url); return false; // false = 允许 }

详细解释每一步

onBeforeBrowse() vs getResourceRequestHandler()

方法

拦截的是什么

什么时候调用

getResourceRequestHandler()

资源请求(图片、CSS、JS等)

加载任何资源时

onBeforeBrowse()

页面导航(跳转)

页面要跳转时

形象理解

  • getResourceRequestHandler() = 海关检查包裹

  • onBeforeBrowse() = 边检站检查护照


第1步:获取URL


String url = request.getURL();

  • 获取要跳转的目标URL

  • 此时 url = "https://www.example.com"


第2步:检查是否要阻止


if (url.contains("example.com") && !url.contains("api.example.com"))

这个条件有两部分

部分1:url.contains("example.com")


url = "https://www.example.com" url.contains("example.com") // 检查URL是否包含 "example.com" // 结果:true(包含)

部分2:!url.contains("api.example.com")


url = "https://www.example.com" url.contains("api.example.com") // 检查是否包含 "api.example.com" // 结果:false(不包含) !url.contains("api.example.com") // 加上 ! 取反 // 结果:true(不包含api子域名)

为什么要排除 api.example.com

  • 阻止访问主站 www.example.com

  • 但允许API请求到 api.example.com

  • 这样可以精确控制

逻辑表

URL

包含example.com

包含api.example.com

最终结果

https://www.example.com

✅ true

❌ false

阻止

https://example.com

✅ true

❌ false

阻止

https://api.example.com

✅ true

✅ true

允许

https://www.baidu.com

❌ false

❌ false

允许

步骤A:记录日志


log("⛔ 阻止访问网站: " + url);

  • 输出到控制台和日志窗口

  • 显示:[时间] ⛔ 阻止访问网站: https://www.example.com


步骤B:弹出警告对话框


SwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog( null, // 父窗口(null表示屏幕中央) "该网站已被阻止访问!\n" + url, // 消息内容 "访问被阻止", // 对话框标题 JOptionPane.WARNING_MESSAGE // 警告图标 ); });

SwingUtilities.invokeLater() 的作用

  • 确保对话框在UI线程中显示

  • 避免线程安全问题

JOptionPane.showMessageDialog() 的参数

  1. null - 父窗口

    1. null = 对话框显示在屏幕中央

    2. 如果传入 frame,对话框会显示在窗口中央

  2. 消息内容


"该网站已被阻止访问!\n" + url

  • \n 是换行符

  • 显示两行: 该网站已被阻止访问! https://www.example.com

  1. 对话框标题"访问被阻止"

  2. 图标类型JOptionPane.WARNING_MESSAGE

    1. 显示⚠️警告图标


步骤C:返回true阻止导航(最关键!)


return true; // true = 阻止导航

返回值的含义

返回值

含义

结果

true

阻止导航

页面不跳转

false

允许导航

页面正常跳转

这是最关键的一行!

工作原理


return true; // 告诉浏览器:停!不要跳转! // 浏览器接收到返回值 if (onBeforeBrowse返回true) { 取消导航(); // 停止跳转 } else { 继续导航(); // 正常跳转 }


第五步:浏览器停止跳转

浏览器内部处理

  • 浏览器:我准备跳转到 example.com

  • Java:onBeforeBrowse() 返回 true

  • 浏览器:收到!取消导航

  • 浏览器:保持在当前页面

结果

  • ✅ 对话框显示警告

  • ✅ 日志记录阻止信息

  • ✅ 页面不跳转,保持在原页面

  • ✅ 地址栏不变


对比:如果允许跳转

第3步:允许其他网站


log("✅ 允许导航: " + url); return false; // false = 允许

如果访问的是百度


url = "https://www.baidu.com" url.contains("example.com") // false // 条件不满足,跳过if块 log("✅ 允许导航: https://www.baidu.com"); return false; // 返回false,允许跳转

结果:

  • ✅ 日志显示:`✅ 允许导航: https://www.baidu.com`

  • ✅ 浏览器正常跳转到百度

  • ✅ 地址栏显示百度URL

完整时间线:

时间

事件

代码位置

0ms

用户点击按钮

HTML: onclick="loadBlockedSite()"

1ms

显示"正在尝试访问..."

JS: innerHTML = '⏳...'

500ms

执行跳转命令

JS: window.location.href = ...

501ms

浏览器准备导航

浏览器内部

502ms

Java拦截导航

Java: onBeforeBrowse()

503ms

检查URL

Java: if (url.contains("example.com"))

504ms

记录日志

Java: log("⛔ 阻止...")`

505ms

弹出对话框

Java: JOptionPane.showMessageDialog()

506ms

返回true

Java: return true;

507ms

浏览器取消导航

浏览器内部

508ms

保持在原页面

页面不变

控制台日志:


[时间] ⛔ 阻止访问网站: https://www.example.com

对应的Java代码:


log("⛔ 阻止访问网站: " + url);


图片拦截 vs 网站拦截对比

特性

图片拦截

网站拦截

使用的方法

getResourceRequestHandler()

onBeforeBrowse()

拦截的对象

资源(图片、CSS、JS等)

页面导航(跳转)

阻止方式

disableDefaultHandling.set(true)

return true

返回值类型

CefResourceRequestHandler

boolean

什么时候调用

加载任何资源时

页面要跳转时

日志标识

🚫

实际应用场景

1、企业内网限制


if (!url.contains("company.com")) { // 只允许访问公司域名 return true; // 阻止外部网站 }

2、家长控制


String[] blockedSites = {"pornhub.com", "xvideos.com"}; for (String site : blockedSites) { if (url.contains(site)) { JOptionPane.showMessageDialog(null, "该网站不适合儿童!"); return true; // 阻止 } }

3、白名单模式


String[] whitelist = {"google.com", "wikipedia.org", "github.com"}; boolean allowed = false; for (String site : whitelist) { if (url.contains(site)) { allowed = true; break; } } if (!allowed) { return true; // 只允许白名单网站 }

4、工作时间限制


int hour = Calendar.getInstance().get(Calendar.HOUR_OF_DAY); if (hour >= 9 && hour < 17) { // 工作时间 9-17点 if (url.contains("youtube.com") || url.contains("bilibili.com")) { JOptionPane.showMessageDialog(null, "工作时间禁止看视频!"); return true; // 阻止视频网站 } }


测试验证

  1. 点击"访问 example.com"

    1. 看到阻止效果

  2. 点击顶部"🌐 访问百度"

    1. 看到允许跳转

  3. 观察日志区别

    1. 阻止:⛔ 阻止访问网站: ...

    2. 允许:✅ 允许导航: ...


总结

网站拦截的核心:

  1. 使用 onBeforeBrowse() 方法

  2. 检查目标URL

  3. 返回 true 阻止,返回 false 允许

  4. 可以弹出对话框提示用户

核心代码


if (url.contains("blocked-site.com")) { return true; // 阻止! } return false; // 允许


  1. 修改请求头

操作一下

  • "3️⃣ 测试请求头修改" 区域

  • 点击绿色按钮:"访问百度(查看日志)"

会看到

  1. 页面跳转到百度

  2. 控制台日志显示:

    1. ✅ 允许导航: https://www.baidu.com

    2. 📡 [GET] https://www.baidu.com/

    3. 🔧 添加自定义请求头

    4. 很多其他百度资源的请求,每个都有 🔧 添加自定义请求头


完整流程图

用户点击按钮 → JavaScript跳转 → 浏览器发起请求 → Java拦截请求 → 检查URL → 修改请求头 → 浏览器用新请求头发送


第一步:用户点击"访问百度"按钮

<button onclick="loadBaidu()">访问百度(查看日志)</button>

发生了什么

  • 用户点击按钮

  • 调用JavaScript函数 loadBaidu()


第二步:JavaScript准备跳转

function loadBaidu() { // 第1步:显示提示信息 document.getElementById('result').innerHTML = '⏳ 正在访问百度(查看下方日志可以看到添加的请求头)...'; // 第2步:延迟500毫秒后跳转 setTimeout(() => { window.location.href = 'https://www.baidu.com'; }, 500); }

和"网站拦截"类似

  • 显示提示

  • 延迟后跳转到百度


第三步:Java允许导航

先经过 onBeforeBrowse()


@Override public boolean onBeforeBrowse(CefBrowser browser, CefFrame frame, CefRequest request, boolean userGesture, boolean isRedirect) { String url = request.getURL(); // url = "https://www.baidu.com" // 检查:百度不包含 "example.com" if (url.contains("example.com") && !url.contains("api.example.com")) { // 条件不满足,跳过 } // 允许访问百度 log("✅ 允许导航: " + url); return false; // false = 允许跳转 } ``` **日志输出**: ``` [时间] ✅ 允许导航: https://www.baidu.com


第四步:浏览器开始加载百度

浏览器接收到允许信号

  • onBeforeBrowse() 返回 false

  • 浏览器:好的,我可以跳转

  • 开始加载 https://www.baidu.com


第五步:Java拦截资源请求(关键!)

进入 getResourceRequestHandler()


@Override public CefResourceRequestHandler getResourceRequestHandler( CefBrowser browser, CefFrame frame, CefRequest request, boolean isNavigation, boolean isDownload, String requestInitiator, BoolRef disableDefaultHandling) { // 第1步:获取请求信息 String url = request.getURL(); String method = request.getMethod(); // 第2步:记录所有请求 log("📡 [" + method + "] " + url); // 第3步:检查是否需要修改请求头 if (url.contains("baidu.com") || url.contains("api")) { // 步骤A:创建一个Map来存放请求头 Map<String, String> headerMap = new HashMap<>(); // 步骤B:获取现有的请求头 request.getHeaderMap(headerMap); // 步骤C:添加自定义请求头 headerMap.put("X-Custom-Header", "From-Java-JCEF"); headerMap.put("X-My-Token", "my-secret-token-12345"); // 步骤D:将修改后的请求头设置回去 request.setHeaderMap(headerMap); // 步骤E:记录日志 log("🔧 添加自定义请求头"); } return null; // 使用默认处理 }

详细解释每一步

1.获取请求信息

String url = request.getURL(); // url = "https://www.baidu.com/" String method = request.getMethod(); // method = "GET"


2.记录请求

log("📡 [" + method + "] " + url); ``` **输出**: ``` [时间] 📡 [GET] https://www.baidu.com/


3.检查URL

if (url.contains("baidu.com") || url.contains("api"))

条件有两部分

部分1:url.contains("baidu.com")

url = "https://www.baidu.com/" url.contains("baidu.com") // 检查是否包含 "baidu.com" // 结果:true(包含)

部分2:url.contains("api")

// 如果URL包含 "api",也会修改请求头 // 例如:https://api.example.com/data

为什么这样设计

  • 给百度的所有请求添加自定义头

  • 给任何API请求添加自定义头(通常API需要Token)


步骤A:创建HashMap存放请求头


Map<String, String> headerMap = new HashMap<>(); ``` **`Map` 是什么**: - 键值对集合 - Key(键):请求头名称,例如 `"User-Agent"` - Value(值):请求头的值,例如 `"Mozilla/5.0..."` **形象理解**: ``` Map就像一个字典: "User-Agent" → "Mozilla/5.0 Chrome/122.0..." "Accept" → "text/html,application/json" "Cookie" → "session_id=abc123" "Authorization" → "Bearer token123"


步骤B:获取现有请求头


request.getHeaderMap(headerMap);

这行代码做了什么

  • 把当前请求的所有请求头复制到 headerMap

  • headerMap 现在包含浏览器原本要发送的所有请求头

示例 - 获取前后对比


// 获取前 headerMap = {} // 空的 // 执行 request.getHeaderMap(headerMap) // 获取后 headerMap = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) ...", "Accept": "text/html,application/xhtml+xml,application/xml", "Accept-Language": "zh-CN,zh;q=0.9,en;q=0.8", "Accept-Encoding": "gzip, deflate, br", "Connection": "keep-alive", "Upgrade-Insecure-Requests": "1" }

为什么要先获取

  • 不能丢弃原有的请求头

  • 只是在原有基础上添加新的

  • 如果不获取直接设置,会清空所有原有请求头


步骤C:添加自定义请求头


headerMap.put("X-Custom-Header", "From-Java-JCEF"); headerMap.put("X-My-Token", "my-secret-token-12345");

Map.put(key, value) 的作用

  • 添加或更新键值对

  • 如果key不存在,添加新的

  • 如果key已存在,更新value

示例


// 原有的请求头 headerMap = { "User-Agent": "Mozilla/5.0...", "Accept": "text/html..." } // 执行 put 操作 headerMap.put("X-Custom-Header", "From-Java-JCEF"); headerMap.put("X-My-Token", "my-secret-token-12345"); // 修改后的请求头 headerMap = { "User-Agent": "Mozilla/5.0...", "Accept": "text/html...", "X-Custom-Header": "From-Java-JCEF", // ← 新增 "X-My-Token": "my-secret-token-12345" // ← 新增 }

请求头命名规范

  • 自定义请求头通常以 X- 开头

  • X-Custom-Header = 自定义头

  • X-My-Token = 我的令牌


步骤D:将修改后的请求头设置回去


request.setHeaderMap(headerMap); ``` **这行代码做了什么**: - 把修改后的 `headerMap` 设置回请求对象 - 浏览器会用这些新的请求头发送请求 **完整流程**: ``` 1. request.getHeaderMap(headerMap) ← 获取原有请求头 ↓ 2. headerMap.put("X-Custom", "Value") ← 添加自定义请求头 ↓ 3. request.setHeaderMap(headerMap) ← 设置回去 ↓ 4. 浏览器用新的请求头发送请求


步骤E:记录日志


log("🔧 添加自定义请求头"); ``` **输出**: ``` [时间] 🔧 添加自定义请求头


第六步:浏览器发送修改后的请求

浏览器发送的HTTP请求

修改前(原始请求):

GET / HTTP/1.1 Host: www.baidu.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Accept: text/html,application/xhtml+xml,application/xml Accept-Language: zh-CN,zh;q=0.9 Connection: keep-alive

修改后(Java添加了请求头):

GET / HTTP/1.1 Host: www.baidu.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 Accept: text/html,application/xhtml+xml,application/xml Accept-Language: zh-CN,zh;q=0.9 Connection: keep-alive X-Custom-Header: From-Java-JCEF ← Java添加的 X-My-Token: my-secret-token-12345 ← Java添加的 ``` **百度服务器收到的就是这些请求头!** --- ## 第七步:百度的资源也会被修改 当百度页面加载时,会请求很多资源: ``` https://www.baidu.com/ ← 主页 https://www.baidu.com/img/logo.png ← Logo图片 https://www.baidu.com/static/js/app.js ← JavaScript文件 https://www.baidu.com/static/css/main.css ← CSS文件

每个请求都会经过 getResourceRequestHandler()


// 第1个请求 url = "https://www.baidu.com/" url.contains("baidu.com") // true → 添加请求头 → log("🔧 添加自定义请求头") // 第2个请求 url = "https://www.baidu.com/img/logo.png" url.contains("baidu.com") // true → 添加请求头 → log("🔧 添加自定义请求头") // 第3个请求 url = "https://www.baidu.com/static/js/app.js" url.contains("baidu.com") // true → 添加请求头 → log("🔧 添加自定义请求头")

所以会在日志里看到很多:


[时间] 📡 [GET] https://www.baidu.com/ [时间] 🔧 添加自定义请求头 [时间] 📡 [GET] https://www.baidu.com/img/logo.png [时间] 🔧 添加自定义请求头 [时间] 📡 [GET] https://www.baidu.com/static/js/app.js [时间] 🔧 添加自定义请求头

完整时间线:

时间

事件

代码位置

0ms

用户点击按钮

HTML: `οnclick="loadBaidu()"`

1ms

显示提示

JS: `innerHTML = '⏳...'`

500ms

跳转命令

JS: `window.location.href = ...`

501ms

Java允许导航

Java: `onBeforeBrowse()` 返回 `false`

502ms

浏览器开始加载

浏览器内部

503ms

请求主页

`GET https://www.baidu.com/`

504ms

Java拦截请求

Java: `getResourceRequestHandler()`

505ms

检查URL

Java: `if (url.contains("baidu.com"))`

506ms

获取原有请求头

Java: `request.getHeaderMap(headerMap)`

507ms

添加自定义请求头

Java: `headerMap.put(...)`

508ms

设置回请求

Java: `request.setHeaderMap(headerMap)`

509ms

记录日志

Java: `log("🔧 添加...")`

510ms

浏览器发送请求

带着新请求头

600ms

百度响应

返回HTML

601ms

请求图片/CSS/JS

每个都重复上面的流程

控制台日志:


[时间] 📡 [GET] https://www.baidu.com/ [时间] 🔧 添加自定义请求头


对应的Java代码:

log("📡 [" + method + "] " + url); // 检查并修改 if (url.contains("baidu.com") || url.contains("api")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); headerMap.put("X-Custom-Header", "From-Java-JCEF"); headerMap.put("X-My-Token", "my-secret-token-12345"); request.setHeaderMap(headerMap); log("🔧 添加自定义请求头"); }


实际应用场景
  1. API身份验证

if (url.contains("api.myapp.com")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 从某处获取Token String token = getAuthToken(); headerMap.put("Authorization", "Bearer " + token); request.setHeaderMap(headerMap); }

  1. 统一添加追踪ID

if (url.contains("mycompany.com")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 生成唯一的请求ID String requestId = UUID.randomUUID().toString(); headerMap.put("X-Request-ID", requestId); headerMap.put("X-User-ID", getCurrentUserId()); request.setHeaderMap(headerMap); }

  1. 伪装User-Agent

Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 修改User-Agent,伪装成移动设备 headerMap.put("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 14_0 like Mac OS X)"); request.setHeaderMap(headerMap);

  1. 添加API密钥

if (url.contains("openai.com/api")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); headerMap.put("Authorization", "Bearer sk-xxxxx"); headerMap.put("Content-Type", "application/json"); request.setHeaderMap(headerMap); }


调试技巧:查看实际发送的请求头

修改代码,打印出所有请求头:


if (url.contains("baidu.com") || url.contains("api")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 打印修改前的请求头 System.out.println("=== 修改前 ==="); for (Map.Entry<String, String> entry : headerMap.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } // 添加自定义请求头 headerMap.put("X-Custom-Header", "From-Java-JCEF"); headerMap.put("X-My-Token", "my-secret-token-12345"); request.setHeaderMap(headerMap); // 打印修改后的请求头 System.out.println("=== 修改后 ==="); for (Map.Entry<String, String> entry : headerMap.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); } log("🔧 添加自定义请求头"); }

日志:

[03:09:08] ✅ 允许导航: https://www.baidu.com/
[03:09:08] 📡 [GET] https://www.baidu.com/
=== 修改前 ===
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
X-Custom-Header: From-Java-JCEF
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://pss.bdstatic.com/r/www/static/font/cosmic/pc/cos-icon_20cec29.css
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/topnav/newfanyi-da0cea8f7e.png
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/topnav/newxueshuicon-a5314d5c83.png
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/topnav/newbaike-889054f349.png
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/topnav/newzhidao-da1cf444b0.png
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/topnav/newjiankang-f03b804b4b.png
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/js/lib/jquery-1-edb203c114.10.2.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/js/lib/esl-cf7161da9a.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/bundles/es6-polyfill_388d059.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/bundles/polyfill_9354efa.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/global/js/all_async_search_7e9f559.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/js/sbase-cf781c97b7.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/css/ubase_sync-d600f57804.css?v=md5
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/js/s_super_index-895c0c52f8.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/js/min_super-7b1d78110b.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/hotsearch-4bcd986297.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/topnav/yingxiaoicon-612169cc36.png
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/topnav/newzhibo-a6a0831ecd.png
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/topnav/newyinyue-03ecd1e9b9.png
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/topnav/chengpian-9981cd1fdb.png
[03:09:08] 📡 [GET] https://search-operate.cdn.bcebos.com/523ec78096010ec2eeff619c8b19c0b1.gif
[03:09:08] 📡 [GET] https://www.baidu.com/img/flexible/logo/pc/result.png
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://www.baidu.com/img/flexible/logo/pc/result@2.png
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://www.baidu.com/img/flexible/logo/pc/peak-result.png
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://psstatic.cdn.bcebos.com/basics/aichat/wenwenxin_127_1769511848000.png
[03:09:08] 📡 [GET] https://gips1.baidu.com/it/u=2064921624,4034487978&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f48_48
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://gips0.baidu.com/it/u=4281402270,3169997192&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f54_54
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://gips0.baidu.com/it/u=2472953233,2504508960&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f45_45
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://gips2.baidu.com/it/u=491597113,3916662600&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f48_41
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://psstatic.cdn.bcebos.com/aife/static/more-menu_1756807326000.svg
[03:09:08] 📡 [GET] https://gips1.baidu.com/it/u=1620446295,3278148087&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f48_48
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://gips3.baidu.com/it/u=2788914033,4165369518&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f48_48
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://gips2.baidu.com/it/u=824246517,1077261156&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f48_48
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://gips1.baidu.com/it/u=3018263539,2901263415&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f48_48
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://gips0.baidu.com/it/u=97697174,2756139632&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f48_48
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://psstatic.cdn.bcebos.com/basics/aichat/hot_search_x3_1747880381000.png
[03:09:08] 📡 [GET] https://psstatic.cdn.bcebos.com/basics/aichat/to-up-newer_1766568454000.svg
[03:09:08] 📡 [GET] https://psstatic.cdn.bcebos.com/basics/aichat/to-up-active_1764583314000.svg
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/qrcode/qrcode@2x-daf987ad02.png
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/img/qrcode/qrcode-hover@2x-f9b106a848.png
[03:09:08] 📡 [GET] https://hectorstatic.baidu.com/cd37ed75a9387c5b.js
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:08] 🔧 添加自定义请求头
[03:09:08] 📡 [GET] https://pss.bdstatic.com/static/superman/amd_modules/tslib-c95383af0c.js
[03:09:08] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/plugins/every_cookie_4644b13.js
[0212/030909.020:INFO:CONSOLE(2017)] "无畏是青春的态度,热AI是时代的脉搏。
各位新同学正以无畏的姿态奔赴通用人工智能的星辰大海!
作为引领AI时代浪潮的主力军,广阔舞台,待你大展身手。
乘风破浪,勇往直前,未来百度将与你一起,创造无限可能!
", source: https://pss.bdstatic.com/r/www/cache/static/protocol/https/global/js/all_async_search_7e9f559.js (2017)
[0212/030909.021:INFO:CONSOLE(2017)] "%c百度2026校园招聘简历投递:https://talent.baidu.com/jobs/list color:red", source: https://pss.bdstatic.com/r/www/cache/static/protocol/https/global/js/all_async_search_7e9f559.js (2017)
[03:09:09] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/plugins/bzPopper_d8249c4.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/home/js/nu_instant_search_8ceda8d.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/plugins/swfobject_0178953.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/soutu/js/tu_15b7782.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman-san/app/festival-animation/result_40f23fa.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman-san/app/chat-input/result_bc1e18d.js
[03:09:09] 📡 [POST] https://mbd.baidu.com/ztbox?action=zpblog&appname=pcsearch&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&v=2.0&data=%7B%22cateid%22%3A%2299%22%2C%22actiondata%22%3A%7B%22id%22%3A18463%2C%22type%22%3A%220%22%2C%22timestamp%22%3A1770836949055%2C%22content%22%3A%7B%22page%22%3A%22home%22%2C%22source%22%3A%22%22%2C%22from%22%3A%22search%22%2C%22type%22%3A%22display%22%2C%22value%22%3A%22%22%2C%22ext%22%3A%7B%22status%22%3A%22default%22%2C%22is_log%22%3A%220%22%2C%22have_hotsearch%22%3A%221%22%2C%22is_kuang_rec_disp%22%3A%221%22%2C%22search_kuang_status%22%3A%22default%22%2C%22aisou_btn%22%3A%220%22%2C%22kuang_rec_status%22%3A%221%22%7D%7D%7D%7D
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://sp1.baidu.com/-L-Xsjip0QIZ8tyhnq/v.gif?logactid=1234567890&showTab=10000&opType=showpv&mod=superman%3Alib&submod=index&superver=supernewplus&glogid=2148541745&type=2011&pid=315&isLogin=0&version=PCHome&terminal=PC&qid=0xb6e1b6d700102531&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&super_frm=&from_login=&from_reg=&query=&curcard=2&curcardtab=&_r=0.8842954009451696
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://sp1.baidu.com/-L-Xsjip0QIZ8tyhnq/v.gif?logactid=1234567890&showTab=10000&opType=nodepv&mod=superman%3Alib&submod=index&superver=supernewplus&glogid=2148541745&type=2011&pid=315&isLogin=0&version=PCHome&terminal=PC&qid=0xb6e1b6d700102531&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&super_frm=&from_login=&from_reg=&query=&curcard=2&curcardtab=&_r=0.4620553910873857
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://sp2.baidu.com/-L-Ysjip0QIZ8tyhnq/v.gif?mod=superman%3Acomponents&submod=hotsearch&utype=undefined&superver=supernewplus&portrait=undefined&logPortrait=undefined&glogid=2148541745&type=2011&pid=315&isLogin=0&version=PCHome&terminal=PC&qid=0xb6e1b6d700102531&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&super_frm=&from_login=&from_reg=&query=&curcard=2&curcardtab=&_r=0.09217017571341612&m=superman%3Acomponents_hotsearchShow&showType=hotword&words=%5B%22%E4%B9%A0%E8%BF%91%E5%B9%B3%E6%98%A5%E8%8A%82%E5%89%8D%E5%A4%95%E6%85%B0%E9%97%AE%E9%83%A8%E9%98%9F%22%2C%22%E6%AF%94%E5%B0%94%C2%B7%E7%9B%96%E8%8C%A8%E5%86%8D%E5%BA%A6%E8%AE%BF%E5%8D%8E%E5%B9%B6%E6%BC%94%E8%AE%B2%22%2C%22%E5%A5%B3%E5%AD%90%E9%AA%91%E7%94%B5%E5%8A%A8%E8%BD%A6%E8%BF%912%E4%B8%AA%E6%9C%88%E4%BB%8E%E4%B8%8A%E6%B5%B7%E5%9B%9E%E5%B9%BF%E8%A5%BF%22%2C%22%E5%A4%AB%E5%A6%BB8%E5%B9%B4%E8%BF%98%E6%B8%85%E7%99%BE%E4%B8%87%E5%80%BA%E5%8A%A1%E9%A6%96%E6%AC%A1%E5%9B%9E%E5%AE%B6%E8%BF%87%E5%B9%B4%22%2C%22%E6%89%8B%E6%9C%BA%E5%87%BA%E7%8E%B0%E8%BF%99%E4%BA%9B%E9%97%AE%E9%A2%98%E5%8F%AF%E8%83%BD%E6%98%AF%E8%A2%AB%E6%8E%A7%E5%B1%8F%E4%BA%86%22%2C%22%E5%A5%B3%E7%94%9F%E5%B8%A6%E5%9B%9E%E5%AE%B6%E7%9A%84%E7%94%B7%E5%8F%8B%E6%98%AF%E5%A0%82%E5%BC%9F%E5%88%9D%E4%B8%AD%E5%90%8C%E5%AD%A6%22%2C%22%E5%A4%96%E5%9B%BD%E4%BA%BA%E4%B9%9F%E8%B5%B6%E6%98%A5%E8%BF%90%20ChinaTravel%E8%AF%B4%E8%B5%B0%E5%B0%B1%E8%B5%B0%22%2C%22%E7%88%B1%E6%B3%BC%E6%96%AF%E5%9D%A6%E6%AD%BB%E5%90%8E%E7%9B%91%E7%8B%B1%E7%94%A8%E5%81%87%E5%B0%B8%E9%AA%97%E8%BF%87%E8%AE%B0%E8%80%85%22%2C%22%E7%BD%95%E8%A7%81%EF%BC%81%E5%B2%9B%E5%86%85%E5%A4%9A%E5%85%9A%E6%B4%BE%E4%BA%BA%E5%A3%AB%E5%A3%B0%E6%8F%B4%E9%AB%98%E9%87%91%E7%B4%A0%E6%A2%85%22%2C%22%E8%AE%A9%E5%A4%96%E5%9C%B0%E4%BA%BA%E6%B2%89%E9%BB%98%E7%9A%84%E6%8A%98%E8%80%B3%E6%A0%B9%E5%87%BA%E5%9B%BD%E4%BA%86%22%5D&pagenum=0
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/font/iconfont-fa013548a9.woff2
[03:09:09] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/amd_modules/@baidu/guarantee-popper_784e0ad.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/font/iconfont-fa013548a9.woff2
[03:09:09] 📡 [GET] https://hector.baidu.com/a.js
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/placeholder-ef1014c7fe.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/soutu/css/soutu_new2_baa2298.css
[03:09:09] 📡 [POST] https://mbd.baidu.com/ztbox?action=zpblog&appname=pcsearch&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&v=2.0&data=%7B%22cateid%22%3A%2299%22%2C%22actiondata%22%3A%7B%22id%22%3A18463%2C%22type%22%3A%220%22%2C%22timestamp%22%3A1770836949209%2C%22content%22%3A%7B%22page%22%3A%22home%22%2C%22source%22%3A%22%22%2C%22from%22%3A%22search%22%2C%22type%22%3A%22show%22%2C%22value%22%3A%22home_operate%22%2C%22ext%22%3A%7B%22status%22%3A%22default%22%2C%22is_log%22%3A%220%22%2C%22function_type%22%3A%22ai_search%22%2C%22area%22%3A%22base%22%2C%22pos%22%3A1%2C%22content%22%3A%22%E5%A4%8D%E6%9D%82%E9%97%AE%E9%A2%98%E5%B0%B1%E6%89%BE%E6%96%87%E5%BF%83%E5%8A%A9%E6%89%8B%20%F0%9F%91%89%22%2C%22function_list%22%3A%5B%22%E5%A4%8D%E6%9D%82%E9%97%AE%E9%A2%98%E5%B0%B1%E6%89%BE%E6%96%87%E5%BF%83%E5%8A%A9%E6%89%8B%20%F0%9F%91%89%22%5D%7D%7D%7D%7D
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [POST] https://mbd.baidu.com/ztbox?action=zpblog&appname=pcsearch&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&v=2.0&data=%7B%22cateid%22%3A%2299%22%2C%22actiondata%22%3A%7B%22id%22%3A18463%2C%22type%22%3A%220%22%2C%22timestamp%22%3A1770836949209%2C%22content%22%3A%7B%22page%22%3A%22home%22%2C%22source%22%3A%22%22%2C%22from%22%3A%22search%22%2C%22type%22%3A%22show%22%2C%22value%22%3A%22capsule_bub%22%2C%22ext%22%3A%7B%22status%22%3A%22default%22%2C%22is_log%22%3A%220%22%2C%22function_type%22%3A%22photo_editing%22%2C%22area%22%3A%22base%22%2C%22pos%22%3A2%2C%22content%22%3A%22AI%E7%94%9F%E5%9B%BE%22%2C%22function_list%22%3A%5B%22AI%E7%94%9F%E5%9B%BE%22%5D%7D%7D%7D%7D
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [POST] https://mbd.baidu.com/ztbox?action=zpblog&appname=pcsearch&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&v=2.0&data=%7B%22cateid%22%3A%2299%22%2C%22actiondata%22%3A%7B%22id%22%3A18463%2C%22type%22%3A%220%22%2C%22timestamp%22%3A1770836949209%2C%22content%22%3A%7B%22page%22%3A%22home%22%2C%22source%22%3A%22%22%2C%22from%22%3A%22search%22%2C%22type%22%3A%22show%22%2C%22value%22%3A%22capsule_bub%22%2C%22ext%22%3A%7B%22status%22%3A%22default%22%2C%22is_log%22%3A%220%22%2C%22function_type%22%3A%22office_create%22%2C%22area%22%3A%22base%22%2C%22pos%22%3A3%2C%22content%22%3A%22AI%E5%86%99%E4%BD%9C%22%2C%22function_list%22%3A%5B%22AI%E5%86%99%E4%BD%9C%22%5D%7D%7D%7D%7D
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [POST] https://mbd.baidu.com/ztbox?action=zpblog&appname=pcsearch&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&v=2.0&data=%7B%22cateid%22%3A%2299%22%2C%22actiondata%22%3A%7B%22id%22%3A18463%2C%22type%22%3A%220%22%2C%22timestamp%22%3A1770836949210%2C%22content%22%3A%7B%22page%22%3A%22home%22%2C%22source%22%3A%22%22%2C%22from%22%3A%22search%22%2C%22type%22%3A%22show%22%2C%22value%22%3A%22capsule_bub%22%2C%22ext%22%3A%7B%22status%22%3A%22default%22%2C%22is_log%22%3A%220%22%2C%22function_type%22%3A%22ai_translate%22%2C%22area%22%3A%22base%22%2C%22pos%22%3A4%2C%22content%22%3A%22AI%E7%BF%BB%E8%AF%91%22%2C%22function_list%22%3A%5B%22AI%E7%BF%BB%E8%AF%91%22%5D%7D%7D%7D%7D
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [POST] https://mbd.baidu.com/ztbox?action=zpblog&appname=pcsearch&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&v=2.0&data=%7B%22cateid%22%3A%2299%22%2C%22actiondata%22%3A%7B%22id%22%3A18463%2C%22type%22%3A%220%22%2C%22timestamp%22%3A1770836949210%2C%22content%22%3A%7B%22page%22%3A%22home%22%2C%22source%22%3A%22%22%2C%22from%22%3A%22search%22%2C%22type%22%3A%22show%22%2C%22value%22%3A%22capsule_bub%22%2C%22ext%22%3A%7B%22status%22%3A%22default%22%2C%22is_log%22%3A%220%22%2C%22function_type%22%3A%22ai_code%22%2C%22area%22%3A%22base%22%2C%22pos%22%3A5%2C%22content%22%3A%22AI%E7%BC%96%E7%A8%8B%22%2C%22function_list%22%3A%5B%22AI%E7%BC%96%E7%A8%8B%22%5D%7D%7D%7D%7D
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [POST] https://mbd.baidu.com/ztbox?action=zpblog&appname=pcsearch&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&v=2.0&data=%7B%22cateid%22%3A%2299%22%2C%22actiondata%22%3A%7B%22id%22%3A18463%2C%22type%22%3A%220%22%2C%22timestamp%22%3A1770836949220%2C%22content%22%3A%7B%22page%22%3A%22home%22%2C%22source%22%3A%22%22%2C%22from%22%3A%22search%22%2C%22type%22%3A%22show%22%2C%22value%22%3A%22deepsearch_btn%22%2C%22ext%22%3A%7B%22status%22%3A%22default%22%2C%22is_log%22%3A%220%22%2C%22function_type%22%3A%22%22%2C%22aisou_text%22%3A%22%E9%97%AEAI%22%7D%7D%7D%7D
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://gips2.baidu.com/it/u=1627277417,3307578141&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f526_253
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://www.baidu.com/sugrec?&prod=pc_his&from=pc_web&json=1&imod=2&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&hisdata=%5B%5D&_t=1770836949225&req=2&usegosug=1&csor=0
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: application/json, text/javascript, */*; q=0.01
Ps-Dataurlconfigqid: 0xb6e1b6d700102531
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: application/json, text/javascript, */*; q=0.01
Ps-Dataurlconfigqid: 0xb6e1b6d700102531
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://gips0.baidu.com/it/u=14154217,3818936281&fm=3028&app=3028&f=PNG&fmt=auto&q=100&size=f384_384
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://psstatic.cdn.bcebos.com/basics/chat/afx%202_1750155358000.mp4
[03:09:09] 📡 [POST] https://mbd.baidu.com/ztbox?action=zpblog&appname=pcsearch&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&v=2.0&data=%7B%22cateid%22%3A%2299%22%2C%22actiondata%22%3A%7B%22id%22%3A18463%2C%22type%22%3A%220%22%2C%22timestamp%22%3A1770836949259%2C%22content%22%3A%7B%22page%22%3A%22home%22%2C%22source%22%3A%22%22%2C%22from%22%3A%22search%22%2C%22type%22%3A%22show%22%2C%22value%22%3A%22kuang_rec%22%2C%22ext%22%3A%7B%22status%22%3A%22default%22%2C%22is_log%22%3A%220%22%2C%22query%22%3A%22%E5%A5%B3%E5%AD%90%E7%BE%8E%E7%9D%AB%E5%90%8E%E7%9D%AB%E6%AF%9B%E4%B8%8A%E9%95%BF%E6%BB%A1%E8%9E%A8%E8%99%AB%22%2C%22str_sa%22%3A%22iph_igh_notyyc_gsnd%22%7D%7D%7D%7D
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://psstatic.cdn.bcebos.com/basics/chat/afx%202_1750155358000.mp4
[03:09:09] 📡 [GET] https://psstatic.cdn.bcebos.com/basics/chat/afx%202_1750155358000.mp4
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/tips-e2ceadd14d.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/super_load-0d7fab1791.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/qrcode-9bba34e3d7.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/advert-374dc154df.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/login_guide-4fba3971ce.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/video-meet-7833028d86.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/content-info-12dbf9fb6d.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/csaitab-log-a9c9cae804.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/top-right-operate/operate-b7693b0cc7.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/aging-tools-d6d9fc5dee.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/invoke-97e9694cb9.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/new-search-guide-bub-a65115eb7c.js
[03:09:09] 📡 [GET] https://hectorstatic.baidu.com/96c9c06653ba892e.js
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/amd_modules/@baidu/video-meeting-1be7f62dac.js
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/components/guide_tips-d9e617f782.js
[03:09:09] 📡 [GET] https://passport.baidu.com/passApi/js/wrapper.js?cdnversion=1770836949495&_=1770836948889
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [POST] https://mbd.baidu.com/ztbox?action=zpblog&appname=pcsearch&sid=63146_67153_67220_67294_67319_67316_67314_67323_67320_67369_67441_67478_67501_67556_67542_67601_67619_67597_67641_67651_67704_67718_67746_67754_67313_67738_67811_67822_67824_67826_67828_67833&v=2.0&data=%7B%22cateid%22%3A%2299%22%2C%22actiondata%22%3A%7B%22id%22%3A18463%2C%22type%22%3A%220%22%2C%22timestamp%22%3A1770836949501%2C%22content%22%3A%7B%22page%22%3A%22home%22%2C%22source%22%3A%22%22%2C%22from%22%3A%22search%22%2C%22type%22%3A%22show%22%2C%22value%22%3A%22csaitab%22%7D%7D%7D
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: */*
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/js/ubase-dddde7cd4e.js?v=md5
[03:09:09] 📡 [GET] https://pss.bdstatic.com/r/www/cache/static/protocol/https/amd_modules/@baidu/aging-tools-pc_63487d8.js
[03:09:09] 📡 [GET] https://hector.baidu.com/static/h.gif?d=3c4e75773d6c6e646a53592637607219200d76773c66233f6a1d70712a7561141315727b202a2d312107666121646034054e2e3c206d726021066c572d6e76112009203271646e702905517036736517224e2e3c3c6663762e067061217377152b09616a7124237c260b676236736119291c776a7124237c260b67623673611d26181a767124237c260b676236736104280b6572362a2d312707616b3775611e331a6b6d3a6a687f211d7b652c756b03330d767b3060607d2f0c20287b6e6a132802767b2b7c6d7c3b1d20287b6e6a132802767b2b7c73763b1d6d763c65265c65036c6d366b7461211d7b74366d6d133e1a6b713f69757a270720287b6e6a032b03767d3b696f742d4b2e26366f741f2e02767b217a60643d1966652d64265c65036c6a21696f60211d6b6b3773711e654020713d7c7372261a6b70306e6a03330d706a7124237c261d706537726d042e036c7d32666276244b2e263a736b033423707734616f5a3b066e652d6460526b4e717d3b6d6566240c70267523621929082032717a6463271b76412b736b026540206d277a74703c1c70613d42681f29092032716b6961270467267523671f28076b7b007c6e612d4b2e263560711e2404536b367d6431644b65612d52670222096c5a367c607a241a20287b6e74152928636a326a60602d4b2e26287461023e206d7d3264477c261d712675237718281b4677216d6267271b7b5430626f15354e2e3c20606e640719676a1f68681517056175367a233f6a1a6a6b2e526506222a6b7236586870230c702675236b022e0b6b70126f647d3c2a6e712a7561026540207d216d6576261d6b65356d6103344e2e3c3c6672703a066e683c6f60526b4e757b316368671a0c73713c7270362e00674d2a7b7576254b2e262e64661b2e18507b20676d652d256d67386d42192b095167207c647e1d3b4e2675236c526b4e5d73326642723a0d20287b5e7700180d71673d6b233f6a0b66777b2d262f2400636d204b607f242a6a613a6a265c6533667b35616f76181b6d743c737019221f2032715762612d0876611a6d6503344e2e3c0c6c6475210767542b6e741535187b3c7f2a5e60381051613765265c6533716e2a5b647d2c2c70763673265c650e6d7a2a2a2d312608746d3e6070156540207f3f5760613a4b2e262a646816081c67707124237a3b204726752341526b4e607a067b64616a4520663d50711535152032716a65463b0c44652f6e265c650e6658327e6e5c264b2e263b654719234e2e3c316c527a2c4b2e263b655715351a676c07616c766a4520663d506d146540207c377b757c230c6c267523681f20056c41207d62702d1a71267523772f23036f7f3a66233f6a1a5d773c7277192802203271575e7a260076403875652f184e2e3c0c5760603107615b2a75761133096567712423376a45206e087461023e4e2e3c376d677a260c20287b7361013205707b712423763b0520287b6877382e18517f3e786d7a260e20287b6877332b03717b1b676c76181b6760306270526b4e41713c6368766a4520510952265c65335d6c367b75723a1d5d67366f621935015d6a3a65647c3d1d20287b5e5b132802647721655e672104676b2c75265c65335d7a3a7b6071240c5d6d2a5e63052e08673c7f2a5e4c2c0071653b6d612f341b636e0c7c6e4c2d04727020232852183371693a7c627b17086660066c65032c4e2e3c0c57646b3c0c6c602a2328521833636d2061667d6a45205b06736103334e2e3c0c5765762b0670652d64265c65335d6e327a607e6a45205b066c61042608636a322a2d311736637338687015354e2e3c0c576676260c70652d6e76526b4e5d413670717c3a1d51703873265c65335d68326474763b4b2e26065e76152608203271575e60381b67653d2328521833716e216d6077091b70652072265c65335d7f246968676a45205b06607709290f457b3d6d73723c06702675235b2f261f7b70304c647f2d0e63703673265c65335d7f20716f701e086e713c72265c65335d73326364472d0472683875613f2506677d272a2d3117366b69296e76041418636c7124234c17006f7436737034220a636b3f7c233f6a365d6735607703171e6b68327c6455210c6e601e6470526b4e5d41306460603b39706d2f60701501056772375b64676a45205b066276152618675c3a66657a260e20287b6b5505221e7b2f623833237a513b336e313642745a3a26603b332b7b4b2e2638656035114e2e3c0c694c506a452065355e67526b4e63720c6b3331644b612675235011203d2032714f233f6a07715b3a5e741a6540207020576231644b666b34606d1e6540207b206b60632d215649152328522e026b6a037a647f27086626752377153304644e3c7b233f6a1c71612b5e67526b4e6b703a7c51723b1a54377b2d2619341c5d763a626070234b2e263e6470162209667c326b6a57291d6326752362152208607f30635276240c61703673265c650a677b376a60702320616b3752611c220f7671212a2d31211a60652a643244654020410c6b607f240b6367325e6a112a09713c7f2a68766a45206d3c37265c651970727124236023006c403c676102654020783c7a6c723c2d63703c232852250d717b1060607d2f0c5776352328522b0d6c791060607d2f0c5776352328522608745d3b696f742d3c70687b2d26162e00675d3b696f742d3c70687b2d260132097067016d717f290a672675236108332f6a7f3d6f64463a0520287b6d651e200a6b72276d7347211920287b756d1d220a6b72276d7347211920287b676d1c22387b6e365c68636a45206d37726d14223f677f216b6947211920287b40265c65056c77275a64603d0576473568671b0b03653c7f2a67726a45205b306f721f2c095d723c6f687d6a4520662b6e7303221e2032716a737c3f1a67762f6476032e036c3c7f2a6361271e71612b757d00224e2e3c3c7b233f6a007153306f52193418633c7f2a6e603e0c7077306e6a526b4e524c1657425c062720287b6270072e0220327161627c2c0c76612a75265c650f6d6c362a2d313d0b61267523662f3509613c7f2a72703a3670613a23285235096a41216d6231644b6a652a69265c651f676a007d66582d1020287b6661040419706d3c7a7543271a6b70306e6a526b4e6176326666761d1b6e26752374112009516a327c6431644b52401a5e45231e22413c7f2a677c3a045d772c636919334e2e3c3a66657630366e6d376a77526b4e6b70376d794c270720287b686a1422145d71356e233f6a246d683c62711c223f676c256162766a4520427b2d26242f196c7a367a233f6a046d683c5261023105617b7124234c3004636a067274152208203271616c74040665572b62265c651c636c32657231644b71763a2328522e0165523c6f233f6a1e67663b33265c65056f793f67664c17583533693937467e583b2e663e233f6a006f63356e632f185d352963303225715d3b346c36265c65056f793f67664c17583533693937467e583b2e6539233f6a1d676929456504264e2e3c276760603c4b2e267d636b143e4e2e3c0c646e722c367170387571036540206d366665462a0a4e6b3e2328522e01654d266f5276260d20287b6f6b312e3f7779006d6f776a4520772c664c19342f6e7730635276260d20287b7271170f05714d3b6776402d0766267523651900196b7a365b697c3f3a676a3d23285234096c7a1a78755f270e20287b6661041619676c2a5b75612107652675236718220f6956207d665a264b2e263a6961132c24716b345b697c3f4b2e26106c6124350d6175712423423d00616f1d646815330920327157316b7a5d3b317b2d262f7714307d356e233f6a36767d29646b166540204a1645515c1a28505d7b2d2620023e5157005c445d1c4b5f287b6f65062e0b636a3c7a2329334b746137656b021419603c692a233f6a19706b3d7467041419603c692a3323785a32356936265c651a677037677331724b456b3666681567256c7d7d2a2d3125087a503674671817036b70277b23296a5920287b726718220877723a666631724b596b3b6b6113334c517d3b6d656624006c6304232852321f676c126b757a3e08766d366f264a65376d7c396d6267683c71612b4067042e1a636a3a676f4e6a452060364f6b04131e637d382a3b7d3d056e287b66611f2b03617f27616e7d6a53205f36636e152418225936676d7c2b08766d366f59526b4e61713d6664703c006d6a7b3b262b280e687b307c215d2d1d756b2b6a4d1e21037073327c687c263420287b71680520056c6d71325a316a4520267523265c654e2e3c71242331644b20287b2328526540203c7f2a233f6a4b2e267b2d26526b4e2032712a2d316a4520267523265c654e5f327165687e2d3d7b743c72264a65376d7c396d626768246b693c557d00222d706c32715c31644b72603f576d153009705b3d69637f2d0d203e7b757605224e2e3c246d6378211d566134716b02261e7b4d276773722f0c203e7b5a6b122d09616a734c64633a0c61652d6460233303707f346d5066271d63597b2d2607220e6977275864613b0071703c6f70233303707f346d23296a326d66336467046728676e216d62723c0c66572d6e76112009536b3c7c604e6a45206c38736007261e675d3c6662663a1b676a3a78264a655e323c7f2a627c27026b611c6f65122b09663c692a75613d0c20287b6074000403667b1d696c766a532049367b6d1c2b0d20327169716306086f617b3b263e2218717d32786431644b63742957610234056d70713223266659222c0e686a14281b713e1d5c21227847323f79566d1e7158393e2b3e353a682872743564531525276b6a7c3d3224665a3424714a4c240a202e3e3f616a76682e6767326e2d50040470713e6d2e227a5b2c3477312a40673f6378327a683c7d5a352a6a37265c651c6e7f276e6e61254b38260e686a43754e2e3c237a6e773d0a76266323431524076d3c7f2a74602d1b43633c6f70527d4e4f7129616d7f2946372a69212c272e026671247b215d1c49333477313f5010056c286733216b7e5d2b241871741c223b677c1861753c7d5a352a6a3724580c2456531f24217f210267241e64671b2845225d3b7a6e7e2d4633366b2f345e7742323e006967723a002d316a362a43714e2e3c3f696f743d0865617b3b26152941574d7124237f29076571386661036556207b3d255440640c6c2675236b1e0b056c7b713223673a1c67267523731525087077256d7331724b6465357261526b4e657b274f607e2d1963602a233e5221196c7d27616e7d680e67701e606915370d666d7b21216868326c652d687215670f6d7a3655216e6a45206e38776535290d6072366c23296a0f776a3a756d1f294c687f2569447d290b6e613d292d503c4c5970327c68652d49616b3d6459503a4e2e3c206d6f770a0c6367366f264a650a7770307c687c2649716137654615260f6d707b21216868326c652d687215670f6d7a3655216e6a4520723063761133092024716e747d2b1d6b6b37217219251e636a362028333349596a38756d06224c6171376d5c33354b2e263b6d711533036d6a3b2a3b311306606e3c6270500500777b27676e67203420287b72701f350d657b117d62782d1d712663235f1f2506677d27285267271b63633c4371132c097653326660742d1b5f267523671c2e1c6071327a6531724b596b3b6b6113334c41723a78637c291b66597b2d26133509667b3d7c6872241a203e7b5a6b122d09616a734b73762c0c6c703060680304036c6a32616f763a3420287b6a61092503636c372a3b311306606e3c6270500c097b7c3c697377154b2e2634606a112009663c692a5a7c2a0367672d214a1131051e7f2767735e290763633c654011330d5f3c7f2a6c762c0063403c776d13221f202471536e71220c6170794c61142e0d467b256162763b3420287b72701f350d657b71322348270b68613a7524233303707f346d4c72260865612b5c265c651f676c256162761f06706f3c73264a65376d7c396d6267683a67762f68671510037075367a427c261d636d3764762d654020683a7a75662905496120636b113508202471536e71220c617079576d0233196372186d78712708706004232852300d697b1f6762786a53205f36636e15241822493263645f270a69597b2d2614221a6b7d3645647e271b7b2663233c526b4e776d367a40742d077640387565527d4e5971316264703c494c652f6863113303704b124c6067293420287b6d6b172e02202471536e71220c6170794f65062e0b636a3c7a4d7c2f006c597b2d26192907202471536e71220c617079486a1b1a4e2e3c3e6d657a292a637438636d1c2e186b7b202a3b311306606e3c6270500a096677324b6063290b6b6830756d1534312032716068776a53205f36636e15241822561a4c5c31644b6e6b3a6a77527d4e5971316264703c494e6b3a6a4911290d657b2155233f6a0e72717b3b262b280e687b307c2154183c5f26752369152305634d367b727a2707203e7b5a6b122d09616a73456477210851612a726d1f293120327178646125007177306e6a03655620453c6a6b762b1d22543c736919341f6b713d7b5c31644b72763c72611e330d76773c6623296a326d6633646704673c707b206d6f67291d6b6b375c265c6519717c71322348270b68613a752425142e5f3c7f2a79616a53205f36636e1524182246015b78603c0c6f597b2d2603221e6b7f3f2a3b311306606e3c6270501409707732645c31644b756d37656b0704036c6a21676d60071f677635607d527d4e5971316264703c49556d37656b0704036c6a21676d60071f677635607d2d6540207d3f6d60610919724638656315655620782666626721066c243a6d6111352d726e116965742d412b2422215f1e26186b683628627c2c0c5f24242328522009765c327c75763a10203e7b67711e24186b713d2866763c2b63702d6476096f45226573536f723c00746179626b1422312263712423742d1d57773c7349152305633c692a6766260a766d366f24172218576d367a4c762c00632c70217f501c02636a3a7e64332b066661042179526b4e707b227d64603c244b4010406713221f713c692a6766260a766d366f2402221d777b207c4c5a0c2043673a6477036f45226573536f723c00746179626b1422312263712423612d1877612a754915230563553671526a3b1d676918626715341f2024716e747d2b1d6b6b372176153619676d274564772108496120527d0333096f5f306b64603b412b2422215f1e26186b683628627c2c0c5f24242328523409765f237843722c0e672663236205290f76773c6621602d1d43742943651420092a37737321482608766d2f642413280867437375233f6a1e6766326870372218576d367a4c762c00632663236205290f76773c6621642d0b696d2d466104121f676c1e6d657a29412b2422215f1e26186b683628627c2c0c5f2424232852200976573d7b7572240567600b6468113309665f23787231724b64713762701928022279367c487d3b1d6368356460222200636a366c4063381a2a2d797a242b290d7677256d2170270d6759797c265c651e67793a7b75763a39706b2d6e671f2b246370376464616a5320622c6f67042e036c3e216d667a3b1d677609736b04280f6d721b696f77240c702c70217f501c02636a3a7e64332b066661042179526b4e7770216d667a3b1d677609736b04280f6d721b696f77240c702663236205290f76773c662166261b676330727015353c70712767627c2421636a3d6d61026f45226573536f723c00746179626b142231226371752d312d11767638233e0b6504707b352a3b31201d76742a3b2b5f301b7530316968773d47616b342e265c651e6778367a73763a4b38267b2d2618261f407b3b69777a271b203e3f60680322402076327b557c3d0a6a266367651c34092e3c30676c63291d4f6b3d64264a652f514d624b6e7e380876267523601f2a246b7a376d6f31720f63682a6428523709707871322323645b3528683134526b4e6671305b68692d4b382668323c446b593b267124237a3b206c4d3f73651d224e387832647276644b6b770a6069150f03716a713275613d0c2e2630725705371c6d6c274b607d3e0871266375760522402076327b40770a056d6732233e162600717b7f2a627c27026b611c6f65122b09663c697c73662d45207435746319291f20240873237d2904672663235434014c5477367f64616a4520603c7267022e1c76773c6623296a396d762d60661c224c4671307d6c76261d224236736911334e2e3c3e616c761c1072612a233e2b3c4e7667236d23296a0872743568671133056d707c7865756a4520772c6762193f09713c692a71772e4b7f282223700937092024717c646b3c4672603f232852341964783a7064606a5320743d67260d1a112e657166607e2d4b38261a69761f2a09224e174e2145210c75612b2328522309717d2161716721066c266323541f3518637c3f6d2157270a77693c6f705001037073327c233f6a046b693c557d00221f202408732367311967266323650037006b7d327c687c264672603f232852341964783a7064606a5320743d67260d6b17206a2a786431724b766121752b00230a2032717b74752e007a612a233e523708643c2e557c3f334b6c653464264a652f6a6c3c656866254952401f215219221b676c712423772d1a6176307170192802202471586e613c0860683c21401f24196f7b3d7c2155271b6f652d2328522a056f7b077171763b4b385f222370093709202471697163240061652d686b1e681c6678712423603d0f646d216477527d4e727a352a7c3f334b767d2964264a65186766272771772e4b2e262a7462162e14676d713223632c0f2079047c280b65026373362a3b310500617636726b16334c477a346d21430c2f225230647315354e2e3c376d72703a007270306e6a527d4e5271217c6071240c22403662711d2202763e1567737e291d20287b6c6d1d22387b6e367b232913122070207161527d4e636e23646870291d6b6b372e7414214e2e3c207d6775211167777b3b2600230a20637f73236731196726632370153f182d6e376e233f6a1a77623f687c15344e383c236c673135347f2822236a112a092024715f6471030076243b746d1c33416b70735845556a4520603c7267022e1c76773c6623296a396d762d60661c224c4671307d6c76261d224236736911334e2e3c3e616c761c1072612a233e2b3c4e7667236d23296a0872743568671133056d707c7865756a4520772c6762193f09713c692a71772e4b7f282223700937092024717c646b3c4672603f232852341964783a7064606a5320743d67260d1a115f3271616f772d1167601d43264a331e777b7f2a72763b1a6b6b3752701f350d657b713275613d0c2e26356e67112b3f7671216966766a5376762c64285233056f7b09676f76070f64773c75264a755c2e3c3f696f743d0865612a233e5222022f4b002a2d31200870602e60761504036c7d267a7376260a7b266333345c650163660767747020396d6d377577527d5c2e3c27677470202c74613775264a210d6e6d36242367271c616c0a756502334e387832647276644b75613b6668262202667b212a3b310f066d6335642439290f2c3e7b46575a0c20432d7b2d2607220e6572016d6f772d1b203e7b404a370b2922361d5e485701282e2417574d340e2d2259364e6e612b0c22560d592443775b323e0761215f2919766b29214320124c2a2e2b383123785b3641692824342e1e677d273b45227949747706345b40671c71416657313f682d314068302d526b4e7272327c677c3a04203e7b566d1e745e2032717b62612d0c6c57307b61527d4e302b65382d227c5d32286b3432406b5d362e632a2d312b066e6b2b45610033042024613c2d3138007a61355365042e0320246226343f6a0a6d68367343112a19763c692a72612f0b20287b626b1e331e636d275873762e0c7061376261527d5c2e3c356773702d0d416b356e76527d4e6c713d6d233f6a016676146e60156556206d27696f77291b66267523671f2b03706d1a6677763a1d67607b3b26526b4e617621676c761e0c7077306e6a527d4e332f623a3021795b33366b333641765e332f623a30227958333568303541765d332f623930227958333668303541765d332f623930227958333568303541765d2032716e7131724b63336c353747700f3a2a64306470700d37366c6537467e08602f313a37237e0b20287b677433281f764a3a656431725f32797523700937092024716962702d1a7126752374022808777d272a3b31380a5161387367181509716b3f7c236e&t=1770836949548
=== 修改前 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
=== 修改后 ===
sec-ch-ua: "Not(A:Brand";v="24", "Chromium";v="122"
X-Custom-Header: From-Java-JCEF
sec-ch-ua-mobile: ?0
Accept: image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8
sec-ch-ua-platform: "Windows"
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36
Accept-Language: en-US,en;q=0.9
X-My-Token: my-secret-token-12345
[03:09:09] 🔧 添加自定义请求头
[03:09:09] 📡 [GET] https://pss.bdstatic.com/static/superman/css/ubase-89d6b96e41.css?v=md5


总结

请求头修改的核心步骤:

  1. 获取原有请求头 - request.getHeaderMap(headerMap)

  2. 添加或修改请求头 - headerMap.put(key, value)

  3. 设置回请求 - request.setHeaderMap(headerMap)

  4. 浏览器用新请求头发送

核心代码


Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 获取 headerMap.put("Authorization", "Bearer xxx"); // 添加 request.setHeaderMap(headerMap); // 设置


  1. 请求API

操作步骤:

  • "4️⃣ 测试API请求" 区域

  • 点击按钮:"发送API请求"

会看到

  1. 页面显示:"⚠️ API请求失败(正常现象)"

  2. 控制台日志:


[时间] 📡 [GET] https://api.example.com/data [时间] 🔧 添加自定义请求头


JavaScript代码:


function fetchAPI() { document.getElementById('result').innerHTML = '⏳ 发送API请求...'; // 使用fetch发送API请求 fetch('https://api.example.com/data') .then(response => { document.getElementById('result').innerHTML = '✅ API请求已发送(查看日志)'; }) .catch(error => { document.getElementById('result').innerHTML = '⚠️ API请求失败(正常现象,因为是演示URL)<br>已在日志中记录请求'; }); }

fetch() 是什么

  • JavaScript的API请求函数

  • 类似于 XMLHttpRequest

  • 用于发送HTTP请求

这个请求

  • 发送GET请求到 https://api.example.com/data

  • 这个URL是假的,所以会失败

  • 但Java仍然会拦截到这个请求


Java处理(和第三个完全相同!):

进入 getResourceRequestHandler()


@Override public CefResourceRequestHandler getResourceRequestHandler(...) { String url = request.getURL(); // url = "https://api.example.com/data" String method = request.getMethod(); // method = "GET" // 记录请求 log("📡 [" + method + "] " + url); // 检查URL(注意这个条件) if (url.contains("baidu.com") || url.contains("api")) { // ↑ // 这里匹配 "api" Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 添加Token(这对API很重要!) headerMap.put("X-Custom-Header", "From-Java-JCEF"); headerMap.put("X-My-Token", "my-secret-token-12345"); request.setHeaderMap(headerMap); log("🔧 添加自定义请求头"); } return null; }


条件判断:


if (url.contains("baidu.com") || url.contains("api"))

分析


url = "https://api.example.com/data" url.contains("baidu.com") // false(不包含baidu.com) url.contains("api") // true(包含"api") // ^^^ // https://api.example.com/data // ^^^ // 找到了! // 整体结果:false || true = true // 条件满足,执行修改请求头


请求会失败原因很简单

  1. https://api.example.com/data 这个URL是假的

  2. 真实世界里不存在这个API

  3. 浏览器发送请求,但服务器不存在或不响应

  4. fetch() 进入 catch 分支

  5. 显示"API请求失败"

但这不重要!重要的是

  • ✅ Java成功拦截了这个请求

  • ✅ Java成功添加了自定义请求头

  • ✅ 浏览器用新请求头发送了请求(虽然失败了)

和第三个"请求头修改"的相似之处:

对比项

第三个(访问百度)

第四个(API请求)

触发方式

window.location.href

fetch()

目标URL

https://www.baidu.com

https://api.example.com/data

匹配条件

url.contains("baidu.com")

url.contains("api")

Java方法

getResourceRequestHandler()

getResourceRequestHandler()

操作

添加请求头

添加请求头

核心代码

request.setHeaderMap()

request.setHeaderMap()

请求结果

成功(百度存在)

失败(URL是假的)

区别只有一个

  • 百度URL存在,请求成功

  • API URL不存在,请求失败


实际场景中的应用

第四个例子模拟的是真实的API身份验证场景

场景1:调用公司内部API

if (url.contains("api.mycompany.com")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 添加公司内部的认证Token headerMap.put("Authorization", "Bearer " + getCompanyToken()); headerMap.put("X-User-ID", getCurrentUserId()); request.setHeaderMap(headerMap); }

场景2:调用第三方API(如OpenAI)

if (url.contains("api.openai.com")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 添加OpenAI的API密钥 headerMap.put("Authorization", "Bearer sk-xxxxxxxxxxxxxx"); headerMap.put("Content-Type", "application/json"); request.setHeaderMap(headerMap); }

场景3:统一添加认证信息

// 给所有包含"api"的请求添加Token if (url.contains("api") || url.contains("/v1/") || url.contains("/v2/")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); String token = TokenManager.getToken(); headerMap.put("Authorization", "Bearer " + token); request.setHeaderMap(headerMap); }


为什么要单独演示API请求?

虽然和第三个功能代码相同,但单独演示有这些目的:

1. 强调API场景的重要性
  • API请求几乎总是需要认证

  • Token、API Key是常见需求

  • 这是实际工作中最常用的场景

2. 展示不同的触发方式
  • 第三个:页面导航(window.location.href

  • 第四个:AJAX请求(fetch()

  • 两种方式都能被Java拦截

3. 演示失败也能拦截
  • 即使API不存在

  • Java依然能拦截并修改请求头

  • 证明拦截发生在发送请求之前

4. 更贴近实际应用

在真实项目中:


// 前端代码 fetch('https://api.example.com/user/info') .then(response => response.json()) .then(data => console.log(data)); // Java自动添加Token // 前端无需手动设置请求头 // 所有API请求都自动带上认证信息


实验:对比有无请求头的区别

修改代码测试:

测试1:去掉 "api" 条件

// 修改前 if (url.contains("baidu.com") || url.contains("api")) // 修改后(只匹配百度) if (url.contains("baidu.com"))

重新运行,点击"发送API请求"

  • 日志会显示:📡 [GET] https://api.example.com/data

  • 日志不会显示:🔧 添加自定义请求头

  • 证明:条件不匹配,没有修改请求头

测试2:添加调试输出

if (url.contains("baidu.com") || url.contains("api")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 打印修改前 System.out.println("=== API请求头(修改前)==="); headerMap.forEach((k, v) -> System.out.println(k + ": " + v)); headerMap.put("X-Custom-Header", "From-Java-JCEF"); headerMap.put("X-My-Token", "my-secret-token-12345"); request.setHeaderMap(headerMap); // 打印修改后 System.out.println("=== API请求头(修改后)==="); headerMap.forEach((k, v) -> System.out.println(k + ": " + v)); log("🔧 添加自定义请求头"); }


总结

第四个"测试API请求"

  1. 代码层面:和第三个完全相同,都是修改请求头

  2. 触发方式:不同(一个是页面跳转,一个是fetch)

  3. 实际意义:强调API认证场景的重要性

  4. 教学目的:展示同一个Java代码可以拦截不同类型的请求

核心逻辑


if (url.contains("api")) { // 添加Token headerMap.put("Authorization", "Bearer xxx"); request.setHeaderMap(headerMap); }

本质上就是第三个功能的一个应用实例,只是用来强调API场景而已。


3️⃣ 核心概念讲解

1. CefRequestHandler - 请求处理器

这是拦截请求的入口:


client.addRequestHandler(new CefRequestHandlerAdapter() { // 在这里拦截和处理请求 });

2. getResourceRequestHandler() - 资源请求处理

每当浏览器要加载资源时都会调用:


@Override public CefResourceRequestHandler getResourceRequestHandler( CefBrowser browser, CefFrame frame, CefRequest request, // 包含URL、请求头等信息 boolean isNavigation, boolean isDownload, String requestInitiator, BoolRef disableDefaultHandling) { String url = request.getURL(); // 这里可以查看、修改、拦截请求 return null; // 返回null表示使用默认处理 }

快速记忆表

参数

简单理解

常用操作

browser

哪个浏览器

browser.getURL()

frame

主页面还是iframe

frame.isMain()

request

请求详情(最重要)

request.getURL(), request.getMethod()

isNavigation

会不会跳转

判断是否页面跳转

isDownload

是不是下载

判断是否下载文件

requestInitiator

谁发起的

防止跨域攻击

disableDefaultHandling

要不要阻止

.set(true) = 阻止

参数1:CefBrowser browser - 浏览器实例

是什么:发起请求的浏览器对象。

形象理解:就像你家的电脑,告诉你"是哪台电脑发出的请求"。

实际用途


// 获取当前浏览器的URL String currentUrl = browser.getURL(); System.out.println("当前页面: " + currentUrl); // 在浏览器中执行JavaScript browser.executeJavaScript("alert('拦截到请求!')", currentUrl, 0); // 让浏览器后退 browser.goBack();

例子


if (browser.getURL().contains("baidu.com")) { System.out.println("这个请求来自百度页面"); }

参数2:CefFrame frame - 框架(页面或iframe)

是什么:发起请求的页面框架。一个浏览器窗口可能有多个框架。 形象理解:

  • 主框架 = 整个网页

  • 子框架(iframe) = 网页里嵌入的小网页


┌─────────────────────────┐ │ 主框架 (Main Frame) │ │ ┌─────────────────┐ │ │ │ iframe 1 │ │ ← 子框架 │ └─────────────────┘ │ │ ┌─────────────────┐ │ │ │ iframe 2 │ │ ← 子框架 │ └─────────────────┘ │ └─────────────────────────┘

实际用途


// 判断是否是主框架 if (frame.isMain()) { System.out.println("这是主页面发出的请求"); } else { System.out.println("这是iframe发出的请求"); } // 获取框架的URL String frameUrl = frame.getURL(); // 在特定框架中执行JavaScript frame.executeJavaScript("console.log('Hello')", frameUrl, 0);

例子


// 只拦截主框架的请求,忽略iframe if (frame.isMain() && url.contains("blocked")) { disableDefaultHandling.set(true); }

参数3:CefRequest request - 请求对象(最重要!)

是什么:包含请求的所有详细信息。

包含的信息

  • URL(要访问的地址)

  • 请求方法(GET、POST等)

  • 请求头(Headers)

  • POST数据

实际用途


// 1. 获取URL String url = request.getURL(); System.out.println("请求的URL: " + url); // 2. 获取请求方法 String method = request.getMethod(); System.out.println("请求方法: " + method); // GET, POST, PUT, DELETE... // 3. 查看请求头 Map<String, String> headers = new HashMap<>(); request.getHeaderMap(headers); System.out.println("User-Agent: " + headers.get("User-Agent")); System.out.println("Cookie: " + headers.get("Cookie")); // 4. 修改请求头 headers.put("Authorization", "Bearer my-token"); headers.put("X-Custom", "My-Value"); request.setHeaderMap(headers); // 5. 获取POST数据 CefPostData postData = request.getPostData(); if (postData != null) { System.out.println("这是一个POST请求,有数据提交"); }

完整例子


String url = request.getURL(); String method = request.getMethod(); System.out.println("=== 请求详情 ==="); System.out.println("URL: " + url); System.out.println("方法: " + method); // 查看所有请求头 Map<String, String> headers = new HashMap<>(); request.getHeaderMap(headers); for (Map.Entry<String, String> entry : headers.entrySet()) { System.out.println(entry.getKey() + ": " + entry.getValue()); }


参数4:boolean isNavigation - 是否是页面导航

是什么:判断这个请求是否会导致页面跳转。

形象理解

  • true = 你点击了链接,或在地址栏输入网址,页面要跳转了

  • false = 只是加载图片、CSS等资源,页面不跳转

例子


if (isNavigation) { System.out.println("🚗 这是页面导航(要跳转了)"); System.out.println("从 " + browser.getURL() + " 跳转到 " + request.getURL()); } else { System.out.println("📦 这只是加载资源(图片、CSS等)"); }

实际应用


// 只拦截页面导航,不拦截资源加载 if (isNavigation && url.contains("危险网站")) { return true; // 阻止跳转 }


参数5:boolean isDownload - 是否是下载

是什么:判断这个请求是否会触发文件下载。

形象理解

  • true = 用户点击下载按钮,或者浏览器要下载文件了

  • false = 正常浏览,不是下载

例子


if (isDownload) { System.out.println("💾 用户要下载文件: " + request.getURL()); // 可以阻止下载 if (url.endsWith(".exe")) { System.out.println("⛔ 阻止下载exe文件!"); return true; // 阻止 } } else { System.out.println("👀 正常浏览网页"); }

实际应用


// 记录所有下载 if (isDownload) { String fileName = url.substring(url.lastIndexOf('/') + 1); logDownload(fileName, url); // 企业环境:阻止下载某些类型的文件 if (url.endsWith(".exe") || url.endsWith(".bat")) { JOptionPane.showMessageDialog(null, "禁止下载可执行文件!"); return true; } }


参数6:String requestInitiator - 请求发起者

是什么:告诉你这个请求是谁发起的(哪个域名/页面)。

形象理解

  • 就像查看"这个快递是从哪里寄出的"

  • 可以是一个网站域名

例子


System.out.println("请求发起者: " + requestInitiator); // 输出示例: // "https://www.baidu.com" ← 请求是百度页面发起的 // "https://www.example.com" ← 请求是example网站发起的 // null ← 用户直接在地址栏输入

实际应用


// 防止跨域攻击 if (requestInitiator != null && !requestInitiator.contains("mycompany.com")) { if (url.contains("api.mycompany.com")) { System.out.println("⚠️ 警告:外部网站尝试访问我们的API!"); disableDefaultHandling.set(true); return null; // 阻止 } }


参数7:BoolRef disableDefaultHandling - 禁用默认处理(最关键!)

是什么:一个布尔值的引用,用来告诉浏览器"要不要用默认方式处理这个请求"。

形象理解

  • 这是一个"开关"

  • disableDefaultHandling.set(false) = 开关关闭 = 正常处理

  • disableDefaultHandling.set(true) = 开关打开 = 不要处理,阻止!

为什么要用 BoolRef 而不是 boolean


// 错误写法(不起作用) boolean disable = true; // 这只是局部变量,不会影响浏览器 // 正确写法 disableDefaultHandling.set(true); // 这会真正通知浏览器

实际用途


// 1. 阻止加载某个资源 if (url.contains("ad.jpg")) { System.out.println("🚫 阻止广告"); disableDefaultHandling.set(true); // 阻止! return null; } // 2. 阻止访问某个网站 if (url.contains("blocked-site.com")) { System.out.println("⛔ 阻止访问"); disableDefaultHandling.set(true); // 阻止! return null; } // 3. 正常处理(默认) // 不设置,或者设置为false disableDefaultHandling.set(false); // 正常加载 return null;


综合实战例子


@Override public CefResourceRequestHandler getResourceRequestHandler( CefBrowser browser, CefFrame frame, CefRequest request, boolean isNavigation, boolean isDownload, String requestInitiator, BoolRef disableDefaultHandling) { // 获取基本信息 String url = request.getURL(); String method = request.getMethod(); System.out.println("\n=== 拦截到请求 ==="); System.out.println("URL: " + url); System.out.println("方法: " + method); System.out.println("当前页面: " + browser.getURL()); System.out.println("是否主框架: " + frame.isMain()); System.out.println("是否导航: " + isNavigation); System.out.println("是否下载: " + isDownload); System.out.println("发起者: " + requestInitiator); // 场景1:阻止广告 if (url.contains("ads.") || url.contains("tracker.")) { System.out.println("🚫 阻止广告"); disableDefaultHandling.set(true); return null; } // 场景2:阻止下载可执行文件 if (isDownload && url.endsWith(".exe")) { System.out.println("⛔ 阻止下载exe文件"); disableDefaultHandling.set(true); JOptionPane.showMessageDialog(null, "禁止下载可执行文件!"); return null; } // 场景3:给API请求添加Token if (url.contains("/api/")) { System.out.println("🔧 添加认证Token"); Map<String, String> headers = new HashMap<>(); request.getHeaderMap(headers); headers.put("Authorization", "Bearer my-secret-token"); request.setHeaderMap(headers); } // 场景4:只允许主框架访问某些资源 if (!frame.isMain() && url.contains("secret-api")) { System.out.println("⚠️ iframe不允许访问此API"); disableDefaultHandling.set(true); return null; } // 场景5:防止跨域攻击 if (requestInitiator != null && !requestInitiator.contains("trusted.com") && url.contains("api.trusted.com")) { System.out.println("🛡️ 阻止非信任域名访问API"); disableDefaultHandling.set(true); return null; } // 默认:正常处理 return null; }


3. 自定义协议 myapp://(暂时删除)

为什么删除:需要实现复杂的接口方法,容易报错,对初学者不友好。

替代方案:用其他方式演示拦截功能(见下面)

4. 阻止特定请求(保留 + 增强)


if (url.contains("blocked.jpg")) { log("🚫 阻止加载: " + url); disableDefaultHandling.set(true); // 关键:设置为true阻止加载 return null; }

工作原理

  • disableDefaultHandling.set(true) 告诉浏览器"不要用默认方式加载这个资源"

  • 返回 null 表示也不提供自定义内容

  • 结果:资源加载失败

5. 修改请求头


if (url.contains("baidu.com")) { Map<String, String> headerMap = new HashMap<>(); request.getHeaderMap(headerMap); // 获取现有请求头 headerMap.put("X-Custom-Header", "From-Java-JCEF"); // 添加新请求头 headerMap.put("X-My-Token", "my-secret-token-12345"); request.setHeaderMap(headerMap); // 设置回去 log("🔧 添加自定义请求头"); }

实际用途

  • 添加身份验证Token

  • 添加追踪ID

  • 伪装User-Agent

  • 添加API密钥

6. onBeforeBrowse() - 阻止页面导航


@Override public boolean onBeforeBrowse(CefBrowser browser, CefFrame frame, CefRequest request, boolean userGesture, boolean isRedirect) { String url = request.getURL(); if (url.contains("example.com")) { log("⛔ 阻止访问网站: " + url); // 弹出提示框 SwingUtilities.invokeLater(() -> { JOptionPane.showMessageDialog(null, "该网站已被阻止访问!\n" + url); }); return true; // true = 阻止导航 } return false; // false = 允许导航 }

区别理解

方法

拦截的是什么

返回值含义

getResourceRequestHandler()

资源请求(图片、CSS、JS等)

返回处理器或null

onBeforeBrowse()

页面导航(点击链接、地址栏输入)

true=阻止,false=允许

形象比喻

  • getResourceRequestHandler() = 海关检查每个包裹

  • onBeforeBrowse() = 边境检查站拦截车辆

4️⃣ 运行和测试

测试1:图片拦截

操作:页面加载后,看到"❌ 图片被Java阻止加载"

日志显示


[17:30:15] 📡 [GET] file:///C:/Users/.../request_test.html [17:30:15] 📡 [GET] file:///C:/Users/.../blocked.jpg [17:30:15] 🚫 阻止加载: file:///C:/Users/.../blocked.jpg

发生了什么

  1. 浏览器尝试加载 blocked.jpg

  2. Java拦截到这个请求

  3. 检测到URL包含 "blocked.jpg"

  4. 设置 disableDefaultHandling.set(true)

  5. 图片加载失败,显示错误文本

测试2:网站拦截

操作:点击"访问 example.com(会被阻止)"

看到的效果

  1. 页面显示"正在尝试访问..."

  2. 弹出警告框:"该网站已被阻止访问!"

  3. 页面不会跳转

日志显示


[17:30:20] ⛔ 阻止访问网站: https://www.example.com

发生了什么

  1. JavaScript 执行 window.location.href = 'https://www.example.com'

  2. Java 的 onBeforeBrowse() 被调用

  3. 检测到URL包含 "example.com"

  4. 返回 true 阻止导航

  5. 同时弹出提示框

测试3:请求头修改

操作:点击"访问百度(查看日志)"

日志显示


[17:30:25] ✅ 允许导航: https://www.baidu.com [17:30:25] 📡 [GET] https://www.baidu.com/ [17:30:25] 🔧 添加自定义请求头 [17:30:25] 📡 [GET] https://www.baidu.com/img/logo.png [17:30:25] 🔧 添加自定义请求头

发生了什么

  1. 允许导航到百度

  2. 浏览器开始加载百度的HTML

  3. Java拦截到请求,检测URL包含 "baidu.com"

  4. 添加自定义请求头:

    1. X-Custom-Header: From-Java-JCEF

    2. X-My-Token: my-secret-token-12345

  5. 浏览器用修改后的请求头发送请求

  6. 百度服务器收到这些额外的请求头

如何验证请求头真的被添加了

你可以用浏览器开发者工具(F12)查看网络请求,但更简单的方法是看日志中的 🔧 添加自定义请求头

测试4:API请求

操作:点击"发送API请求"

日志显示


[17:30:30] 📡 [GET] https://api.example.com/data [17:30:30] 🔧 添加自定义请求头

发生了什么

  1. JavaScript 发送 fetch 请求

  2. Java拦截到,检测URL包含 "api"

  3. 添加请求头(可能包含Token)

  4. 请求失败(因为是演示URL),但请求头已经被添加

实际应用场景

📊 场景1:企业内网应用


// 只允许访问公司域名 if (!url.contains("company.com")) { return true; // 阻止访问外部网站 }

🔐 场景2:统一身份认证


// 所有API请求自动添加Token if (url.contains("/api/")) { headerMap.put("Authorization", "Bearer " + getToken()); }

📱 场景3:广告拦截器


// 阻止广告域名 if (url.contains("ads.") || url.contains("tracker.")) { disableDefaultHandling.set(true); return null; }

🎓 场景4:家长控制


// 阻止不适合儿童的网站 if (isBlockedForKids(url)) { JOptionPane.showMessageDialog(null, "该网站不适合儿童访问!"); return true; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别晃我的可乐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值