Cookie&Session
1 Cookie
1 什么是Cookie?
- Cookie是servlet发送给浏览器保存键值对的一种技术。
- 每个Cookie的大小限定在4kb中。
- 客户端有了Cookie后,每次请求都会发送给服务器。
2 cookie的基本操作
1 如何创建Cookie对象
1)图解
2)代码实现:
protected void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie1 = new Cookie("key1","value1");
response.addCookie(cookie1);
Cookie cookie2 = new Cookie("key2","value2");
response.addCookie(cookie2);
Cookie cookie3 = new Cookie("key3","value3");
response.addCookie(cookie3);
response.getWriter().write("cookie创建成功");
}
2 服务端如何获取Cookie
代码实现:
//获取cookie
protected void getCookies(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
Cookie key1 = CookieUtils.findCookie("key1", cookies);
System.out.println(key1);
response.getWriter().write(key1.getName()+"=="+key1.getValue()+"<br />");
}
//CookieUtils的实现
public class CookieUtils {
public static Cookie findCookie(String name,Cookie[] cookies){
if (name==null||cookies==null||cookies.length==0){
return null;
}
for (Cookie cookie :
cookies) {
if (name.equals(cookie.getName())){
return cookie;
}
}
return null;
}
}
3 如何修改Cookie的值
方案一:
- 创建一个与要修改的同名的Cookie对象。
- 在构造器中,同时赋予新的Cookie值。
- 调用response.addCookie(cookie)让客户端保存cookie。
protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie3 = new Cookie("key1","valueReplace");
response.addCookie(cookie3);
response.getWriter().write("cookie修改成功");
}
方案二:
- 遍历找到需要修改的Cookie对象。
- 调用setValue方法赋予新的Cookie值。
- 调用response.addCookie()来通知客户端保存修改。
protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
Cookie key1 = CookieUtils.findCookie("key1", cookies);
if (key1!=null){
key1.setValue("replaceValue");
response.addCookie(key1);
}
}
注意:该方案修改Cookie的值,不可以包含空格,方括号,圆括号,等号,逗号等,如果需要使用这些符号,应先对其进行base64编码。
3 Cookie的生命周期
setMaxAge();设置cookie的最大生存时间,单位是秒。
- 正数:指定的秒数后删除。
- 负数:浏览器一关闭,cookie就被删除(默认-1)。
- 0:表示马上删除cookie
protected void defaultLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("keyn","valuen");
//设置存活时间:浏览器关闭则销毁
cookie.setMaxAge(-1);
response.addCookie(cookie);
}
protected void zeroLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
Cookie key1 = CookieUtils.findCookie("key1", cookies);
//设置存活时间:立即删除
key1.setMaxAge(0);
response.addCookie(key1);
}
protected void timeLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie[] cookies = request.getCookies();
Cookie key1 = CookieUtils.findCookie("key2", cookies);
//设置存活时间:一个小时
key1.setMaxAge(60*60);
response.addCookie(key1);
}
4 Cookie有效路径Path的设置
作用:可以用来有效地过滤哪些Cookie可以发送给服务器,哪些不发送。path属性通过请求的地址来进行有效的过滤。
- CookieA path=/工程路径
- CookieB path=/工程路径/abc
请求地址如下:
- http://ip:port/工程路径/a.html
- CookieA 发送
- CookieB 不发送
- http://ip:port/工程路径/abc/a.html
- CookieA 发送
- CookieB 发送
注意:如果不设置cookie,则默认路径为项目下。
5 免用户名登陆实现
前端代码实现:
用户名: | |
密码: | |
后台代码实现:
protected void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("admin".equals(username)&&"admin".equals(password)){
Cookie username1 = new Cookie("username", username);
username1.setMaxAge(60*60*24*7);
response.addCookie(username1);
Cookie password1 = new Cookie("password", password);
password1.setMaxAge(60*60*24*7);
response.addCookie(password1);
System.out.println("登陆成功!!!");
}else {
System.out.println("登陆失败!!!");
}
}
2.Session会话
1 什么是Session会话?
- session是一个接口(HttpSession)。
- session就是会话,用来维护一个客户端和服务器关联的一种技术。
- 每个客户端都有自己的一个Session会话。
- Session我们经常用来保存用户登陆之后的信息。
注意:cookie是在客户端,session则是在服务器端。
2 如何创建Session和获取
-
获取和创建Session
request.getSession():第一次调用是创建,之后是获取。为了得知当前Session是新创建的还是以前创建的,可以使用isNew()来进行判断。
注意:每个会话都有一个SessionId,而且id值是唯一的。使用getId()来获取Session的id。
3 Session域对象
- request.getSession().setAttribute(“key1”,“value1”);
- Object key1 = request.getSession().getAttribute(“key1”);
- response.getWriter().write(“从Session中获取的值为:”+key1);
4 Session的生命周期
-
public void setMaxInactiveInterval(int interval):设置 Session 的超时时间(以秒为单位),超过指定的时长,Session就会被销毁。
- 值为正数时,设定Session的超时时长。
- 值为负数,表示用不超时(极少使用)。
-
public int getMaxInactiveInterval():获取 Session 的超时时间
-
public void invalidate():让当前 Session 会话无效,然后解除绑定到他的任何对象。
注意:因为在Tomcat服务器的配置文件web.xml中默认有以下的配置,它就表示配置了当前Tomcat服务器下所有的Session超时配置默认时长为:30 分钟。
30
我们可以通过自己web.xml文件来修改所有的Session默认时长。使用上面的API可以用来设置个别Session的时长。
protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//session立即无效
session.invalidate();
response.getWriter().write("当前session立即无效:"+session.getMaxInactiveInterval());
}
protected void life3(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//设置该session3秒后超时
session.setMaxInactiveInterval(3);
//session立即无效
session.invalidate();
response.getWriter().write("当前session已经设置为3s后超时:"+session.getMaxInactiveInterval());
}
protected void defaultLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
//1800s==30分钟
response.getWriter().write("默认的超时时长为:"+session.getMaxInactiveInterval());
}
5 浏览器和Session之间关联的技术内幕
拓展
1 cookie的区别
都是为了解决http的无状态的特性的。
区别:
- cookie是保存在客户端,session保存在服务器端。
- 默认情况下:cookie在浏览器关闭的时候被销毁,session的默认生命时间是30分钟。
2 Base64编码
package com.atguigu.test;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.IOException;
public class Base64Test {
public static void main(String[] args) throws IOException {
String content="这是base64编码的内容";
//创建一个Base64的编码器
BASE64Encoder base64Encoder = new BASE64Encoder();
//执行base64的编码操作
String encode = base64Encoder.encode(content.getBytes());
//6L+Z5pivYmFzZTY057yW56CB55qE5YaF5a65
System.out.println("编码之后:"+encode);
//创建base64解码器
BASE64Decoder base64Decoder = new BASE64Decoder();
//执行解码操作
byte[] bytes = base64Decoder.decodeBuffer(encode);
String decode = new String(bytes,"utf-8");
System.out.println("译码之后:"+decode);
}
}