ie错误:拒绝访问 代码0

本文探讨了在使用Internet Explorer浏览器时遇到的AJAX跨域问题,并提供了具体的解决办法。通过调整IE的安全设置,可以有效解决因相对路径提交不正确导致的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

为了防止相对路径提交不正确 我给ajax提交都设置了 绝对路径 代码大约是

 

 

//服务器地址 
var webroot = "http://192.168.1.123:8080/TPCCalendar/";

//web.xml配置的servlet
var service_pattern = "Events_Service";

 

 

这是我的局域网ip地址

 

我自己测试时为localhost:8080....

 

而是用Firefox和Chrome就没有此问题

 

后来发现在我机器上输入192.168.1.123:8080就不会有问题...

 

 

总结原因为

 

ie的安全级别过高

 

工具--internet选项--安全--自定义级别--其它--通过域访问数据源

 

设置一下就好了

<think>我们遇到了自动化错误错误代码-2147352319),这通常是由于COM对象问题或IE实例未就绪导致的。以下是针对性的解决方案: ### 错误分析 错误代码 `-2147352319` 对应 `0x80020101`,表示: 1. **对象未就绪**:尝试访问IE文档时,页面尚未完全加载 2. **COM对象失效**:IE实例被意外关闭或回收 3. **权限问题**:安全设置阻止了自动化操作 ### 完整修复代码 ```vba Option Explicit ' 主抓取过程 - 增强稳定性版本 Private Sub CommandButton1_Click() On Error GoTo ErrorHandler ' 禁用Excel功能提升性能 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Dim objIEApp As Object Dim objIEDoc As Object Dim objSheet As Worksheet Dim objBuglist As Worksheet Set objSheet = Sheets("Bugzilla") Set objBuglist = Sheets("account") ' 安全清除目标工作表旧数据 objSheet.Cells.ClearContents ' 创建IE实例(使用早期绑定需添加引用:Microsoft Internet Controls) Set objIEApp = New InternetExplorer ' 早期绑定方式,更稳定 ' 若使用晚期绑定:Set objIEApp = CreateObject("InternetExplorer.Application") With objIEApp .Visible = True ' 调试时可见 ' === 关键改进1:设置超时时间 === .Silent = True ' 禁止弹出脚本错误 .Navigate "about:blank" ' 先导航到空白页避免状态问题 WaitForIE objIEApp, 5 ' 等待5秒 ' 登录处理 .Navigate "https://logincas.tp-link.com:8443/login?service=http://bugzilla.tp-link.com/" If Not WaitForIE(objIEApp, 30) Then MsgBox "登录页面加载超时", vbExclamation GoTo CleanExit End If ' === 关键改进2:安全获取文档对象 === Set objIEDoc = .Document If objIEDoc Is Nothing Then MsgBox "无法获取登录页面文档", vbCritical GoTo CleanExit End If ' 登录表单处理 Dim loginForm As Object On Error Resume Next Set loginForm = objIEDoc.forms(0) On Error GoTo ErrorHandler If Not loginForm Is Nothing Then ' === 关键改进3:添加元素存在检查 === SetElementValue objIEDoc, "username", objBuglist.Range("A3").Value SetElementValue objIEDoc, "password", objBuglist.Range("B3").Value ' 提交表单 loginForm.submit ' 等待登录完成 If Not WaitForIE(objIEApp, 30) Then MsgBox "登录过程超时", vbExclamation GoTo CleanExit End If Else MsgBox "未找到登录表单", vbExclamation GoTo CleanExit End If ' 导航到目标页面 .Navigate objBuglist.Range("B1").Value If Not WaitForIE(objIEApp, 60) Then ' 允许更长超时时间 MsgBox "目标页面加载超时", vbExclamation GoTo CleanExit End If ' 更新文档对象引用 Set objIEDoc = .Document ' 表格处理 Dim tableFound As Boolean tableFound = ProcessBuglistTable(objIEDoc, objSheet) If Not tableFound Then ' 保存HTML用于调试 SaveHTMLForDebugging objIEDoc, "C:\Temp\bugzilla_debug.html" MsgBox "未找到表格元素,已保存页面HTML到C:\Temp\bugzilla_debug.html", vbExclamation Else MsgBox "成功获取表格数据!", vbInformation End If End With CleanExit: ' 清理资源 On Error Resume Next If Not objIEApp Is Nothing Then objIEApp.Quit Set objIEApp = Nothing End If ' 恢复Excel设置 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Application.StatusBar = False Exit Sub ErrorHandler: Dim errMsg As String errMsg = "错误 " & Err.Number & ": " & Err.Description & vbCrLf & _ "发生在: " & GetErrorLocation() MsgBox errMsg, vbCritical, "自动化错误" Resume CleanExit End Sub ' === 关键辅助函数 === ' 安全设置元素值 Private Sub SetElementValue(doc As Object, elementId As String, value As String) On Error Resume Next Dim elem As Object Set elem = doc.getElementById(elementId) If Not elem Is Nothing Then elem.Value = value Else ' 尝试通过name查找 Set elem = doc.getElementsByName(elementId)(0) If Not elem Is Nothing Then elem.Value = value End If End Sub ' 增强的等待函数(带超时) Private Function WaitForIE(ie As Object, timeoutSeconds As Integer) As Boolean Dim startTime As Double startTime = Timer Do While ie.Busy Or ie.readyState <> 4 DoEvents If Timer - startTime > timeoutSeconds Then WaitForIE = False Exit Function End If Loop ' 额外等待0.5秒确保完全加载 Dim extraWait As Double extraWait = Timer + 0.5 Do While Timer < extraWait DoEvents Loop WaitForIE = True End Function ' 获取错误位置 Private Function GetErrorLocation() As String Dim stk As String stk = "第" & Erl & "行" If Len(stk) = 0 Then stk = "未知位置" GetErrorLocation = stk End Function ' 表格处理函数(同上,略) ``` ### 解决方案核心: 1. **增强等待机制**: ```vba ' 带超时的等待函数 Private Function WaitForIE(ie As Object, timeoutSeconds As Integer) As Boolean Dim startTime As Double startTime = Timer Do While ie.Busy Or ie.readyState <> 4 DoEvents If Timer - startTime > timeoutSeconds Then WaitForIE = False Exit Function End If Loop ' 额外等待0.5秒 Dim extraWait As Double extraWait = Timer + 0.5 Do While Timer < extraWait DoEvents Loop WaitForIE = True End Function ``` 2. **安全元素操作**: ```vba ' 通用元素设置函数 Private Sub SetElementValue(doc As Object, elementId As String, value As String) On Error Resume Next Dim elem As Object Set elem = doc.getElementById(elementId) If Not elem Is Nothing Then elem.Value = value Else Set elem = doc.getElementsByName(elementId)(0) If Not elem Is Nothing Then elem.Value = value End If End Sub ``` 3. **错误位置追踪**: ```vba ' 在可能出错的行号处添加行标记 10: Set objIEApp = New InternetExplorer 20: objIEApp.Visible = True ' ... ' 获取错误位置 Private Function GetErrorLocation() As String Dim stk As String stk = "第" & Erl & "行" ' Erl获取最后执行的错误行号 If Len(stk) = 0 Then stk = "未知位置" GetErrorLocation = stk End Function ``` 4. **早期绑定优化**: - 添加VBA引用:`Microsoft Internet Controls` - 使用`Dim objIEApp As InternetExplorer`声明 - 避免晚期绑定的性能问题 ### 部署步骤: 1. **添加VBA引用**: - 打开VBA编辑器 → 工具 → 引用 - 勾选 `Microsoft Internet Controls` 和 `Microsoft HTML Object Library` 2. **错误行号标记**: - 在关键代码行前添加行号(如:10:、20:) 3. **创建临时目录**: - 手动创建 `C:\Temp\` 目录或修改保存路径 4. **权限检查**: - 确保Excel有权限访问IE和文件系统 ### 常见错误处理: | 错误代码 | 原因 | 解决方案 | |----------------|-----------------------|------------------------------| | -2147352319 | IE未就绪 | 增加等待时间,使用`WaitForIE`| | 462 | 远程服务器不存在 | 检查IE实例是否被意外关闭 | | 91 | 对象变量未设置 | 添加对象存在检查 | | 70 | 权限被拒绝 | 以管理员身份运行Excel | §§相关问题§§ 1. 如何为VBA项目添加对Internet Explorer的类型库引用? 2. 在自动化操作中,如何检测并处理网页上的JavaScript弹窗? 3. 当网站需要双重认证时,VBA脚本如何实现自动登录? 4. 如何通过VBA监控IE浏览器的网络请求和响应? 5. 在网页加载过程中,如何区分"Busy"和"readyState"两种状态?</think>### 解决自动化错误 (-2147352319) 的完整方案 这个错误通常是由 Internet Explorer 自动化问题引起的,以下是完全重写的稳定解决方案: ```vba ' 增强稳定性的主抓取过程 Private Sub CommandButton1_Click() On Error GoTo ErrorHandler ' 禁用Excel功能提升稳定性 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Dim objIEApp As Object Dim objIEDoc As Object Dim objSheet As Worksheet Dim objBuglist As Worksheet Set objSheet = Sheets("Bugzilla") Set objBuglist = Sheets("account") ' === 关键改进1:使用更稳定的IE创建方式 === Set objIEApp = GetStableIEInstance() If objIEApp Is Nothing Then MsgBox "无法创建Internet Explorer实例", vbCritical GoTo CleanExit End If With objIEApp .Visible = True ' 调试时可见 ' === 关键改进2:增强页面加载等待 === .Navigate "https://logincas.tp-link.com:8443/login?service=http://bugzilla.tp-link.com/" If Not WaitForCompleteLoad(objIEApp, "登录页面", 30) Then MsgBox "登录页面加载超时", vbExclamation GoTo CleanExit End If ' 安全获取文档对象 Set objIEDoc = .Document If objIEDoc Is Nothing Then MsgBox "无法获取登录页面文档", vbCritical GoTo CleanExit End If ' === 关键改进3:安全元素访问 === SetElementValue objIEDoc, "username", objBuglist.Range("A3").Value SetElementValue objIEDoc, "password", objBuglist.Range("B3").Value ' 提交表单 Dim loginForm As Object Set loginForm = objIEDoc.forms(0) If Not loginForm Is Nothing Then loginForm.submit Else MsgBox "未找到登录表单", vbExclamation GoTo CleanExit End If ' 等待登录完成 If Not WaitForCompleteLoad(objIEApp, "登录后页面", 30) Then MsgBox "登录过程超时", vbExclamation GoTo CleanExit End If ' 导航到目标页面 .Navigate objBuglist.Range("B1").Value If Not WaitForCompleteLoad(objIEApp, "目标页面", 60) Then MsgBox "目标页面加载超时", vbExclamation GoTo CleanExit End If ' 更新文档对象引用 Set objIEDoc = .Document ' 表格处理 Dim tableFound As Boolean tableFound = ProcessBuglistTable(objIEDoc, objSheet) If Not tableFound Then ' 保存HTML用于调试 SaveHTMLForDebugging objIEDoc, "C:\Temp\bugzilla_debug.html" MsgBox "未找到表格元素,已保存页面HTML到C:\Temp\bugzilla_debug.html", vbExclamation Else MsgBox "成功获取表格数据!", vbInformation End If End With CleanExit: ' 安全清理资源 SafeCleanup objIEApp ' 恢复Excel设置 Application.ScreenUpdating = True Application.Calculation = xlCalculationAutomatic Application.EnableEvents = True Application.StatusBar = False Exit Sub ErrorHandler: HandleAutomationError Err.Number, Err.Description Resume CleanExit End Sub ' === 关键增强函数 === ' 获取稳定的IE实例 Private Function GetStableIEInstance() As Object On Error Resume Next Dim ieApp As Object ' 尝试连接到现有IE实例 Set ieApp = GetObject("InternetExplorer.Application") If ieApp Is Nothing Then ' 创建新实例 Set ieApp = CreateObject("InternetExplorer.Application") End If ' 配置IE设置 If Not ieApp Is Nothing Then With ieApp .Silent = True ' 禁止脚本错误提示 .Visible = True .Navigate "about:blank" ' 初始化实例 Do While .Busy Or .readyState <> 4 DoEvents Loop End With End If Set GetStableIEInstance = ieApp End Function ' 增强的页面加载等待 Private Function WaitForCompleteLoad(ie As Object, pageName As String, timeoutSeconds As Integer) As Boolean Dim startTime As Double startTime = Timer Do While ie.Busy Or ie.readyState <> 4 DoEvents If Timer - startTime > timeoutSeconds Then ' 记录超时日志 Debug.Print "[" & pageName & "] 加载超时 (" & timeoutSeconds & "秒)" WaitForCompleteLoad = False Exit Function End If Loop ' 额外等待确保完全加载 Dim extraWait As Double extraWait = Timer + 1 ' 额外等待1秒 Do While Timer < extraWait DoEvents Loop WaitForCompleteLoad = True End Function ' 安全设置元素值 Private Sub SetElementValue(doc As Object, elementName As String, value As String) On Error Resume Next Dim element As Object ' 尝试多种方式获取元素 Set element = doc.getElementById(elementName) If element Is Nothing Then Set element = doc.getElementsByName(elementName)(0) If element Is Nothing Then Set element = doc.querySelector("[name='" & elementName & "']") If Not element Is Nothing Then element.Value = value Else Debug.Print "未找到元素: " & elementName End If End Sub ' 安全清理资源 Private Sub SafeCleanup(ieApp As Object) On Error Resume Next If Not ieApp Is Nothing Then If Not ieApp.Document Is Nothing Then ' 安全关闭 ieApp.Quit End If Set ieApp = Nothing End If End Sub ' 错误处理程序 Private Sub HandleAutomationError(errNumber As Long, errDescription As String) Dim errMsg As String Select Case errNumber Case -2147352319 ' 自动化错误 errMsg = "IE自动化错误 (0x80020101):" & vbCrLf & _ "可能原因:" & vbCrLf & _ "1. IE安全设置阻止自动化" & vbCrLf & _ "2. 页面未完全加载" & vbCrLf & _ "3. 对象已被释放" Case 462 ' 远程服务器不存在或不可用 errMsg = "远程服务器错误 (462):" & vbCrLf & _ "IE实例可能已关闭" Case Else errMsg = "错误 " & errNumber & ": " & errDescription End Select ' 添加解决方案提示 errMsg = errMsg & vbCrLf & vbCrLf & "解决方案:" & vbCrLf & _ "1. 检查IE安全设置" & vbCrLf & _ "2. 增加页面加载等待时间" & vbCrLf & _ "3. 以管理员身份运行Excel" MsgBox errMsg, vbCritical, "自动化错误" End Sub ' 表格处理函数(与之前相同) Private Function ProcessBuglistTable(doc As Object, targetSheet As Worksheet) As Boolean ' ... 保持之前实现的表格处理逻辑 ... End Function ``` ### 错误原因分析 错误代码 `-2147352319` (十六进制 `0x80020101`) 通常由以下原因引起: 1. **IE安全设置问题**: - Internet Explorer 阻止了自动化操作 - 安全区域设置限制了脚本访问 2. **对象状态问题**: - 尝试访问尚未完全加载的页面元素 - IE实例已被关闭或释放 3. **权限问题**: - Excel未以管理员权限运行 - 组策略限制了自动化操作 4. **同步问题**: - 代码执行速度超过页面加载速度 - DOM元素在访问前已被修改 ### 关键解决方案 1. **增强IE实例管理**: ```vba ' 重用现有IE实例 Set ieApp = GetObject("InternetExplorer.Application") If ieApp Is Nothing Then Set ieApp = CreateObject("InternetExplorer.Application") End If ``` 2. **安全元素访问**: ```vba ' 使用安全元素访问方法 SetElementValue objIEDoc, "username", objBuglist.Range("A3").Value Private Sub SetElementValue(doc As Object, elementName As String, value As String) On Error Resume Next ' 忽略错误继续执行 ' 多种方式查找元素 Set element = doc.getElementById(elementName) If element Is Nothing Then Set element = doc.getElementsByName(elementName)(0) If Not element Is Nothing Then element.Value = value End Sub ``` 3. **强化页面加载等待**: ```vba ' 带超时的等待函数 Private Function WaitForCompleteLoad(ie As Object, pageName As String, timeoutSeconds As Integer) As Boolean Dim startTime As Double startTime = Timer Do While ie.Busy Or ie.readyState <> 4 DoEvents If Timer - startTime > timeoutSeconds Then WaitForCompleteLoad = False Exit Function End If Loop ' 额外等待1秒确保完全加载 Dim extraWait As Double extraWait = Timer + 1 Do While Timer < extraWait DoEvents Loop WaitForCompleteLoad = True End Function ``` 4. **专业错误处理**: ```vba ' 专用自动化错误处理 Private Sub HandleAutomationError(errNumber As Long, errDescription As String) Select Case errNumber Case -2147352319: errMsg = "IE自动化错误 (0x80020101): 安全设置或对象状态问题" Case 462: errMsg = "远程服务器错误: IE实例可能已关闭" Case Else errMsg = "未知错误: " & errNumber End Select MsgBox errMsg, vbCritical End Sub ``` ### 配置步骤 1. **IE安全设置调整**: - 打开Internet选项 → 安全 → 本地Intranet → 站点 - 添加 `http://bugzilla.tp-link.com` 到受信任站点 - 安全级别设置为"低"或自定义级别中启用"对未标记为安全的ActiveX控件进行初始化和脚本运行" 2. **Excel权限设置**: - 右键点击Excel快捷方式 → 以管理员身份运行 - 文件 → 选项 → 信任中心 → 宏设置 → 启用所有宏 3. **VBA引用设置**: - 在VBA编辑器中:工具 → 引用 - 确保勾选: - Microsoft Internet Controls - Microsoft HTML Object Library - Microsoft XML v6.0 4. **调试模式**: ```vba ' 在代码开头添加 Const DEBUG_MODE = True ' 在IE实例创建后 If DEBUG_MODE Then objIEApp.Visible = True Else objIEApp.Visible = False End If ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值