session理解及实践

保持http链接状态的技术:一个是cookie技术,另一种是session技术。

PHP中的session的生成;
网上有人分析源码大意是 通过时间戳+微秒数+随机数,经过哈希算法等等,得到一串32位字符串(其中sess_是固定不变的 ),一定量的高并发情况下是有几率产生重复的;
 
拿着这个字符串,它有什么用呢;  
第一步:它把字符串丢给client( 你的浏览器), 自己呢(服务器)就在本地创建了一个文件,以这个字符串命名这个文件;(于是文件中就可以存东西了;)
第二步:client(你的浏览器)拿到这个字符串后,就可以去读取服务器上的这个文件了;
session用于存储有关用户(理解成客户端/浏览器也可以)会话的信息。
Session 变量保存的信息是单一用户的,并且可供应用程序中的所有页面使用。
大概流程就是:用户打开浏览器访问一起网站,浏览器的COOKIE中会生成sessionID,在每次请求时都会自动带上sessionID,然后服务器端根据sessionID找到对应的session文件。
sessionID就相当于是一个钥匙,服务器上存session的地方相当于一个柜子,只能拿自己的钥匙开自己的柜子取自己的东西。
session一般存储用户相关的的信息,如用户登录状态、权限控制等,其他的信息也可存。另外就是无论你站点上的用户是否登录都会生成sessionID。

由于网页是一种无状态的连接程序,因此你无法得知用户的浏览状态。因此我们必须通过session记录用户的有关信息,
以供用户再次以此身份对web服务器请求时作确认,例如,我们在某些网站中常常要求用户登录, 
但我们怎么知道用户已经登录了呢,如果没有session的话,登录信息是无法保留的,那岂不要让用户在每一页网页中都要提供用户名和密码。 
http://bbs.csdn.net/topics/392015942

这个唯一的SessionID是有很大的实际意义的。当一个用户提交了表单时,浏览器会将用户的SessionID自动附加在HTTP头信息中,(这是浏览器的自动功能,用户不会察觉到),
当服务器处理完这个表单后,将结果返回给SessionID所对应的用户。试想,如果没有SessionID,当有两个用户同时进行注册时,服务器怎样才能知道到底是哪个用户提交了哪个表单呢。
除了SessionID,在每个Session中还包含很多其他信息。
https://www.cnblogs.com/wxwx/p/5481171.html

第一次访问时,服务器会创建一个新的sesion,并且把session的Id以cookie的形式发送给客户端浏览器,
浏览器再请求服务器时,会把存储到cookie中的session的Id一起传递到服务器端
https://www.cnblogs.com/xdp-gacl/p/3855702.html

package com.springmvc.controller;

/**
 * IDEA搭建SpringMVC并用maven配置的小例子
 */
import com.springmvc.entity.User;
import com.springmvc.service.UserService;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Controller
@RequestMapping("/user")
public class ViewController {

    private Logger logger = Logger.getLogger(ViewController.class);

    @Resource(name = "UserService")
    private UserService userService;

    @RequestMapping("/index")
    public String index() {
        logger.info("进入 index 方法");
        return "index";
    }

    @RequestMapping("/find")
    @ResponseBody
    public Map<String, Object> find(User user, HttpServletRequest request, HttpServletResponse response) {
        Map<String, Object> map = new HashMap();
        logger.info("进入 find 方法");
        List<User> loginuser = userService.findByUsernameAndPwd(user.getUsername(), user.getPassword());
        if (loginuser != null) {
            map.put("result", "success");
        } else {
            map.put("result", "fail");
        }
        return map;
    }

    @RequestMapping("/success")
    @ResponseBody
    public Map<String, Object> success(HttpServletRequest request, HttpServletResponse response) {
        logger.info("进入 success 方法");
        Map<String, Object> map = new HashMap();
        HttpSession httpSession = request.getSession();
        logger.info("是否新建:" + httpSession.isNew() + "");
        logger.info("Session创建时间:" + new Date(httpSession.getCreationTime()) + "");
        logger.info("SessionId:" + httpSession.getId() + "");
        logger.info("Session最后活跃时间:" + new Date(httpSession.getLastAccessedTime()) + "");
        map.put("sessionId", httpSession.getId());
        return map;
    }
}

如果是直接在浏览器里输入有referer的页面,返回是null,也就是说referer只有从别的页面点击连接来到这页的才会有内容。为NULL就是手工,非null就是连接过来的。
referer是从哪里来的,也就是前一个页面。
2018-03-01 13:43:38,812 -[INFO]  method:[com.springmvc.controller.ViewController (14945ms)] - 进入 success 方法
2018-03-01 13:43:38,813 -[INFO]  method:[com.springmvc.controller.ViewController (14946ms)] - 是否新建:false
2018-03-01 13:43:38,814 -[INFO]  method:[com.springmvc.controller.ViewController (14947ms)] - Session创建时间:Thu Mar 01 13:43:31 CST 2018
2018-03-01 13:43:38,814 -[INFO]  method:[com.springmvc.controller.ViewController (14947ms)] - SessionId:E17345E47421271A889AABE9CE46D92F
2018-03-01 13:43:38,814 -[INFO]  method:[com.springmvc.controller.ViewController (14947ms)] - Session最后活跃时间:Thu Mar 01 13:43:38 CST 2018
这两处的SessionId相同。

关于session的常用方法详见:http://blog.csdn.net/u010002184/article/details/79411544

继续深入了解,请看:

Session何时创建-原理:http://blog.csdn.net/u010002184/article/details/79416199
Session何时创建-实例:http://blog.csdn.net/u010002184/article/details/79416043

相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页