特徴:
ユーザーログイン
ユーザー名の検証
ユーザー登録
アクセスの問題:パスワードを忘れました
質問の答えを提出します:
パスワードを再設定します
ユーザー情報の取得
更新ユーザー情報
ログ:セッションを削除します。
ゲートウェイインターフェイス(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を返します。 } }
再利用可能な設計対象サービスの応答:メッセージ応答オブジェクト
使用のセッション