0x00前言

1.会话:一次会话中包含了多次请求和响应
2.功能:一次会话的范围内的多次请求间,共享数据
3.方式:
(1)客户端会话技术:cookie
(2)服务端会话技术:Session

0x01Cookie技术

0x1基础方法

response.addCookie(cookie);向客户端发送Cookie
String name = c.getName();获取客户端发来的Cookie的键值对
String value = c.getValue();
Cookie[] cookies = request.getCookies();客户端访问的Cookie提取
cookie.setMaxAge(120);//把Cookie持久化到硬盘存货时间为120秒后自动删除

setMaxage(int i)

正数:将Cookie数据写到硬盘的文件中。持久化存储。并指定cookie存活时间,时间到后,cookie文件自动失效
负数:默认值
零:删除cookie信息
cookie.setPath("/");  //设置共享

尝试的代码

@WebServlet(name = "ServletCookie1", value = "/ServletCookie1")
public class ServletCookie1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建cookie对象
        Cookie cookie = new Cookie("msg", "hellow");
        cookie.setMaxAge(120);
        cookie.setPath("/");  //设置共享
        response.addCookie(cookie);


    }
}

获取Cookie代码

@WebServlet(name = "ServletCookie2", value = "/ServletCookie2")
public class ServletCookie2 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
        if (cookies!=null){
            for (Cookie c:cookies){
                String name = c.getName();
                String value = c.getValue();
                System.out.println(name+":"+value);
            }
        }

    }
}

Cookie的特点和作用

1.特点:Cookie存在客户端浏览器
浏览器对于单个Cookie的大小有限制(4kb)已经对同一个域名下面的总Cookie有限制(20个)
2.作用:Cookie一般用于存储少量的敏感数据
在不登录的情况下,完成服务器对客户端身份的识别
基于时间的Cookie判断

@WebServlet(name = "ServletCookie3", value = "/ServletCookie3")
public class ServletCookie3 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);

    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        Cookie[] cookies = request.getCookies();
        ServletContext servletContext = this.getServletContext();
        response.setContentType("text/html;charset=utf-8");



        if (cookies!=null){
            for (Cookie cookie:cookies){
                String name = cookie.getName();
                if ("lasttime".equals(name)){
                    String value = cookie.getValue();
                    Date date = new Date();
                    cookie.setMaxAge(60*60*24*30);
                    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                    String format = simpleDateFormat.format(date);
                    String encode = URLEncoder.encode(format, "utf-8");
                    cookie.setValue(encode);
                    response.addCookie(cookie);
                    String value1 = cookie.getValue();
                    response.getWriter().write("欢迎回来");
                    break;
                }
            }

        }
        if (cookies==null|| equals(cookies[0].getName()!="lasttime")){
            Date date = new Date();
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String format = simpleDateFormat.format(date);
            String encode = URLEncoder.encode(format, "utf-8");
            Cookie cookie = new Cookie("lasttime",encode);
            cookie.setMaxAge(60*60*24*30);
            response.addCookie(cookie);
            response.getWriter().write("欢迎您第一次访问");}

    }
}

0x02Session技术

1.概念:服务器端会话技术,在一次会话间共享数据,将数据保存在服务器端对象中.HttpSession
2.Session是依赖于Cookie的
3:。Session方法

 request.getSession()     :获取session对象
 
 
 session方法:
 
 Object getAttribute(String name)  
		void setAttribute(String name, Object value)
		void removeAttribute(String name)  
 

细节:
当客户端关闭以后,服务器关闭,两次获取的Seesion是不同的。

原因:在第一次获取session的时候,服务器会自动在内存中创建一个session对象,并把session的id即JSESSIONID通过cookie的形式返回给客户端
客户端在后续访问的时候,都会带着该cookie即JSESSIONID,来访问服务端,服务端根据该id找到对应的session对象,以此来保证一次会话内的多次请求找的都是同一个session
如果客户端关闭的话代表着会话结束了,cookie就不会再携带JESSIONID
 HttpSession session = request.getSession();
        System.out.println(session);
        Cookie cookie = new Cookie("JSEESSIONID",session.getId());
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
可以通过在这种给Cookie设置值和延长Cookie的时间去达到这个效果。

客户端不关闭,服务器关闭,两次获取的Seesion是不是一个值
默认的时候不是一个值,但是Tomact会实现Session的钝化和活化,就是序列化和反序列化
如果服务端重启后客户端没关如果Session发生改变的化会导致数据丢失,所有就会出现钝化和活化
钝化:把Session序列化到硬盘上,服务器启动以后将Session文件转化成session对象

0x03总结

Cookied的设置会造成XSS攻击,所以出现了防御机制HttpOnly标志(可选),客户端脚本将无法访问cookie(如果浏览器支持该标志的话)。因此即使客户端存在跨站点脚本(XSS)漏洞,浏览器也不会将Cookie透露给第三方。Cookie和Session后面还会设计到xss和csrf漏洞的利用,还有Cookie注入。

内容来源于网络如有侵权请私信删除

文章来源: 博客园

原文链接: https://www.cnblogs.com/0x3e-time/p/16282419.html

你还没有登录,请先登录注册
  • 还没有人评论,欢迎说说您的想法!