ViewStateとSession
5113 ワード
まずviewstateを深く分析してみましょう.分析の相対的な完全性のために、まず簡単なことから言います.
asp時代には、inputコントロールの値などのhtmlコントロールの値が知られていました.フォームをサーバに提出した後、ページをリフレッシュしたとき、inputのデータは空になりました.これは、ウェブの無状態性によるものであり、サービス側はhtmlをクライアントに出力するたびにクライアントと連絡を取らなくなる.
asp.Netは巧みにこの点を変えた.aspを書いているとNetフォームの場合、form runat=serverと表記すると、asp.Netは自動的に出力時にページに非表示ドメインを追加します
では、この非表示ドメインがあれば、ページ内の他のすべてのコントロールの状態、ページ自体を含むいくつかの状態がこのコントロール値に保存されます.ページがコミットされるたびにバックグラウンドにコミットされますasp.Netはその中の値を復号し、出力時にこの値に基づいて各コントロールの状態を復元する.このコントロールのvalue値を見てみると、Oz 4+O 2 w 8 aTwxPjs+O 2 w 8と似ている可能性があります.多くの人はこれが暗号化された情報だと思っているが、msは各コントロールとページの状態に適切なオブジェクトに格納し、そのオブジェクトをシーケンス化し、最後にbase 64符号化を行い、viewstateコントロールに直接値を与えるだけではない.
そういえば、このviewstateに何が保存されているのか見たいと思います.ええ、base 64 to stringの変換コードを書いて実現することができます.しかし、viewstateは階層的なもので、普通の変換後、あなたが見たのも乱れた文字です.ここではviewstate値を専門に変換する場所を提供しますhttp://www.wilsondotnet.com/Demos/ViewState.aspx . 自分のviewstateを入力して変換することができます.これは構造的ですよ.
はい、以上のことを言うと、sessionと何の関係があると思いますか.このviewstateはaspではありません.Netは自動的にメンテナンスしますか?はい、コントロールを保存している状態だけではsessionと何の関係があるのか感じられませんが(ほほほ、実は関係ありません)、次はバックグラウンドでaspxを見てみましょう.csコードには:
ほほほ、ページのバックグラウンドでviewstate集合に直接値を割り当てることができますが、今はsessionの使い方とあまり差がないと思いますか?はい、この点はほとんどの初学aspです.ネットの人の疑惑aspと思うNetもsessionのようにこの値をサーバーメモリに保存していますが、実は違います!
では、ここのviewstate値は誰に属しますか?どこにあるの?実は、上の他のコントロールの状態と同じように、その隠れたviewstateコントロールの値に格納されています.viewstateは、ページ自体を含む状態を保存するために使用されます.では、ここのviewstateはページ自体の状態に属します.
これを分析すると、viewstateの使用に疑問はないと思います.では、sessionと比較して、session値はサーバメモリに保存されているので、sessionを大量に使用するとサーバの負担が重くなることは間違いない.一方、viewstateは、ページ非表示コントロールにデータを格納だけで、サーバリソースを占有しないため、サーバの「記憶」が必要な変数やオブジェクトをviewstateに保存することができます.一方、sessonは、ページにまたがる必要があり、各アクセスユーザに関連する変数およびオブジェクト記憶にのみ適用すべきである.また、sessionはデフォルトで20分で期限切れになり、viewstateは期限切れになりません.
しかしviewstateはすべてを格納できるわけではありません.Netタイプのデータは、String、Integer、Boolean、Array、ArrayList、Hashtableおよびカスタムタイプのみをサポートする.
もちろん、何事にも両面性があり、viewstateを使用するとページhtmlの出力量が増加し、より多くの帯域幅を占有することは慎重に考慮する必要がある.また、viewstateはすべて1つの非表示ドメインに格納ため、base 64で符号化された値をソースコードを表示することで容易に見ることができる.変換することで、保存するオブジェクトと変数の値を取得できます.
実はviewstateのセキュリティの問題についてasp.Netは私たちにもっと多くの選択肢を提供してくれた.一般にviewstateを保護するには2つの方法がある:1つは改ざん防止であり、1つは暗号化である.改ざん防止といえば、ハッシュコードの使用を思い出す.そうです.ページの上部には、Page EnableViewStateMAC=trueというコードを追加できます.
これでNetはviewstateに自動的に1つのハッシュコードを追加する、ページの再送時に、サーバは、再送されたviewstateに基づいてハッシュコードを生成し、再送されたハッシュコードと比較する、間違っている場合は、そのviewstateを破棄し、同時にコントロールは初期状態に戻る.(デフォルトではasp.netはmd 5アルゴリズムではなくSHA 1アルゴリズムでハッシュを生成しますが、これはmachine.configでmachineKey validation="MD 5"を構成すればいいです)
viewstate暗号化はmachineであればもっと簡単ですconfigにmachineKey validation="3 DES"を設定するとdesでviewstateを暗号化できる.
ほほほ、ここまで、私达はviewstateに対してとてもはっきりした认识があるべきで、しかし、初歩的にviewstateを研究して、理解の间违いがあってまたみんなに多く指导することを望みます:)
asp時代には、inputコントロールの値などのhtmlコントロールの値が知られていました.フォームをサーバに提出した後、ページをリフレッシュしたとき、inputのデータは空になりました.これは、ウェブの無状態性によるものであり、サービス側はhtmlをクライアントに出力するたびにクライアントと連絡を取らなくなる.
asp.Netは巧みにこの点を変えた.aspを書いているとNetフォームの場合、form runat=serverと表記すると、asp.Netは自動的に出力時にページに非表示ドメインを追加します
<
input
type
="hidden"
name
="__VIEWSTATE"
value
=""
>
では、この非表示ドメインがあれば、ページ内の他のすべてのコントロールの状態、ページ自体を含むいくつかの状態がこのコントロール値に保存されます.ページがコミットされるたびにバックグラウンドにコミットされますasp.Netはその中の値を復号し、出力時にこの値に基づいて各コントロールの状態を復元する.このコントロールのvalue値を見てみると、Oz 4+O 2 w 8 aTwxPjs+O 2 w 8と似ている可能性があります.多くの人はこれが暗号化された情報だと思っているが、msは各コントロールとページの状態に適切なオブジェクトに格納し、そのオブジェクトをシーケンス化し、最後にbase 64符号化を行い、viewstateコントロールに直接値を与えるだけではない.
そういえば、このviewstateに何が保存されているのか見たいと思います.ええ、base 64 to stringの変換コードを書いて実現することができます.しかし、viewstateは階層的なもので、普通の変換後、あなたが見たのも乱れた文字です.ここではviewstate値を専門に変換する場所を提供しますhttp://www.wilsondotnet.com/Demos/ViewState.aspx . 自分のviewstateを入力して変換することができます.これは構造的ですよ.
はい、以上のことを言うと、sessionと何の関係があると思いますか.このviewstateはaspではありません.Netは自動的にメンテナンスしますか?はい、コントロールを保存している状態だけではsessionと何の関係があるのか感じられませんが(ほほほ、実は関係ありません)、次はバックグラウンドでaspxを見てみましょう.csコードには:
private
void
Page_Load(
object
sender, System.EventArgs e) { ViewState[
"
myvalue
"
]
=
"
viewstatevalue
"
;
//
.....
}
ほほほ、ページのバックグラウンドでviewstate集合に直接値を割り当てることができますが、今はsessionの使い方とあまり差がないと思いますか?はい、この点はほとんどの初学aspです.ネットの人の疑惑aspと思うNetもsessionのようにこの値をサーバーメモリに保存していますが、実は違います!
では、ここのviewstate値は誰に属しますか?どこにあるの?実は、上の他のコントロールの状態と同じように、その隠れたviewstateコントロールの値に格納されています.viewstateは、ページ自体を含む状態を保存するために使用されます.では、ここのviewstateはページ自体の状態に属します.
これを分析すると、viewstateの使用に疑問はないと思います.では、sessionと比較して、session値はサーバメモリに保存されているので、sessionを大量に使用するとサーバの負担が重くなることは間違いない.一方、viewstateは、ページ非表示コントロールにデータを格納だけで、サーバリソースを占有しないため、サーバの「記憶」が必要な変数やオブジェクトをviewstateに保存することができます.一方、sessonは、ページにまたがる必要があり、各アクセスユーザに関連する変数およびオブジェクト記憶にのみ適用すべきである.また、sessionはデフォルトで20分で期限切れになり、viewstateは期限切れになりません.
しかしviewstateはすべてを格納できるわけではありません.Netタイプのデータは、String、Integer、Boolean、Array、ArrayList、Hashtableおよびカスタムタイプのみをサポートする.
もちろん、何事にも両面性があり、viewstateを使用するとページhtmlの出力量が増加し、より多くの帯域幅を占有することは慎重に考慮する必要がある.また、viewstateはすべて1つの非表示ドメインに格納ため、base 64で符号化された値をソースコードを表示することで容易に見ることができる.変換することで、保存するオブジェクトと変数の値を取得できます.
実はviewstateのセキュリティの問題についてasp.Netは私たちにもっと多くの選択肢を提供してくれた.一般にviewstateを保護するには2つの方法がある:1つは改ざん防止であり、1つは暗号化である.改ざん防止といえば、ハッシュコードの使用を思い出す.そうです.ページの上部には、Page EnableViewStateMAC=trueというコードを追加できます.
これでNetはviewstateに自動的に1つのハッシュコードを追加する、ページの再送時に、サーバは、再送されたviewstateに基づいてハッシュコードを生成し、再送されたハッシュコードと比較する、間違っている場合は、そのviewstateを破棄し、同時にコントロールは初期状態に戻る.(デフォルトではasp.netはmd 5アルゴリズムではなくSHA 1アルゴリズムでハッシュを生成しますが、これはmachine.configでmachineKey validation="MD 5"を構成すればいいです)
viewstate暗号化はmachineであればもっと簡単ですconfigにmachineKey validation="3 DES"を設定するとdesでviewstateを暗号化できる.
ほほほ、ここまで、私达はviewstateに対してとてもはっきりした认识があるべきで、しかし、初歩的にviewstateを研究して、理解の间违いがあってまたみんなに多く指导することを望みます:)