欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring mvc 分步式session的实例详解

程序员文章站 2022-06-11 14:20:04
spring mvc 分步式session的实例详解 session代表服务器与浏览器的一次会话过程,它的信息是保存在服务器端的。在servlet中,session指的是...

spring mvc 分步式session的实例详解

session代表服务器与浏览器的一次会话过程,它的信息是保存在服务器端的。在servlet中,session指的是httpsession类的对象。服务器在创建session后,会把sessionid以cookie的形式回写给客户端。只要客户端的浏览器不关,每一次访问服务器都会带上这个sessionid。这样就可以在每次请求的时候获取到session的信息。

下面以spring mvc以例来说明如果创建分步式session.

1、login – 登录页

login表示用户跳转到登录页面,这个时候可以生成唯一key为sessionid的sesssionid。保存sessionid到response中,当用户真正登录的时候获取sessionid,因为是分步式所以统一的管理sessionid,把它保存在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 – 身份认证/登录

用户输入用户名密码,需要在后台进行登录。此时可以从cookie中获取到sessionid,然后再从redis里面获取到它的值sessionidvalue。并且把需要保存的session信息以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<object> responseinfo = new responseinfo<object>();
    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 – 登出

当用户选择退出系统时,需要把页面跳转到登录页面也就是第一步并且需要删除在redis里面的session信息以及在cookie里面的sessionid.

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、获取session

可以把获取session提取到公共的controller中,这样需要使用session信息的类就可以继承这个类。

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、总结

使用第三方管理session时的基本步骤如下。

  • 进入登录页面保存sessionid到cookie中
  • 用户登录成功根据sessionid的值把session保存在redis里面
  • 用户登出系统需要清除cookie中的sessionid,以及redis里面用户的session信息。

当用户登录成功之后进行其它操作就可以在request里面获取到用户的session信息。

 如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!