sessioncookie之会话笔记.docx
《sessioncookie之会话笔记.docx》由会员分享,可在线阅读,更多相关《sessioncookie之会话笔记.docx(23页珍藏版)》请在冰豆网上搜索。
sessioncookie之会话笔记
会话:
1:
会话跟踪技术Session/验证验证码/限止重复提交/实现购物车
2:
Cookie/记录用户名/实现自动登录/
3:
Session与Cookie的关系
3:
隐藏表单
4:
重写url
5:
再讲JSP/指令/动作/
6:
EL表达式
会话的四种技术:
Session
Cookie
隐藏表单
重写url
1:
会话技术之cookie
特点:
1:
由Servlet创建–》Cookiec=newCookie(…);
2:
Servlet将cookie发送给浏览器。
即保存到客户端的。
3:
由浏览器保存这个cookie.
4:
浏览再次访问这个Servlet/或是其他允许的Servletr时,再带这个Cookie去访问服务器。
Cookie的四大属性:
1:
nameandvalue->用于保存一些数据。
2:
maxAge最大的生命周期–》默认的值为-1,即保存到浏览器的缓存中。
-1:
默认值。
0:
删除保存的cookie
+N:
保存多少秒,保存到浏览缓存的目录下。
3:
domain–域–》在某些网上,跨域访问就可以设置值,
Domain=
由这个cookie:
4:
path用于权限控制的。
类似于package。
1:
保存cookie的基本示例
publicclassOneServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
//1:
声明Cookie,必须要声明时,设置name,value
Randomr=newRandom();
inta=r.nextInt(100);
//创建cookie
Cookiecookie=newCookie("addr","Random_is_"+a);
//通知浏览器来保存cookie,以下的方法,会形成一个响应头:
set-cookie:
addr=Random_is_3
//浏览器接收到这种头以后,就会保存这个cookie到浏览器的缓存(内存)中
response.addCookie(cookie);
}
}
查看运行时的http请求+响应协议:
以下是第一次发出请求时的请示协议:
(请注意,里面没有cookie信息)
以下是第一次响应协议:
请注意,每一次访问OneServlet,都会产生一个新的随机值,保存到cookie中去,再做resp.addCookie(…);
以下是第二次访问这个Servlet的请示协议:
由于浏览器的缓存即内存中,保存了cookie,所以,再次访问这个servlet,浏览器会以请求头的形式,将这个cookie带到服务器上去:
第二次的响应协议:
由于再次创建一个cookie所以,会重新生成一个cookie让浏览器保存,随机值是新的:
此时,由于cookie的所有信息,与之前的cookie一样,所以,后面的cookie会覆盖之前的cookie:
关闭浏览器以后:
发现,没有带cookie去,
因为cookie的默认的maxAge=-1,即只保存到浏览器的缓存中。
如果你关闭了浏览器这个程序,则浏览器就释放了所使用的存,所以再次访问cookie就没有了。
cookie中保存中文(需要编解码URLencoder.encode、URLdecode.decode)
Cookie中不能保存中文,空格。
如果要保存中文或是空格,则必须要进行url编码。
如果在cookie中保存中文:
进行编码:
Stringval="山东济南你好这是我的家";
val=URLEncoder.encode(val,"UTF-8");
Cookiec=newCookie("addr",val);
c.setPath("/");
response.addCookie(c);
如果你保存cookie时进行了编码,则在取cookie的值时,必须转码:
val=c.getValue();
val=URLDecoder.decode(val,"UTF-8");
maxage=c.getMaxAge();//-1
path=c.getPath();//null
domain=c.getDomain();//null
2:
设置cookie的生命周期
void
setMaxAge(intexpiry)
Setsthemaximumageofthecookieinseconds.
Randomr=newRandom();
inta=r.nextInt(100);
//创建cookie
Cookiecookie=newCookie("addr","Random_is_"+a);
//设置cookie的生命周期,以秒为单位
cookie.setMaxAge(60*60*24*7);
//通知浏览器来保存cookie,以下的方法,会形成一个响应头:
set-cookie:
addr=Random_is_3
//浏览器接收到这种头以后,就会保存这个cookie到浏览器的缓存(内存)中
response.addCookie(cookie);
以下是在设置maxAge以后的请求+响应的协议:
以下是设置了maxAge以后的响应的协议:
HTTP/1.1200OK
Server:
Apache-Coyote/1.1
Set-Cookie:
addr=Random_is_6;Expires=Mon,27-Jul-201501:
06:
00GMT-如果有生命周期,则一定会保存到文件中。
但同时会先保存到缓存中
Content-Length:
0
Date:
Mon,20Jul201501:
06:
00GMT
也可以查看,浏览器保存的cookie文件:
3:
删除cookie
设置maxAge=0
当设置Cookie.setMaxAge(0);以后,响应的头是:
(这个原则,就是设置了一个过去的时间)
HTTP/1.1200OK
Server:
Apache-Coyote/1.1
Set-Cookie:
addr=Random_is_14;Expires=Thu,01-Jan-197000:
00:
10GMT
Content-Length:
0
Date:
Mon,20Jul201501:
15:
28GMT
4:
读取cookie
读取cookie是request的工作:
Cookie[]
getCookies()
ReturnsanarraycontainingalloftheCookieobjectstheclientsentwiththisrequest.
读取所有这个项目/20150720保存的cookie.
实现一个功能:
1:
如果没有名称叫name的cookie就保存一个新的cookie.
2:
如果有名称为name的cookie,如果它的值是Jack就修改成rose.
3:
如果有名称为name的cookie,且名称为rose,就删除这个cookie.
//1:
读取所有cookie
Cookie[]cs=request.getCookies();
Cookiecookie=null;
if(cs!
=null){
//遍历找有没有名称叫name的cookie
for(Cookiec:
cs){
if(c.getName().equals("name")){
cookie=c;
break;
}
}
}
if(cookie==null){//没有找到名称叫name的coooke
cookie=newCookie("name","Jack");
cookie.setMaxAge(60*30);//分钟
response.addCookie(cookie);
}else{
//判断名称是否是Jack
if(cookie.getValue().equals("Jack")){
//修改名称
cookie.setValue("Rose");
response.addCookie(cookie);//修改以后,必须要通知浏览器保存
}else{
cookie.setMaxAge(0);//删除cookie
response.addCookie(cookie);
}
}
}
5:
cookie的path属性
void
setPath(java.lang.Stringuri)
Specifiesapathforthecookietowhichtheclientshouldreturnthecookie.
Path默认值:
保存cookie的servlet的url目录:
如:
http:
//localhost:
8080/20150720/one->/20150720
http:
//localhost:
8080/20150720/abc/one->/20150720/abc
path的功能,就是权限:
path为/20150720/abc的cookie这个/20150720/two目录下的serlvet读取不到。
及不在/abc下的,都读取不到。
如果某个cookie的path是/20150720/xy则只有/20150720/xy这样的目录结构,才可以访问这个cookie./
如果/20150720/index.jsp
所以说,如果你想设置一个cookie让所有本项目中的资源(JSP/servlet/html)都可以读到这个cookie则可以手工的设置
Path=
Cookiec=newCookie("mail","wj@");
c.setPath(request.getContextPath());
对于一个cookie来说,
必须要name,path,domain三者一样,才叫同一个cookie:
刚才保存了一个cookie:
Cookiec=newCookie(“mail”,wj@:
”_);
c.setPath(“/20150720/xy”);
与下面的cookie完全不是一个:
Cookiec=newCookie(“mail”,wj@:
”_);
c.setPath(“/20150720”);
对于path来说,你保存的可以是任意的值,但你读取cooke.getpath():
永远返回的是nuull.
当设置了path以后:
HTTP/1.1200OK
Server:
Apache-Coyote/1.1
Set-Cookie:
mail="wj@";Version=1;Path=/20150720
Content-Length:
0
Date:
Mon,20Jul201502:
00:
16GMT
还可以设置
path=/所有的tomcat中的项目,都可以读取到这个cookie
与domain=共同使用可以在多个域名中访问同一个Cookie.
Path=/20150720所有这个项目中的资源都可以读取到这个cookie.
domain–跨域读取cookie示例
在上保存一个cookie
要求:
上可以访问到这个cookie.
设置两个:
Path=/
Domain=
Cookiec=newCookie("addr","SDJN");
c.setPath("/");
c.setDomain("");
response.addCookie(c);
步1:
创建两个域名
/a"
unpackWARs="true"autoDeploy="true"/>
/b"
unpackWARs="true"autoDeploy="true"/>
步2:
修改hosts文件
192.168.1.68
127.0.0.1
步3:
创建两个目录
6:
Cookie的功能
1:
记录浏览记录。
2:
记录用户的登录名称。
1:
实现记录用户登录名称的功能
1:
使用java代码的实现
if(user!
=null){
HttpSessions=request.getSession();
s.setAttribute("user",user);
//在登录成功以后,记录用户名称到cookie
Cookiec=newCookie("loginName",URLEncoder.encode(user.getName(),"UTF-8"));
c.setPath("/");
c.setMaxAge(60*60*24*30);
response.addCookie(c);
response.sendRedirect(request.getContextPath()+"/stud");
}else{
在显示页面时读取cookie:
Cookie[]cs=request.getCookies();
Stringname="";
if(cs!
=null){
for(Cookiec:
cs){
if(c.getName().equals("loginName")){
name=c.getValue();
name=URLDecoder.decode(name,"UTF-8");
break;
}
}
}
2:
使用js代码实现
保存:
function_login(){
varnm=document.getElementsByName("name")[0].value;
vardate=newDate();
vartime=date.getTime()+(1000*60*60*24*7);
date=newDate(time);
document.cookie="userName="+escape(nm)+";expires="+date.toGMTString();
document.forms[0].submit();
}
读取:
functionread(){
varcs=document.cookie;//JSESSIONID=0B6391A4C552D5EF6BB8300F6304DE7C;userName=Alex
cs=cs.split(";");
for(vari=0;ivarc=cs[i];
varc=c.split("=");
if(c[0]=="userName"){
varv=c[1];
v=unescape(v);
document.getElementsByName("name")[0].value=v;
break;
}
}
}
read();
cookie的限制:
Thebrowserisexpectedtosupport80cookiesforeachWebserver,Ncookiestotal,andmaylimitcookiesizeto8KBeach.
2:
cookie与Session的关系
区别:
Cookie:
保存在客户端的。
由浏览器维护。
生命周期三个:
-1(默认,只保存在浏览器缓存),0(),+n
Session:
保存在服务器上的。
由服务器来维护。
生命周期,默认为30分钟
联系:
服务器通过名称为JSESSIONID的cookie获取到服务器的上的 Session。
第一次创建Session时返回的响应头
HTTP/1.1200OK
Server:
Apache-Coyote/1.1
Set-Cookie:
JSESSIONID=155A867822972F81E57878763CFDAB85;Path=/201507202/;HttpOnly
Content-Length:
0
Date:
Mon,20Jul201505:
54:
53GMT
以下是自己获取到的SessionID:
HttpSessions=request.getSession();
System.err.println(s.getId());
155A867822972F81E57878763CFDAB85
再次访问服务器时:
request头带有cookie信息:
GET/201507202/oneHTTP/1.1
Accept:
text/html,application/xhtml+xml,*/*
Accept-Language:
en,zh-CN;q=0.5
User-Agent:
Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;WOW64;Trident/5.0)
Accept-Encoding:
gzip,deflate
Host:
localhost:
8080
Connection:
Keep-Alive
Cookie:
JSESSIONID=155A867822972F81E57878763CFDAB85
1:
示例
关闭浏览器以后,还可以获取服务器上的Session
保存一个Cookie也叫JSESSIONID=ID
publicclassOneServletextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{
HttpSessions=request.getSession();
if(s.getAttribute("random")==null){
Randomr=newRandom();
inta=r.nextInt(100);
System.err.println("创建随机值:
"+request.getRemoteAddr()+","+a);
s.setAttribute("random",request.getRemoteAddr()+"创建的随机值是:
"+a);
//保存一个与系统重名的cookie
Cookiec=newCookie("JSESSIONID",s.getId());
c.setMaxAge(60*30);
c.setPath(request.getContextPath());
response.addCookie(c);
}
response.setContentType("text/html;charset=UTF-8");
response.getWriter().print(s.getAttribute("random"));
}
3:
实现自动登录
思想:
1:
页面给出一个是否自动登录的checkbox.
2:
如果用户选择了checkbox则保存一个cookie。
就是在里,保存用户名和密码。
如果直接将用户名的密码,保存到coookie中去,很不安全。
所以,应该将用户名的密码,进行md5以后,再保存到cookie中去。
(略)
3:
打开登录页面时,检查是否保存了某个cookie.如果有,则获取cookie中的值,去查询数据库,是否正在。
如果正确,就
将用户的信息放到session中去。
1:
开发一个checkbox
<%
if(session.getAttribute("user")==null){
%>
Name:
pwd:
type="text"name="pwd">
自动登录value="1"name="auto">
value="登录">
<%
}else{
%>
你好,你已经登录了.退出
<%
}
%>
2:
开发登录的实现
protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException{
Stringname=request.getParameter("name");
Stringpwd=request.getParameter("pwd");
if(name!
=null&&name.length()>=3){
request.getSession().setAttribute("user",name);
//检查是否用户选择了checkbox
Stringauto=request.getPar