2010-05-15 37 views

Respuesta

20

Para facilitar estados de sesión de múltiples pestañas para un usuario sin saturar la URL, haga lo siguiente.

En su función de carga del formulario, incluyen:

If Not IsPostback Then 
    'Generate a new PageiD' 
    ViewState("_PageID") = (New Random()).Next().ToString() 
End If 

Al guardar algo a su estado de sesión, incluyen la PageID:

Session(ViewState("_PageID").ToString() & "CheckBoxes") = D 

Notas:

  • Como con las ID de sesión en general, no puede confiar en que los espectadores malintencionados no cambien el ID de sesión/ID de página. Esta es solo una solución válida para un entorno donde se puede confiar en todos los usuarios. Afortunadamente, ViewState ofrece más protección que el uso de un campo de entrada oculto.
  • No tendrá acceso a PageID hasta que se restablezca ViewState en PostBack. Por lo tanto, no tendrá acceso a PageID en el controlador page_init().
+1

Para desarrolladores que utilizan formularios web ASP.NET, puede obtener un grado de protección de usuarios malintencionados que alteran el ID de página utilizando ViewState en lugar de un campo oculto HTML nativo. De forma predeterminada, ViewState es hash con la clave del equipo del servidor y ASP.NET arroja una excepción si los datos publicados no son un hash válido. Si la ID de sesión se manipula, esto normalmente provocaría que se creara una nueva sesión cuando se escriban los siguientes datos, ya que la sesión existente no sería válida: los intentos de recuperar datos existentes darían como resultado excepciones de referencia nula. Podría verificar esto o la propiedad IsNewSession. – pwdst

+0

@pwdst ¡Excelente punto, ajustaré la solución para que coincida! Gracias –

+2

Esta es una excelente solución a una pregunta con la que tuve que lidiar esta semana para la integridad de datos en el trabajo. Los usuarios estaban abriendo las segundas pestañas y luego volviendo a actualizar el registro que se guardaba en la primera pestaña, con los datos de la sesión del curso asociados con el segundo registro. Utilicé una variante de esta solución para evitar actualizaciones incorrectas en el registro incorrecto. – pwdst

14
<configuration> 
    <system.web> 
    <sessionState cookieless="true" 
     regenerateExpiredSessionId="true" /> 
    </system.web> 
</configuration> 

http://msdn.microsoft.com/en-us/library/ms178581.aspx

en este caso cada pestaña obtener ID única y lo hará parece que es otro visitante.

+0

sin cookies = "true" que realmente se necesita? – ErTR

+0

@ Ertürk Öztürk: la pregunta suena "Me gustaría mantener un estado de sesión por pestaña del navegador". Todas las instancias del navegador comparten las mismas cookies. – zerkms

+0

@zerkms Estoy de acuerdo con las cookies pero necesito configurarlas dinámicamente en la carga de la página. Desafortunadamente es de solo lectura. – ErTR

0

Usando la respuesta de Brian Webster Encontré un problema con XMLHttpRequests. Resultó que XMLHttpRequests no estableció el indicador IsPostback en verdadero y, por lo tanto, la solicitud parecía una nueva solicitud y uno terminaría teniendo un nuevo estado de sesión para esa solicitud. Para resolver ese problema también he comprobado el valor de la ViewState("_PageID")

para que mi código es el siguiente en C#:

protected dynamic sessionVar; //a copy of the session variable 

protected void Page_Load(object sender, EventArgs e) 
{ 
    if (!IsPostBack && ViewState["_PageID"] == null) 
    { 
     ViewState["_PageID"] = (new Random()).Next().ToString(); 
     Session[ViewState["_PageID"] + "sessionVar"] = initSessionVar(); //this function should initialize the session variable 
    } 
    sessionVar = Session[ViewState["_PageID"] + "sessionVar"]; 
    //... 
} 
Cuestiones relacionadas