2016-04-07 16 views
2

私はSpring 4.1.1を使用しています。そして、私はユーザーセッションのサービスを行う必要があります。ユーザーのセッション関連データを保存する最良の方法は何ですか?私はそんなに多くの方法を読んだが、どちらが正しいのか分からない。spring mvcで正しくセッションを使用

それは私はあなたのユーザーオブジェクトがセッションに入れ、その後、どこでも、あなたのプロジェクトでそれを使用することをOKです

@Controller 
@SessionAttributes("user") 
public class PagesController { 
@RequestMapping(value="/sign_in", method = RequestMethod.POST) 
public String getSignIn(@RequestParam(value="user")String user , 
         @RequestParam(value="pass")String password, 
         Model model) { 
    UserDAO dao = new UserDao(); 
    if(dao.isUserValid(user,password) && !model.containsAttribute("user")){ 
     User user = new User(); 
     model.addAttribute("user",user); 
     return USER_PAGE; 
    } 
    return LOGIN_PAGE; 
} 

}

+0

あなたはすでに何を試していたのか、その欠点は何か説明できますか? –

+0

@SessionAttributesアノテーションを使用して、Modelクラスにデータを保持します。 model.setAttribute( "objName"、obj); ModelAndViewクラスを使用してください...しかし、私はそれが良い方法ではないと聞きます...私たちのプロジェクトでは、春に働いた人はいません。誰かに尋ねることはできません。 – dzrkot

+0

メインポストにコードを投稿できますか?より良い理解に役立ちます。 –

答えて

1

まず以下の記事を参照することができ、セッション属性は、あなたを保存するには良い選択肢ではありませんユーザオブジェクト。セッション属性データを消去する時期を決めるのは春です。春のドキュメンテーションのように、Springは '会話'が完了したことを理解すると、セッション属性を削除します。コントローラスコープ内にあり、セッションにデータを一時的に格納する必要がある場合にのみ、セッション属性を使用します。

ユーザーログインオブジェクトが行われる限り、必要なことはhttpセッションを使用することです。アプリケーションにログイン/サインインするときは、実際にログインクレデンシャルをコントローラに投稿します。妥当性が確認されたら、ユーザーオブジェクトをオブジェクトに入れます(必要な情報は可能な限りオブジェクトに格納され、セッションに格納されます)。このオブジェクトは、ユーザーがログアウトをトリガーしたときに有効期限が切れていないか、またはクリアするかぎり、そのまま残ります。

さらに、SessionAttributeを使用してユーザーオブジェクトを保存する場合は、クラスタ化された環境にアプリケーションをデプロイすると、さらに問題が発生する可能性があります。スティッキーセッションを実装しない限り、セッションはサーバーの各インスタンスにコピーされる必要があります。 httpsessionのコピーはsessionAttributeの同じインスタンスをコピーするのではなく、最も簡単な作業です。

@RequestMapping(value = "login.html", method = RequestMethod.POST) 
    public ModelAndView post(@ModelAttribute("login") LoginEntity login, HttpServletRequest req) { 


... process the data ... 
if passed put it into session: 

HttpSession session = req.getSession(true); 
UserObject userObject=new UserObject(); 
userObject.setName(login.getUserName()); 
... 

session.setAttribute("user",userObject); 
1

が必要であることを例です。しかし、多くのユーザーがいる場合は、サーバーのメモリ内に多数のユーザーオブジェクトがあることを意味します。メモリが不足する可能性があります。

もう1つの方法は、一部の暗号化と検証でCookieにユーザー情報を入れることですが、リクエストまたは応答が行われるたびにCookieが送信されるため、Cookieにあまり情報を入れないようにしてください。送信する情報が多ければ、応答時間が遅くなります。

また、セッション内の属性が不要な場合は、status.setComplete()を呼び出してその属性をクリーンアップする必要があります。

Does SessionStatus object.setComplete() clears all the session attributes or just work for the controller in which it is used?

、あなたがそれを使用する方法がわからない場合、あなたはすべての

http://vard-lokkur.blogspot.tw/2011/01/spring-mvc-session-attributes-handling.html

+0

JSESSIONIDをModelに保存する場合、セッションが完了すると特定のJSESSIONIDをどのように削除できますか?私はタイムアウトをsomwhereに設定することができます。または、スレッド内のコードでそれを追跡する必要がありますか? – dzrkot

+0

セッション。 invalidate() –

関連する問題