为什么会有cookie和session
http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的购物车呢,session和cookie就是一种保存上下文信息的机制。
Cookie
cookie 在web开发中是用来维系状态的一种技术,可以实现记住用户名、密码这些参数的操作,就如每次登陆页面,跳转到其他页面时还是登陆的状态,这就用到了cookie记住用户名密码这一项功能(也就是服务器要向浏览器返回cookie),它的缺点是有安全风险,因为信息是存储在浏览器端的。
创建Cookie
***服务器要向浏览器返回cookie
Cookie cookie的名字 = new Cookie(名, 值); 创建cookie对象
response.addCookie(cookie的名字); 把cookie加入到相应中,返回给浏览器
***浏览器再发送请求时,会把这些cookie值重新发送给服务器
Cookie[] cookies = request.getCookies(); 返回的是一个cookie数组,里面包含各种cookie信息
session
session也是用来维系状态的一种技术,功能和cookie差不多,也是可以用来存储用户名、密码,但是它把这些状态信息存储在服务器端,安全性要比 cookie 高很多,可以用session实现在一个浏览器保持登录状态,不需要重复登录,也可以说是自动登录。
session的应用
存储信息
HttpSession session = request.getSession(); // 拿到 session 对象
session.setAttribute("名", 值); // 存储信息
获取信息
HttpSession session = request.getSession(); // 拿到 session 对象
session.getAttribute("名"); // 返回上一次存储的值
删除信息
session.removeAttribute("名"); // 移除指定的session,返回被移除的值
session.invalidate(); // 让session失效(全部清空)
session默认生命周期
第一次调用 request.getSession() 创建 session对象,如果隔了 30 分钟没有向服务器发送请求,session 会自动失效。
如果要改变失效时间,可以在 web.xml中进行更改。
跟浏览器的关系:一个浏览器对应服务器端的一个 session 对象,他们存储的信息互不干扰
cookie 和 session的区别
1、安全性上, session的安全性高,cookie的信息存在浏览器端所以不安全
2、 存储的类型, session 存储的类型是 Object, cookie 只能存字符串(并且需要进行编码处理)
3、存储大小, session 理论上没有限制(但不建议存储太多内容), cookie 的限制:每个cookie不能超过4k,每个网站cookie 个数也有限制的
4、失效时间, session 两次请求间隔30分钟, cookie 默认关闭浏览器失效,还可以通过 maxAge 调整的更长
请求重定向与请求转发的区别
请求转发
request.getRequestDispatcher("跳转路径").forward(request, response);
请求重定向
response.sendRedirect("跳转路径");
如:重定向到 index.jsp 如果没有加/ 是相对路径
http://localhost:8080/user/index.jsp
如果加了 / ,就是相对于主机名和端口号 也就是直接在路径前加 http://localhost:8080
结论:如果路径中有多层目录,建议以 / 写一个完整路径
二者的区别:
1、 请求转发的地址不会改动,始终是刚开始的地址, 请求重定向在跳转后,地址栏会变为目标地址
2、请求转发是一次请求,跳转操作在服务器内部发生;请求重定向是两次请求,跳转操作是在浏览器与服务器之间发生
3、请求转发可以使用 request.setAttribute 进行值的传递;请求重定向需要使用 session.setAttribute 进行值的传递
问题:为何请求转发第一次不能得到保存的cookie的值,刷新后才有, 而请求重定向却可以直接获得值呢?
Cookie保存后需要在下一次请求访问服务器页面时才有效,请求转发并不改变地址,只发送一次请求(相当于没有打开你需要的那个页面,而是留在了转发时的页面),所以cookie此时无效。
请求重定向则是再次向服务器发送请求,也就是说,一个是客户端向服务器端发送的来的,一个是服务器发送到客户端的,也就是Cookie必须通过客户端向服务器发送请求时才能读取到。
解决方法:
如果用请求转发,那就用内置的request对象获得账号密码,如果你用请求重定向,才可以用cookie
重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL, 而当使用转发时,该URL会保持不变。重定向的速度比转发慢,因为浏览器还得发出一个新的请求。同时,由于重定向方式产生了一个新的请求,所以经过一次重 定向后,request内的对象将无法使用。
怎么选择是重定向还是转发呢?通常情况下转发更快,而且能保持request内的对象,所以他是第一选择。但是由于在转发之后,浏览器中URL仍然指向开始页面,此时如果重载当前页面,开始页面将会被重新调用。如果你不想看到这样的情况,则选择转发。
总结
虽然这两种都是维系状态的一种技术,但是cookie有安全风险,因为信息是存储在浏览器端的,而session把这些状态信息存储在服务器端,因此安全性要比 cookie 高很多,并且使用session可以实现自动登录,这样可以方便跳转页面时,不需要在登录页面 。