Jak uzyskać dostęp do zmiennych sesji i ustawić je w javascript?

83

W kodowaniu ustawiłem Sessiontrochę danych.

Session["usedData"] = "sample data";

A pytanie brzmi: jak mogę pobrać wartość sesji (w moim przykładzie; „przykładowe dane”) w javascript i ustawić Session["usedData"]nową wartość?

Mehmet Ince
źródło
3
Podaj, czy jest to ASP.Net MVC czy Webforms. Jeśli MVC, możesz uzyskać do niego bezpośredni dostęp do javascript. Jeśli korzystasz z formularzy internetowych, możesz tymczasowo dodać do ViewState []
Fendy
Używam formularzy internetowych, dlaczego nie mogę uzyskać dostępu do zmiennej sesji i ustawić jej wartość?
Mehmet Ince
1
Nie za bardzo do WebForms, bezpośredni dostęp do Sesji w WebForm jest dla mnie nowością (choć jest to najprawdopodobniej zła praktyka). Sesja znajduje się po stronie serwera (serwer WWW / iis), a javascript po stronie klienta (przeglądarka). Potrzebujesz specjalnego żądania do serwera WWW, aby wywołać zmianę podczas sesji. Krótko mówiąc, możesz zaktualizować sesję z javascript za pomocą ajax (jQuery dla prostszej implementacji) i webservice.
Fendy

Odpowiedzi:

60

Dostęp i przypisywanie zmiennej sesji za pomocą JavaScript:

Przypisywanie zmiennej sesji ASP.NET przy użyciu JavaScript:

 <script type="text/javascript">
function SetUserName()
{
    var userName = "Shekhar Shete";
    '<%Session["UserName"] = "' + userName + '"; %>';
     alert('<%=Session["UserName"] %>');
}
</script>

Dostęp do zmiennej sesji ASP.NET przy użyciu JavaScript:

<script type="text/javascript">
    function GetUserName()
    {

        var username = '<%= Session["UserName"] %>';
        alert(username );
    }
</script>
SHEKHAR SHETE
źródło
6
Próbowałem dokładnie zakodować, a wynik, który otrzymuję, gdy + userName +
uzyskuję
23
Ta odpowiedź nie zadziała. Wywołanie metody SetUserName nie spowoduje wywołania serwera w celu uzyskania dostępu do obiektu Session
mcintyre321
3
odpowiedź nie działa, ale wciąż zbiera głosy pozytywne. Myślę, że odpowiedź wymaga przeglądu
Heemanshu Bhalla
1
@HeemanshuBhalla Właściwie odpowiedzią jest zdobywanie głosów pozytywnych, ponieważ dostęp do części działa jak urok. Nie sprawdziłem jednak części Przydzielanie.
Ahmad Maleki
4
Część „Dostęp” działa. Ale DUŻE zastrzeżenie: zostanie przypisane tylko raz podczas tworzenia strony. Serwer przypisuje wartość podczas renderowania kodu JavaScript. Możesz ponownie wykonać JavaScript na częściowym pakiecie pocztowym za pomocą pagelaad (), ale jeśli twój postback ulegnie zmianie, nowa sessionVariable nie zostanie przypisana do JavaScript. Po prostu ponownie wykorzysta stary.
DaniDev
27

Nie możesz uzyskać dostępu Sessionbezpośrednio w JavaScript.

Możesz utworzyć ukryte pole i przekazać je na swoją stronę, a następnie użyć JavaScript, aby pobrać obiekt za pośrednictwem document.getElementById

Darren
źródło
3
Nieprawda, pamiętasz z egzaminu? sessionStorage w JS;).
mattytommo
Haha - dostałem pytanie localStorage - na wypadek, gdyby użytkownik wrócił na stronę! ;)
Darren
Takie podejście wiąże się z ryzykiem, ponieważ użytkownik może łatwo zmienić wartość ukrytego pola za pomocą narzędzi programistycznych przeglądarki.
Ahmad Maleki
4
@AhmadM - dlatego sprawdzasz również na serwerze. W ten sposób zapobiegniesz pośrednim atakom na odwołania do obiektów.
Darren,
13

JavaScript nie może bezpośrednio ustawiać wartości sesji. Aby ustawić wartości sesji z javascript, wykonuję wywołanie ajax w następujący sposób.

Sprawdź online

W pliku ASPx lub html,

 <script type="text/javascript">
 $(function(){
   //Getting values from session and saving in javascript variable.
   // But this will be executed only at document.ready.
   var firstName = '<%= Session["FirstName"] ?? "" %>';
   var lastName = '<%= Session["LastName"] ?? "" %>';

   $("#FirstName").val(firstName);
   $("#LastName").val(lastName);

   $('Button').click(function(){
     //Posting values to save in session
     $.post(document.URL+'?mode=ajax', 
     {'FirstName':$("#FirstName").val(),
     'LastName':$("#LastName").val()
     } );
   });

 });

Po stronie serwera

protected void Page_Load(object sender, EventArgs e)
 {
      if(Request.QueryString["mode"] != null && Request.QueryString["mode"] == "ajax")
      {
        //Saving the variables in session. Variables are posted by ajax.
        Session["FirstName"] = Request.Form["FirstName"] ?? "";
        Session["LastName"] = Request.Form["LastName"] ?? "";
      }
 }

Za uzyskanie wartości sesji, jak powiedzieli Shekhar i Rajeev

var firstName = '<%= Session["FirstName"] ?? "" %>';

Mam nadzieję że to pomoże.

Ganesh
źródło
12

Spróbuj tego

var sessionValue = '<%=Session["usedData"]%>'
Rajeev Kumar
źródło
dzięki, to działa świetnie :) ale chcę ustawić również wartość sesji, czy to możliwe?
Mehmet Ince
@MehmetInce, aby ustawić wartość sesji, należy wysłać wartość do serwera za pośrednictwem poczty lub pobrać i zlecić serwerowi obsługę żądania. Nic nie stoi na przeszkodzie, aby wykonać to żądanie za pośrednictwem ajax.
Ash Burlaczenko
1
@AshBurlaczenko Czy mógłbyś przesłać przykładowy przykład. Byłoby to bardzo pomocne
Rajeev Kumar
1
Ale w jaki sposób przypiszesz wartość do zmiennej sesji za pomocą JavaScript?
SHEKHAR SHETE
10

Zakładając, że masz na myśli „JavaScript po stronie klienta” - wtedy nie możesz, przynajmniej nie bezpośrednio.

Dane sesji są przechowywane na serwerze, więc kod po stronie klienta nie może ich zobaczyć bez komunikacji z serwerem.

Aby uzyskać do niego dostęp, należy wysłać żądanie HTTP i poprosić program po stronie serwera o modyfikację / odczyt i zwrot danych.

Quentin
źródło
Jeśli nie mogę uzyskać dostępu bezpośrednio, moją prostą szansą jest skorzystanie z żądania http :(
Mehmet Ince
4

Przypisz wartość do ukrytego pola w pliku związanym z kodem. Uzyskaj dostęp do tej wartości w swoim javascript jak do zwykłej kontrolki HTML.

btevfik
źródło
dobry punkt, aby mieć łatwy dostęp, ale duży problem z bezpieczeństwem kodu, użytkownik może podstępnie zmienić konto użytkownika / dostęp za pomocą narzędzi takich jak devTool w przeglądarce Chrome i robić to, czego nie pozwala jego poziom dostępu
StudioX
2

Nie możesz ustawić zmiennych sesji po stronie sesji z Javascript. Jeśli chcesz to zrobić, musisz utworzyć AJAX POST, aby zaktualizować to na serwerze, ale jeśli wybór samochodu jest ważnym wydarzeniem, może być łatwiejsze POST .

Mohaimin Moin
źródło
2

najpierw utwórz metodę w kodzie, aby ustawić sesję:

 [System.Web.Services.WebMethod]
 public static void SetSession(int id)
 {
     Page objp = new Page();
     objp.Session["IdBalanceSheet"] = id;
 }

następnie zadzwoń po stronie klienta:

function ChangeSession(values) {
     PageMethods.SetSession(values);
     }

powinieneś ustawić EnablePageMethods na true:

<asp:ScriptManager EnablePageMethods="true" ID="MainSM" runat="server" ScriptMode="Release" LoadScriptsBeforeUI="true"></asp:ScriptManager>
Behnam
źródło
2

Jeśli chcesz przeczytać wartość sesji w javascript, ten kod pomoże ci.

<script type='text/javascript'> var userID='@Session["userID"]'; </script>

Chandan Rajbhar
źródło
1

Możesz także ustawić zmienną we właściwości i wywołać ją z js:

Po stronie serwera:

Protected ReadOnly Property wasFieldEditedStatus() As Boolean
    Get
        Return If((wasFieldEdited), "true", "false")
    End Get
End Property

A potem w javascript:

alert("The wasFieldEdited Value: <%= wasFieldEditedStatus %>" );
Off The Gold
źródło
1

Szukałem rozwiązania tego problemu, dopóki nie znalazłem bardzo prostego rozwiązania dostępu do zmiennych sesji, zakładając, że używasz pliku .php po stronie serwera. Mam nadzieję, że odpowiada na część pytania:

wartość sesji dostępu

<script type="text/javascript">        
    var value = <?php echo $_SESSION['key']; ?>;
    console.log(value);
</script>

Edycja: lepszy przykład poniżej, który możesz wypróbować na phpfiddle.org, w zakładce "codespace"

<!DOCTYPE html>
<html>
 <head>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  <?php
    $_SESSION['key'] = 10;
    $i = $_SESSION['key'];
  ?>
 </head>
 <body>
  <p id="affichage">hello</p>

  <script type="text/javascript">
    var value =  <?php echo $i; ?>;
    $("#affichage").html(value);   
  </script>

 </body>
</html>

ustaw wartość sesji

przekazać mu dowolną zmienną, jeśli chcesz. na przykład,

$you = 13;
$_SESSION['user_id'] = $you;

To powinno działać, chociaż tego nie testowałem.

Matthieu
źródło
prawdopodobnie zapomniałeś zamienić 'klucz'
Matthieu
cześć @Matthieu, plakat pyta o sesję asp.net, a nie o sesję php
SHEKHAR SHETE
mój błąd powinienem usunąć mój post?
Matthieu,
1

To oszustwo, ale możesz to zrobić, wyślij wartość na stronę serwera jako parametr

<script>
var myVar = "hello"
window.location.href = window.location.href.replace(/[\?#].*|$/, "?param=" + myVar); //Send the variable to the server side
</script>

A po stronie serwera pobierz parametr

string myVar = Request.QueryString["param"];
Session["SessionName"] = myVar;

mam nadzieję że to pomoże

KMR
źródło
1

Aby zmodyfikować dane sesji z serwera po utworzeniu strony, musisz użyć AJAX lub nawet JQuery, aby wykonać zadanie. Obaj mogą nawiązać połączenie z serwerem, aby zmodyfikować dane sesji i odzyskać dane zwrócone z tego połączenia.

<?php
session_start();
$_SESSION['usedData'] = "Some Value"; //setting for now since it doesn't exist
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>Modifying PHP Session Data</title>
        <script type='text/javascript'>
            var usedData = '<?php echo $_SESSION['usedData']; ?>';
            var oldDataValue = null;

            /* If function used, sends new data from input field to the
               server, then gets response from server if any. */

            function modifySession () {
                var newValue = document.getElementById("newValueData").value;

                /* You could always check the newValue here before making
                   the request so you know if its set or needs filtered. */

                var xhttp = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");

                xhttp.onreadystatechange = function () {
                    if (this.readyState == 4 && this.status == 200) {
                        oldDataValue = usedData;
                        usedData = this.responseText; //response from php script
                        document.getElementById("sessionValue").innerHTML = usedData;
                        document.getElementById("sessionOldValue").innerHTML = oldDataValue;
                    }
                };

            xhttp.open("GET", "modifySession.php?newData="+newValue, true);
            xhttp.send(); 
            }
        </script>
    </head>
    <body>
        <h1><p>Modify Session</p></h1>

        Current Value: <div id='sessionValue' style='display:inline'><?php echo $_SESSION['usedData']; ?></div><br/>
        Old Value: <div id='sessionOldValue' style='display:inline'><?php echo $_SESSION['usedData']; ?></div><br/>

        New Value: <input type='text' id='newValueData' /><br/>
        <button onClick='modifySession()'>Change Value</button>
   </body>
</html>

Teraz musimy zrobić mały skrypt php o nazwie modifiedSession.php, aby wprowadzić zmiany w danych sesji i przesłać dane z powrotem, jeśli to konieczne.

<?php
session_start();
$_SESSION['usedData'] = $_GET['newData']; //filter if necessary
echo $_SESSION['usedData']; // Post results back if necessary
?>

Powinno to przynieść oczekiwane rezultaty, modyfikując sesję po stronie serwera za pomocą PHP / AJAX.

shader2199
źródło
1

Oto, co zadziałało dla mnie. Javascript ma to.

<script type="text/javascript">
var deptname = '';
</script>

C # za kodem ma to - można go umieścić na stronie wzorcowej, aby resetował zmienną przy każdej zmianie strony.

        String csname1 = "LoadScript";
        Type cstype = p.GetType();

        // Get a ClientScriptManager reference from the Page class.
        ClientScriptManager cs = p.ClientScript;

        // Check to see if the startup script is already registered.
        if (!cs.IsStartupScriptRegistered(cstype, csname1))
        {
            String cstext1 = funct;
            cs.RegisterStartupScript(cstype, csname1, "deptname = 'accounting'", true);
        }
        else
        {
            String cstext = funct;
            cs.RegisterClientScriptBlock(cstype, csname1, "deptname ='accounting'",true);
        }

Dodaj ten kod do przycisku kliknij, aby potwierdzić zmianę nazwy działu.

alert(deptname);
zakoduj to
źródło
0

Użyłem mojego pliku .php, aby umieścić wymagane w sesjach

$ _SESSION ['name'] = $ phparray ["name"]; $ ajaxoutput ['name'] = $ phparray ["nazwa"];

w moim pliku .js, którego użyłem

sessionStorage.setItem ("nazwa", ajaxreturnedarray ["nazwa"]);

i odzyskałem to za pomocą

var myName = sessionStorage.getItem ("nazwa");

w innych plikach .js lub w tych samych plikach .js

jeśli zachowam to tak, jak jest, będzie zwracać to samo przez cały czas, nawet jeśli się wylogujesz. więc wylogowując się zrobiłem

sessionStorage.setItem ("nazwa", "");

używając tej opróżniłem zmienną lokalną. Użyłem tego procesu w sesjach logowania / wylogowania z pojedynczej strony internetowej. Mam nadzieję, że ten sposób zadziała dla Ciebie, ponieważ zadziałał dla mnie. plz daj mi znać swoje doświadczenia.

Srinivasa Reddy
źródło
0

Udało mi się rozwiązać podobny problem z prostymi parametrami adresu URL i automatycznym odświeżaniem.

Możesz pobrać wartości z parametrów adresu URL, zrobić z nimi co chcesz i po prostu odświeżyć stronę.

HTML:

<a href=\"webpage.aspx?parameterName=parameterValue"> LinkText </a>

DO#:

string variable = Request.QueryString["parameterName"];
if (parameterName!= null)
{
   Session["sessionVariable"] += parameterName;
   Response.AddHeader("REFRESH", "1;URL=webpage.aspx");
}
Rui Ruivo
źródło
-1
<?php
    session_start();
    $_SESSION['mydata']="some text";
?>

<script>
    var myfirstdata="<?php echo $_SESSION['mydata'];?>";
</script>
Pkde
źródło
Podana odpowiedź została oznaczona jako niska jakość. Oto kilka wskazówek, jak odpowiedzieć?
Guilherme Lemmi
-1

Prawdopodobnie jakiś przebieg przy takim podejściu. Wydaje się, że ta data wraca do zmiennej sesji. Ciąg, który zwraca, wyświetla datę javascript, ale kiedy próbuję manipulować ciągiem, wyświetla kod javascript.

ob_start();
?>
<script type="text/javascript">
    var d = new Date();
    document.write(d);
</script>
<?
$_SESSION["date"]  = ob_get_contents();
ob_end_clean();
echo $_SESSION["date"]; // displays the date
echo substr($_SESSION["date"],28); 
// displays 'script"> var d = new Date(); document.write(d);'
Gordon
źródło