Spring_mvc_分步式session的实例详解
来源:
中文源码网 浏览:274 次 日期:2024-05-16 23:58:20
【下载文档: Spring_mvc_分步式session的实例详解.txt 】
Spring mvc 分步式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