Spring mvcステップセッションの例の詳細

6059 ワード

Spring mvcステップセッションの例の詳細
Sessionはサーバとブラウザのセッションプロセスを表し、その情報はサーバ側に保存されます.サーブレットではsessionはHttpSessionクラスのオブジェクトを指します.サーバはセッションを作成すると、セッションIDをクッキー形式でクライアントに返信します.クライアントのブラウザがオフになっていない限り、アクセスサーバごとにこのセッションIDが付いています.これにより、リクエストのたびにセッションの情報を取得できます.
次にspring MVCの例として、ステップセッションを作成する場合について説明する.
1、login�C登録ページ
loginは,ユーザがログインページにジャンプすることを示し,このとき唯一keyがsessionidであるsesssionidを生成することができる.セッションIDをresponseに保存し、ユーザーが本当にログインしたときにセッションIDを取得し、ステップ式なので統合した管理セッションIDをRedisキャッシュに保存します.

public class LoginController{

  private static final String SESSION_ID_COOKIE = "sessionId";

  @Autowired
  private RedisClient client;

  @RequestMapping(value="/login/index")
  public ModelAndView login(HttpServletRequest request, HttpServletResponse response){
    ModelAndView modelAndView = new ModelAndView("/login");
    String sessionId = CookieUtils.getCookieValue(request, SESSION_ID_COOKIE);
    if(StringUtils.isEmptyOrNull(sessionId)) {
      sessionId = getUniqueSessionId();
      addCookie(response, SESSION_ID_COOKIE, sessionId);
    }
    //         

    return modelAndView;
  }

  //   cookie response
  private void addCookie(HttpServletResponse response, String cookieName, String cookieValue) {
    Cookie cookie = new Cookie(cookieName, cookieValue);
    cookie.setPath("/");
    cookie.setMaxAge(-1);
    response.addCookie(cookie);
  }

  //     sessionid
  private String getUniqueSessionId() {
    String sessionId = "";
    while(true) {
      String uuid = UUID.randomUUID().toString();
      String[] jsessionIdArray = uuid.split("-");
      StringBuilder jsessionIdBuilder = new StringBuilder();
      for(String str: jsessionIdArray) {
        jsessionIdBuilder.append(str);
      }
      sessionId = jsessionIdBuilder.toString();
      if(!redisClient.exists(sessionId)) {
        break;
      }
    }
    return sessionId;
  }
}


2、authenticate�C身分認証/登録
ユーザーはユーザー名のパスワードを入力し、バックグラウンドでログインする必要があります.クッキーからsessionidを取得し、redisからその値sessionidvalueを取得できます.そして、保存するセッション情報をsessionidvalueをkeyとしてredisに保存します.

public class LoginController{

  private static final String SESSION_ID_COOKIE = "sessionId";

  private static final Integer REDIS_SESSION_TIME_SECONDS = 2 * 60 * 60;

  @Autowired
  private RedisClient client;

  @RequestMapping(value="/authenticate")
  @ResponseBody
  public ResponseInfo login(String username, String password, HttpServletRequest request){
    ResponseInfo responseInfo = new ResponseInfo();
    try {
      Account account = authenticate(username, password);

      saveSession(account);
      responseInfo.setStatus(0);
      responseInfo.setMessage("success");
    } catch(Exceptioin e){
      responseInfo.setStatus(1);
      responseInfo.setMessage("     ,     ")
    }

    return responseInfo;
  }

  //   session  
  private void saveSession(Account account) {
    String sessionId = CookieUtils.getCookieValue(request, SESSION_ID_COOKIE);
    redisClient.set(sessionId, account);
    redisClient.expire(sessionId, REDIS_SESSION_TIME_SECONDS);
  }
}


3、logout�C登录
ユーザがシステムを終了することを選択する場合、ログインページ、すなわち第一歩にページをジャンプし、redis内のセッション情報およびCookie内のセッションonidを削除する必要がある.

public class LoginController{

  private static final String SESSION_ID_COOKIE = "sessionId";

  @Autowired
  private RedisClient client;

  @RequestMapping(value="/logout", method = RequestMethod.GET)
  public void logout(HttpServletRequest request, HttpServletResponse response) {
    //               
    String redirectUrl = this.getLoginPageRedirectUrl(request);

    clearSession(request);
    clearSessionCookie(request, response);
    response.sendRedirect(redirectUrl);
  }

  //   session redis     
  private void clearSession(HttpServletRequest request) {
    String sessionId = CookieUtils.getCookieValue(request, SESSION_ID_COOKIE);
    redisClient.del(sessionId);
  }

  //   session cookie  sessionid
  private void clearSessionCookie(HttpServletRequest request, HttpServletResponse response) {
    Cookie sessionCookie = CookieUtils.getCookie(request, SESSION_ID_COOKIE);
    sessionCookie.setMaxAge(0);
    response.addCookie(sessionCookie);
  }
}


4、セッションの取得
取得セッションを共通のControllerに抽出することで,セッション情報を使用する必要があるクラスがこのクラスを継承できる.

public class BaseController{

  @Autowired
  private RedisClient redisClient;

  protected Account getAccountFromSession(HttpServletRequest request) {
    String sessionCookieValue = CookieUtils.getCookieValue(request, "sessionid");
    if(StringUtils.isEmptyOrNull(sessionCookieValue)) {
      return null;
    } else {
      String accountJson = this.redisClient.get(sessionCookieValue);
      Account account = null;
      if(!StringUtils.isEmpty(accountJson)) {
        account = (Account)JSON.parseObject(casInfoJson, Account.class);
      }

      return account;
    }
  }

}


5、まとめ
サードパーティ管理セッションを使用する場合の基本手順は以下のとおりです.
  • ログインページにアクセスしてセッションをクッキーに保存する
  • ユーザログイン成功sessionidの値に従ってセッションをredisに保存する
  • ユーザ登録システムは、cookie内のsessionidおよびredis内のユーザのsession情報を消去する必要がある.

  • ユーザーがログインに成功した後、他の操作を行うと、requestでユーザーのセッション情報を取得できます.
    もし疑問があれば伝言を残してあるいは当駅のコミュニティに行って討論を交流して、読書に感謝して、みんなを助けることができることを望んで、みんなの当駅に対する支持に感謝します!