You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将VB变量传递至JavaScript?页面跳转致函数未执行问题

问题根源

你遇到的核心问题是**Response.Redirect会直接终止当前页面的处理流程**——当你在后台调用funciones.RedirigiraUsuario(Me)时,服务器会立刻向客户端发送跳转指令(HTTP 302),客户端收到后会马上跳转到目标页面,根本没机会执行你之前注册的getHiddenValue()脚本。这就是为什么注释掉重定向函数后脚本能正常工作的原因。

解决方案

根据你的需求,有两种靠谱的解决思路,你可以根据场景选择:


方案1:在跳转后的页面处理Token存储(最简洁安全)

既然Session("TOKEN")已经在服务器端保存了,完全可以在跳转后的目标页面(比如Default.aspx、MAN_JefeEspecialidad.aspx等)的后台代码中取出Token,再注册脚本将其存入客户端存储。这样既避免了重定向中断脚本的问题,也不用改动原页面的重定向逻辑。

示例(以Default.aspx为例):

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    If Not IsPostBack Then
        ' 从Session中取出Token
        If Session("TOKEN") IsNot Nothing Then
            Dim token As String = Session("TOKEN").ToString()
            ' 注册脚本将Token存入localStorage和sessionStorage,同时做XSS防护
            ScriptManager.RegisterStartupScript(Me, Me.GetType(), "SaveToken", 
                $"localStorage.setItem('PabToken', '{HttpUtility.JavaScriptStringEncode(token)}'); " &
                $"sessionStorage.setItem('PabToken', '{HttpUtility.JavaScriptStringEncode(token)}');", 
                True)
        End If
    End If
End Sub

注意:用HttpUtility.JavaScriptStringEncode对Token进行转义,避免XSS注入风险。


方案2:先执行客户端脚本,再做客户端重定向(适合必须在原页面存Token的场景)

如果一定要在原页面完成Token存储再跳转,可以把服务器端的重定向逻辑移到客户端脚本中:先执行getHiddenValue()存Token,再根据用户角色跳转到对应页面。

步骤如下:

  1. 后台修改:移除服务器端的funciones.RedirigiraUsuario(Me)调用,改为注册包含重定向逻辑的客户端脚本
  2. 确保用户角色(PERFIL)被安全地传递到客户端

示例后台代码修改:

If Not sJson = Nothing Then
    Dim json As Dictionary(Of String, String) = JsonConvert.DeserializeObject(Of Dictionary(Of String, String))(sJson)
    Session("TOKEN") = "Bearer " + json("access_token")
    inputToken.Value = "Bearer " + json("access_token")

    ' 获取并转义用户角色,避免XSS
    Dim perfil As String = Session("PERFIL").ToString()
    Dim perfilEncoded As String = HttpUtility.JavaScriptStringEncode(perfil)

    ' 定义角色与跳转地址的映射(和原RedirigiraUsuario逻辑一致)
    Dim redirectMap As New Dictionary(Of String, String) From {
        {"1", "~/Default.aspx"},
        {"2", "~/Default.aspx"},
        {"3", "~/Default.aspx"},
        {"4", "~/Default.aspx"},
        {"5", "~/Default.aspx"},
        {"N", "~/Default.aspx"},
        {"6", "~/FormMantenedor/MAN_JefeEspecialidad.aspx"},
        {"7", "~/BUS_General.aspx"},
        {"8", "~/FormPabellon/GST_Detalle_Post_Anestesia.aspx"},
        {"9", "~/FormTabla/ING_Tabla.aspx"},
        {"10", "~/FormPreTabla/GST_Pre_Tabla.aspx"},
        {"11", "~/FormPreTabla/GST_Pre_Tabla.aspx"},
        {"12", "~/FormPreTabla/GST_Pre_Tabla.aspx"},
        {"15", "~/FormPreTabla/GST_Pre_Tabla.aspx"},
        {"14", "~/GST_Camas.aspx"},
        {"13", "~/FormPabellon/REP_Pabellon.aspx"}
    }

    ' 将映射序列化为JSON,传递到客户端
    Dim redirectMapJson As String = JsonConvert.SerializeObject(redirectMap)

    ' 注册脚本:先存Token,再根据角色跳转
    Dim startupScript As String = $"
        getHiddenValue();
        var redirectMap = {redirectMapJson};
        var targetUrl = redirectMap['{perfilEncoded}'];
        if (targetUrl) {{
            window.location.href = targetUrl;
        }}
    "
    ScriptManager.RegisterStartupScript(Me, Me.GetType(), "SaveTokenAndRedirect", startupScript, True)
End If

' 注释掉原来的重定向调用:funciones.RedirigiraUsuario(Me)

这样客户端会先执行getHiddenValue()完成Token存储,再根据角色跳转到目标页面,完全不会被服务器端的重定向中断。


为什么不推荐URL传递Token?

虽然可以把Token作为URL参数传递到跳转后的页面,但Token是敏感的身份凭证,URL参数会被记录在浏览器历史、服务器日志中,存在安全风险,所以强烈不建议这么做。

内容的提问来源于stack exchange,提问作者David081

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 17:20:19