SSM実際の(3)ユーザモジュール------

特徴:

 

ユーザーログイン

ユーザー名の検証

ユーザー登録

アクセスの問題:パスワードを忘れました

質問の答えを提出します:

パスワードを再設定します

ユーザー情報の取得

更新ユーザー情報

ログ:セッションを削除します。

 

ゲートウェイインターフェイス(11):

          1ログインし; 2登録; 3テストユーザー名が有効である; 4ログオン情報へのユーザーアクセス; 5忘れてしまったパスワード、7パスワードのリセットパスワードを忘れた場合; 6提出の質問に答える8は、パスワードをリセットするには、ログイン。

          9ログイン状態更新ユーザー情報; 11ログイン、10は、現在ログオンしているユーザーの詳細情報、および力のログインを取得します

 

1つのSQLクエリはフィールドがあることをチェックする必要がある、「選択*」を使用していません

ユーザーオブジェクトへの2時のリターンは、ユーザーのパスワードがnullに設定されている覚えています

 

学習目標:

 

横方向、縦方向のオーバーライドセキュリティ脆弱性をオーバーライド

MD5は、ガジェットを使用して暗号化:塩の価値を高めるためにMD5と平文の暗号化

        // MD5加密
        user.setPassword(MD5Util.MD5EncodeUtf8(user.getPassword()));

 

     ツール:

パッケージcom.eshop.util。

輸入org.springframework.util.StringUtils。

輸入java.security.MessageDigestの; 

/ ** 
 *吉利によって作成
 * / 
publicクラスMD5Util { 

    プライベート静的な文字列byteArrayToHexString(バイトb []){ 
        StringBufferのresultSb =新しいStringBufferを(); 
        以下のために(; iはてb.lengthを<; I = 0 int型私は++){ 
            resultSb.append(byteToHexString(B [I]))。
        } 

        )(resultSb.toString返します。
    } 

    プライベート静的な文字列byteToHexString(バイトB){ 
        int型N = B。
        IF(N <0){ 
            N + = 256。
        }  
        INT D1 = N / 16。
        INT D2 = N%16。
        hexDigits [D1] + hexDigits [D2]を返します。
    } 

    / ** 
     *返回大写MD5 
     * 
     * @param起源
     * @paramたcharsetName 
     * @return 
     * / 
    プライベート静的文字列MD5Encode(文字列原点、ストリングたcharsetName){ 
        文字列resultString = NULL; 
        試す{ 
            resultString =新しい文字列(原点); 
            するMessageDigest MD = MessageDigest.getInstance( "MD5")。
            IF(たcharsetName == NULL || "" .equals(たcharsetName)){ 
                resultString = byteArrayToHexString(md.digest(resultString.getBytes()))。
            }他{
                resultString = byteArrayToHexString(md.digest(resultString.getBytes(たcharsetName)))。
            } 
        }キャッチ(例外例外){ 
        } 
        (resultString.toUpperCaseを返します)。
    } 

    公共の静的な文字列MD5EncodeUtf8(文字列原点){ 
        //原点=原点+ PropertiesUtil.getProperty( "password.salt"、 ""); 
        MD5Encode(原点、 "UTF-8")を返します。
    } 


    プライベート静的最終的な文字列hexDigits [] = { "0"、 "1"、 "2"、 "3"、 "4"、 "5"、
            "6"、 "7"、 "8"、 "9"、 "A"、 "B"、 "C"、 "D"、 "E"、 "F"}。

 

 

キャッシュのグアバ使用:

    ランダムな文字列UUIDを生成:

            ランダムな文字列を生成//トークン格納され、UUIDを使用して
            文字列forgetToken = UUID.randomUUID()のtoString();. 
            //クラストークン格納されているトークンを作成
            TokenCache.setKey( "トークン" +ユーザ名、forgetTokenを); 
            ServerResponceを返します。 createBySuccess(forgetToken)。

 

     token类:

com.eshop.commonパッケージ; 

インポートcom.google.common.cache.CacheBuilder; 
インポートcom.google.common.cache.CacheLoader; 
インポートcom.google.common.cache.LoadingCache; 
インポートorg.slf4j.Logger; 
インポートORG。 slf4j.LoggerFactory; 

インポートjava.util.concurrent.TimeUnit; 

publicクラスTokenCache { 
    //ログ宣言
    プライベート静的ロガーロガー= LoggerFactory.getLogger(TokenCache.classを); 

    //.initialCapacity(1000):初期容量を設定し、MaximumSizeを( 1000):より多くの3000よりも、キャッシュのLRUアルゴリズムでクリーンアップするために使用されるとき
    // expireAfterAccess(12、TimeUnit.HOURSを):キャッシュは12時間有効です
    プライベート静的LoadingCache <文字列、文字列>なLocalCache = CacheBuilder.newBuilder()。 InitialCapacityの値(1000).maximumSize(3000) .expireAfterAccess(12、TimeUnit.HOURS) 
            {.build(CacheLoaderの新しい新しい<文字列、文字列>()
                //デフォルトローディングは、getメソッドは、対応するトークンを見つけることができません呼び出すときに、このメソッドはロードされ、実現
                @Override 
                公共の文字列のロード(文字列s)は例外{スロー
                    「ヌル」の文字列を返すことが不要//ヌルポインタ例外
                    復帰「ヌル」; 
                } 
            })。

    静的な無効SETKEYパブリック(文字キー、文字列値){ 
        / * *キーの保存/ 
        localCache.put(キー、値); 
    } 
    パブリック静的文字列のgetKey(文字キー){ 
        String値は= nullを
        試し{ 
            値= localCache.get( )キー、
            IF(value.equals( "NULL")){ 
                戻りNULL; 
            } 
            戻り値。
        }キャッチ(例外e)は{  
            logger.error( "GETなLocalCache誤差"、E); 
        }
        NULLを返します。
    } 
}

 

 

再利用可能な設計対象サービスの応答:メッセージ応答オブジェクト

使用のセッション

 

おすすめ

転載: www.cnblogs.com/Lemonades/p/11256269.html