V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
elinktek
V2EX  ›  程序员

请教一个同源策略的问题

  •  
  •   elinktek · 6 小时 38 分钟前 · 287 次点击

    需要 android 程序自动注入 js 表单信息,用户名密码,然后提交 网址是: https://aa.bb.buzz/test 实际网页的源码是 https://aa.bb.buzz/test/frame.html 我写的是 webView.loadUrl("https://aa.bb.buzz/test/frame.html"); 现在要求必须写成 webView.loadUrl("https://aa.bb.buzz/test");我查了 AI 说不能直接操作这个网址

    AI 的解释: 为什么会失败? 同源策略 (Same-Origin Policy):

    一个网页的“源”由协议、域名和端口号共同决定。

    父页面 URL: https://aaa.buzz/test/,其源是 https://aaa.buzz

    iframe URL: https://test01.aaa.buzz/test/frame.html ,其源是 https://test01.aaa.buzz

    尽管这两个域名都属于 aaa.buzz ,但 test01.aaa.buzz 是一个不同的子域名,因此根据同源策略,它们被视为不同的源。

    出于安全考虑,浏览器严格禁止一个源的脚本(例如注入到父页面的 JavaScript )访问另一个源的 DOM 内容(例如 iframe 里的表单元素)。这正是您日志中显示的 SecurityError 错误的原因。

    shouldOverrideUrlLoading 的局限性:

    您尝试使用 shouldOverrideUrlLoading 方法来拦截 iframe 的加载,但这通常只适用于主页面的导航事件(如用户点击链接或重定向)。WebView 加载 <iframe> 内部内容的行为,通常不会触发这个回调。因此,您的代码无法在 iframe 加载时进行拦截并跳转。

    目前写的关键代码:

    public class MainActivity extends AppCompatActivity {
    
        private WebView webView;
        private static final String TAG = "WebViewApp";
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            webView = findViewById(R.id.webView);
    
            // 启用 JavaScript
            webView.getSettings().setJavaScriptEnabled(true);
    
            // 绑定 JavaScript 接口
            webView.addJavascriptInterface(new WebAppInterface(this), "Android");
    
            // 设置 WebViewClient ,监听页面加载完成
            webView.setWebViewClient(new MyWebViewClient());
    
            // 直接加载包含表单的 URL
            webView.loadUrl("https://test01.aaa.buzz/test/frame.html");
        }
    
        private class MyWebViewClient extends WebViewClient {
            @Override
            public void onPageFinished(WebView view, String url) {
                super.onPageFinished(view, url);
                Log.d(TAG, "Page finished loading: " + url);
    
                // 注入一个健壮的 JavaScript 代码,使用更通用的方法查找元素,并将代码压缩为单行
                String js = "(function() { function waitForElementsAndSubmit() { var inputs = document.getElementsByTagName('input'); var buttons = document.getElementsByTagName('button'); var usernameInput = null; var emailInput = null; var submitButton = null; var inputCount = 0; for (var i = 0; i < inputs.length; i++) { if (inputs[i].type === 'text') { if (!usernameInput) { usernameInput = inputs[i]; } else { emailInput = inputs[i]; break; } } } for (var i = 0; i < buttons.length; i++) { if (buttons[i].type === 'submit' || buttons[i].id === 'submit') { submitButton = buttons[i]; break; } } if (usernameInput && emailInput && submitButton) { console.log('找到所有元素,开始填写和提交。'); usernameInput.value = 'test'; emailInput.value = '[email protected]'; var form = submitButton.closest('form'); if (form) { form.submit(); } else { submitButton.click(); } setTimeout(function() { Android.showToast('表单已自动提交。'); }, 1000); } else { console.log('未找到元素,继续等待...'); setTimeout(waitForElementsAndSubmit, 200); } } waitForElementsAndSubmit(); })();";
    
                view.evaluateJavascript(js, null);
            }
        }
    
        @Override
        public void onBackPressed() {
            if (webView.canGoBack()) {
                webView.goBack();
            } else {
                super.onBackPressed();
            }
        }
    }
    

    求大神指点,谢谢

    5 条回复    2025-09-01 19:42:31 +08:00
    shadowyue
        1
    shadowyue  
       6 小时 29 分钟前
    没看懂,怎么突然冒出来个 test01
    okakuyang
        2
    okakuyang  
       6 小时 17 分钟前
    AI 的回答看不出与你的问题有啥联系。 不过因为同源问题拿不到 iframe 的内容可以理解
    rabbbit
        3
    rabbbit  
       6 小时 11 分钟前
    没懂,不过 iframe 交互可以试试 postMessage
    chenluo0429
        4
    chenluo0429  
       6 小时 10 分钟前 via Android
    从你的代码里面没看到 iframe 啊,网页就是在 webview 中加载的,哪来的同源
    elinktek
        5
    elinktek  
    OP
       5 小时 4 分钟前
    页面的源碼是這個
    ```HTML

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Home Page</title>
    </head>
    <body>
    <iframe name="test_frame" title="这是一个用于测试的内嵌页面" src="https://test01.aaa.buzz/test/frame.html" frameborder="0" style="width: 100%; height: 100%;"></iframe>
    </body>
    </html>

    ```
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1450 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 16:46 · PVG 00:46 · LAX 09:46 · JFK 12:46
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.