none
Como evitar que mi aplicación se habrá 2 veces RRS feed

  • Pregunta

  • Estoy trabajando en un proyecto el cual consiste de un login y una pagina donde "muestra" las variables de sesión (ya que están ocultas para el usuario) lo que quiero conseguir es que la pestaña Mostrar.aspx al estar activa y yo habrá una pestaña con el mismo nombre me arroje un mensaje de que esta activa la pestaña.

    adjunto codigo de ejemplo:

    Login.aspx:

     protected void ButtonLogin_Click(object sender, EventArgs e)
        {

         
            string s= System.Configuration.ConfigurationManager.ConnectionStrings["AppComintecConnectionString"].ConnectionString;
            SqlConnection conexion = new SqlConnection(s);


            conexion.Open();
            string query = "SELECT * FROM Usuarios where usuario = @username and contrasena = @password";
            SqlCommand cm = new SqlCommand(query, conexion);
            cm.Parameters.AddWithValue("@username", TextBox1.Text);
            cm.Parameters.AddWithValue("@password", TextBox2.Text);


            //Si existe un usuario con los datos retorna true, caso contrario false
            var reader = cm.ExecuteReader();

            if (reader.Read())
            {
                //Si existe, Bienvenido...

                Session["nombre"] = reader["nombre"].ToString();
                Session["id_usr"] = reader["id_usr"].ToString();
                Session["area"] = reader["area"].ToString();
                Session["tipo"] = reader["tipo"].ToString();
                Session["permiso"] = reader["permiso"].ToString();
                Session["mail"] = reader["mail"].ToString();
                Session["puesto"] = reader["puesto"].ToString();
                Session["sede"] = reader["sede"].ToString();
                Response.Redirect("Mostrar.aspx");
            }
            else
            {
                LabelError.Visible = true;
                LabelError.Text = "usuario o contraseña invalido !!";
                LabelError.Attributes.Add("class", "alert alert-danger");
            }


            conexion.Close();
        }

    Mostrar.aspx

    protected void Page_Load(object sender, EventArgs e)
        {
            if (Session["nombre"] == null || Session["id_usr"] == null || Session["area"] == null || Session["tipo"] == null || Session["permiso"] == null || Session["mail"] == null || Session["puesto"] == null || Session["sede"] == null)
            {
                Response.Redirect("Login.aspx");
            }
            else
            {
                resultado1Label.Text = Convert.ToString(Session["nombre"]);
                resultado2Label.Text = Convert.ToString(Session["id_usr"]);
                resultado3Label.Text = Convert.ToString(Session["area"]);
                resultado4Label.Text = Convert.ToString(Session["tipo"]);
                resultado5Label.Text = Convert.ToString(Session["permiso"]);
                resultado6Label.Text = Convert.ToString(Session["mail"]);
                resultado7Label.Text = Convert.ToString(Session["puesto"]);
                resultado8Label.Text = Convert.ToString(Session["sede"]);

                LabelAcept.Text = "Claramente estan cargadas las variables de sesion";
                LabelAcept.Attributes.Add("class", "alert alert-success");
            }
        }

    Alguien podría ayudarme un poco respecto al tema?
    viernes, 29 de noviembre de 2019 18:20

Todas las respuestas

  •  quiero conseguir es que la pestaña Mostrar.aspx al estar activa y yo habrá una pestaña con el mismo nombre me arroje un mensaje

    Hay un problema gordo con esto: ¿Cómo defines "estar activa"? Si te refieres a que "esté abierta en un navegador", el problema es que desde el lado servidor, que es donde se está ejecutando tu código, no existe ninguna manera de saber si la página está o no está abierta en el navegador.

    Podrías recurrir a alguna "chapuza" como por ejemplo embeber en la página un timer de javascript que periódicamente envíe una llamada AJAX a algún método en el servidor, de forma que ese método tome nota de cuándo fue la última llamada que se recibió. Si por ejemplo envías una llamada cada 30 segundos, entonces cuando intenten abrir una nueva pestaña puedes comprobar si la hora actual es más de 30 segundos posterior al último mensaje que se recibió, y entonces presumes que la pestaña no está abierta. Por supuesto, esto no es perfecto, dado que considerará que la pestaña todavía está abierta durante los 30 segundos posteriores a su cierre, pero puede contribuir a conseguir tus objetivos.

    viernes, 29 de noviembre de 2019 19:34
  • Que tal Alberto.

    A lo que me refiero cuando digo activa, es cuando accedo con mi usuario y contraseña en "Login.aspx" y me dirije a la pestaña Mostar.aspx.

    Podrías explicarme un poco mas acerca de tu ejemplo por favor no me quedo claro del todo.
    viernes, 29 de noviembre de 2019 20:17
  • A lo que me refiero cuando digo activa, es cuando accedo con mi usuario y contraseña en "Login.aspx" y me dirije a la pestaña Mostar.aspx.
    Bien, eso ocurre en una milésima de segundo. Y después de esa milésima de segundo, ¿qué se considera para decidir si sigue activa?
    viernes, 29 de noviembre de 2019 20:23
  • En este caso, las variables de sesión, ya que están activas en el sitio (Mostrar.aspx) de esa manera me aseguro 
    viernes, 29 de noviembre de 2019 21:34
  • Ah, vale bien, puedes usar las variables de sesión, pero no es cierto lo de que "de esa manera me aseguro". Las variables de sesión funcionan mediante un time-out, que por defecto es de 20 minutos. Esto significa que si el usuario cierra la página, durante 20 minutos considerarías que todavía está abierta, y si intentase abrirla de nuevo no le dejarías. Y, por el contrario, si la deja abierta durante más de 20 minutos sin enviar ningún postback, entonces el sistema consideraría que la sesión ha expirado y te dejaría abrir otra pestaña, a pesar de que la anterior todavía sigue abierta.

    Si a pesar de eso quieres usar las variables de sesión, es bastante sencillo. Simplemente en el Page_Load de Mostrar.aspx examinas una variable de sesión y si tiene metido un valor entonces haces un "Redirect" a otro sitio, y si no lo tiene, guardas el valor en la variable y muestras la página.

    sábado, 30 de noviembre de 2019 8:13