JavaWeb中Cookie和Session的讲解
Posted ascto
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaWeb中Cookie和Session的讲解相关的知识,希望对你有一定的参考价值。
Cookie
什么是cookie?
cookie是服务器通知客户端保存键值对的一种技术。客户端有了cookie之后,每次
请求都发送给服务器。每个cookie的大小不可以超过4kb
如何创建cookie?
package servlet;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class CookieServlet extends BaseServlet
protected void createCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
//1.创建cookie对象
Cookie cookie=new Cookie("key1","value1");
//2.通知客户端保存Cookie
resp.addCookie(cookie);
resp.getWriter().write("Cookie创建成功");
服务器如何获取cookie呢?
服务器获取客户端的cookie只需要一行代码:req.getCookies():Cookie[]
protected void getCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
Cookie[] cookies= req.getCookies();
for (Cookie cookie : cookies)
//名=值
resp.getWriter().write("cookie["+cookie.getName()+"="+cookie.getValue()+" ] <br/>" );
Cookie iWantCookie=null;
for (Cookie cookie : cookies)
if ("key1".equals(cookie.getName()))
iWantCookie=cookie;
break;
//如果不等于null,说明赋值过,找到了指定的cookie
if (iWantCookie!=null)
resp.getWriter().write("找到了需要的cookie");
如何修改cookie的值?
方案一:
1.先创建一个要修改的同名的cookie对象
2.在构造器中同时赋予新的cookie值
3.调用response.addCookie(Cookie);
protected void updateCookie(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
// 1.先创建一个要修改的同名的cookie对象,在构造器中同时赋予新的cookie值
Cookie cookie=new Cookie("key1","newValue1");
// 3.调用response.addCookie(Cookie);
resp.addCookie(cookie);
resp.getWriter().write("值修改了");
方案二:
1.先查询到需要修改的cookie对象。
2.调用setValue()方法赋予新的Cookie值。
3.调用response.addCookie()通知客户端保存修改
Cookie cookie=CookieUtils.findCookie("key1",req.getCookies());
if (cookie!=null)
cookie.setValue("new2Value");
resp.addCookie(cookie);
对于Version 0 cookie,值不应包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at符号、冒号和分号。空值
在所有浏览器上的行为不一定相同。
cookie的生命控制:
cookie的生命控制指的是如何管理cookie什么时候被销毁(删除)
用到的方法setMaxAge();(设置cookie的最大生存时间)正数表示在指定秒数后过期。负数(默认)表示浏览器关闭就会删除。0表示马上删除cookie。
protected void life3600(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
Cookie cookie=new Cookie("life3600","life3600");
cookie.setMaxAge(60*60);//设置cookie一小时后被删除,无效
resp.addCookie(cookie);
resp.getWriter().write("创建了一个存活一小时的cookie");
cookie有效路径Path的设置
Cookie的path属性可以有效的过滤哪写cookie可以发送给服务器,哪写不发。
path属性是通过请求的地址来进行有效的过滤
Cookie A path =/工程路径
Cookie B path =/工程路径/abc
请求地址如下:http://ip:port/工程路径/a.html
这个情况下Cookie A 发送 而 B不发送
http://ip:port/工程路径/abc/a.html
这个情况下 A B都发送
protected void testPath(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
Cookie cookie=new Cookie("path1","path1");
//getContextPath得到工程路径
cookie.setPath(req.getContextPath()+"/abc");//==>/工程路径/abc
resp.addCookie(cookie);
resp.getWriter().write("创建了一个带有path的cookie");
Session
什么是session?
session就是一个接口(HttpSession),Session就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
每个客户端都有自己的一个Session会话。Session会话中,我们经常用来保护用户登录之后的信息。
如何创建Session和获取(id号,是否为新)
如何创建和获取session?
他们的API都是一样的:request.getSession()
第一次调用是:创建Session会话,之后调用都是:获取前面创建好的Session会话对象。
isNew();判断到底是不是刚创建出来的(新的)。true表示刚创建。false表示获取之前创建。
每个会话都有一个唯一的id。getId得到Session的会话id
protected void createOrGetSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
//创建和获取session会话对象
HttpSession session=req.getSession();
//判断当前Session会话,是否是新创建出来的
boolean isNew=session.isNew();
//获取唯一标识id
String id= session.getId();
resp.getWriter().write("得到的session的id是"+"<br/>"+id+"<br/>");
resp.getWriter().write("这个session是否是新创建的"+isNew +"<br/>");
Session域数据的存取
/*往session中保存数据*/
protected void setAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
req.getSession().setAttribute("key1","value1");
/*获取session域中数据*/
protected void getAttribute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
Object attribute= req.getSession().getAttribute("key1");
resp.getWriter().write("从session中获取出key1的数据是:"+attribute);
Session生命周期控制
public void setMaxInactiveInterval(int interval)
设置session的超时时间(以秒为单位)超过指定的时长session就会被销毁。
public int getMaxInactiveInterval()
获取Session的超时时间
Session默认的超时时长是多少?
protected void defaultLive(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
//获取session默认超时时长
int maxInactiveInterval= req.getSession().getMaxInactiveInterval();
resp.getWriter().write("默认超时时长为"+maxInactiveInterval+"秒");
打印结果显示为1800s
如果你希望你的web工程,默认的session的超时时长为其他时长。你可以在你自己的web.xml配置文件中做配置,就可以修改。
<session-config><session-timeout>20<session-timeout><session-config>
表示默认是20分钟
如果你想只修改个别的session超时时长。就可以使用上面的API。setMaxInactiveInterval(int interval)来进行单独的设置。
session超时的概念介绍:
值为正数时为超时时长,负数表示永不超时。
如何设置马上超时?public void invalidate()
让当前session对话马上超时,无效。
浏览器和Session之间关联的技术内幕
以上是关于JavaWeb中Cookie和Session的讲解的主要内容,如果未能解决你的问题,请参考以下文章