1

Nitrogen/Inets を使用して、家族で使用するための簡単な Web サイトを構築しています。単一のクライアントが Web サーバーに接続されている限り、現在のバージョンは期待どおりに動作します。

新しいユーザーに接続しようとすると、2 つのセッションが同じ状態変数を共有しているように見えます。

  • ブラウザ 1: インデックス ページを読み、[接続] をクリックして、user1 としてログインします。
  • ブラウザ 2: インデックス ページを読みます。ユーザーは user1 です --> OK ではありません - ログインに移動し、user2 として入力します。大丈夫そうです。
  • ブラウザ 1: ホームページをリロード --> ユーザーが user2 に変更 --> 非常に悪い :o(

さらに、タイムアウト カウンターを表示するディスプレイを含めました -> 値は両方のブラウザーで同期されます。

複数のユーザーを同時に管理するにはどうすればよいですか? 私が書いたコードは次のとおりです。

index.erl の抜粋

header() ->
% if the user is not defined, show in the header a button to connect, change the title and display a reduced menu (thanks to common module)
% if the user is defined, show in the header a button to disconnect, change the title and display a complete menu (thanks to common module)
    User = wf:user(),
    Msg = case User of
        undefined -> 
            "Pas connecté";
        User -> 
            "Welcome " ++ User
    end,
    case User of
        undefined -> 
            common:header(Msg, #button { id=dcnx, text="Connexion", postback=connexion , class = rightalign});
        User -> 
            common:header(Msg, #button { id=dcnx, text="Deconnexion", postback=deconnexion , class = rightalign})
    end.


body() ->
    #container_12 { body= #grid_8 { alpha=true, prefix=2, suffix=2, omega=true, body=inner_body(wf:user()) }}.

inner_body(User) -> 
    Msg = case User of
        undefined -> "Pas connecté";
        _ -> User ++ " home"
    end,
    [
        #h2{ text= Msg },
        #p{}
    ].

event(deconnexion) ->
    % a temporary popup just to display the user name and check the function call
    wf:wire(#alert { text="Bye bye " ++ wf:user() }), 
    wf:clear_session(), % erase the session information
    wf:redirect("index"); % redisplay the index page
event(connexion) ->
    wf:redirect_to_login("login");

event(E) -> common:event(E).

login.erl の抜粋:

body() ->
% the login requires a name and a password,
% checks that {name,password} exists 
        Body = [
            #label { text="Name" },
            #textbox { id=nameTextBox, next=passwordTextBox },

            #p{},  
            #label { text="Password" },
            #password { id=passwordTextBox, next=continueButton },

            #p{},  
            #button { id=continueButton, text="Continue", postback=continue }

    ], 
    wf:wire(continueButton, nameTextBox, #validate { validators=[
        #is_required { text="Obligatoire." },
        #custom { text="utilisateur invalide.", tag=tag_name, function=fun name_validator/2 }
    ]}),

    wf:wire(continueButton, passwordTextBox, #validate { validators=[
        #is_required { text="Obligatoire." },
        #custom { text="mot de passe incorrect.", tag=tag_password, function=fun password_validator/2 }
    ]}),

    Body.

event(continue) ->
    Name = wf:q(nameTextBox), % retreive the name
    wf:user(Name),  % define as user
    wf:role(admin,is_admin(Name)), % define role
    wf:session(logged,true), % define as logged
    wf:redirect_from_login("index"); % go back to the calling page or index if not defined

event(_) -> ok.
4

1 に答える 1

2

セッション情報は、Cookie をキーとして保存されます。

同じブラウザの別のウィンドウでページを開いていますか、それとも完全に別のブラウザ (IE、Chrome、および Firefox) を開いていますか? 同じブラウザ内で別のウィンドウまたはタブを開いているだけの場合、Cookie 情報は確実に共有され、説明した効果につながります。

したがって、2 つのまったく異なるブラウザを起動していることを確認してください。

投稿したコードは正しく見えます。セッション間で情報を共有することほど目立ったものはありません。

于 2012-12-21T19:16:17.390 に答える