如何将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,再根据用户角色跳转到对应页面。
步骤如下:
- 后台修改:移除服务器端的
funciones.RedirigiraUsuario(Me)调用,改为注册包含重定向逻辑的客户端脚本 - 确保用户角色(
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

