Cookie与Session的简单使用

Cookie
http协议本身是一种无状态的协议,不能进行登录验证。
Cookie是对http协议的扩展。
服务端可以在响应头中添加 Set-Cookie 字段,将cookie值发送给客户端,浏览器在收到这个响应时,会自动将cookie保存起来,下次再发送请求时,会将这个cookie附带在请求头的Cookie字段中发给服务器。
cookie是按照域名分别存储的,从A域名得到的cookie只会发送回A域名。
cookie分为临时cookie和长久cookie。如果一个cookie没有设置有效期,那么浏览器在关闭时就会删除这个cookie,这种cookie叫做临时cookie,如果cookie设置了有效期,那么浏览器会一直保存这个cookie,直到有效期为止,这种cookie叫做长久cookie。
cookie常用于存储用户的登录信息。
Cookie c = new Cookie(“username”,“john”);
设置有效期:设置时间为0,则销毁cookie
c.setMaxAge(3600);
response.addCookie©;

Cookie[] c = request.getCookies();
if(c != null)
for(int i = 0;i < c.length;i++){
if(“username”.equals(c.getName()))
out.println(c.getValue());
}

获取cookie的代码:

Cookie[] cookies = request.getCookies();

Session
cookie技术可以将信息存储在不同的浏览器中,并且可以实现多次请求下的数据共享。但是如果传输的信息比较多的情况下,使用cookie技术会增加服务器端程序处理的难度,这时我们就可以采用session技术。
session是一种将会话数据保存到服务器端的技术。
对Tomcat而言,Session是一块在服务器开辟的内存空间,其存储结构为ConcurrentHashMap;
session是一种建立在cookie之上的通信状态保留机制,可以实现在服务端存储某个用户的一些信息。

Session的简单使用

package com.java12.web.demo.session;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

@WebServlet("/sessiondemo")
public class SessionDemo extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("UTF=8");
        response.setContentType("text/html;charset=UTF-8");
        HttpSession session = request.getSession();
        session.setAttribute("data", "孤傲苍狼");
        String sessionId = session.getId();
        if (session.isNew()) {
            response.getWriter().print("session创建成功,session的id是:"+sessionId);
        }else {
            response.getWriter().print("服务器已经存在session,session的id是:"+sessionId);
        }
    }
    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

运行起来之后,第一次进去:
这里写图片描述
点击刷新页面:
这里写图片描述

程序中使用request对象的getSession()获取session,如果session不存在则创建一个新的。通过session.isNew()判断session是不是新创建的。
Session的工作原理
服务器创建session后,将session的id以cookie的形式返回给浏览器,只要浏览器不关,再去访问服务器时,就会携带着session的id,服务器发现浏览器带session的id过来,就会使用内存中与之对应的session为之服务。
这里写图片描述

Session对象的销毁
session对象默认30分钟没有使用,则服务器会自动销毁session,在web.xml文件中可以手工配置session的失效时间。



	15

也可以在程序中通过调用session.invalidate方法手动销毁Session。

HttpSession session = request.getSession();
session.invalidate();

Session和Cookie的主要区别
Cookie是把用户的数据写给用户的浏览器,而Session技术把用户的数据写到用户自己的session中。
Session是一个对象,其属性也可以是任何类型(cookie只能设置字符串)。
Session对象由服务器创建,开发人员可以调用request对象的getSession方法得到Session对象。

Session存在的问题
安全性,session劫持。
增加服务器压力,因为session是直接存储在服务器的内存中的。
session同步问题,现在一般的应用都会用到多台tomcat服务器,通过负载均衡,同一个会话有可能会被分配到不同的tomcat服务器,因此很可能出现session不一致问题。

session劫持防范
其中一个解决方案就是sessionID的值只允许cookie设置,而不是通过URL重置方式设置,同时设置cookie的httponly为true,这个属性是设置是否可通过客户端脚本访问这个设置的cookie,第一这个可以防止这个cookie被XSS读取从而引起session劫持,第二cookie设置不会像URL重置方式那么容易获取sessionID。
第二步就是在每个请求里面加上token,实现类似前面章节里面讲的防止form重复递交类似的功能,我们在每个请求里面加上一个隐藏的token,然后每次验证这个token,从而保证用户的请求都是唯一性。
还有一个解决方案就是,我们给session额外设置一个创建时间的值,一旦过了一定的时间,我们销毁这个sessionID,重新生成新的session,这样可以一定程度上防止session劫持的问题。

你可能感兴趣的:(java)