JSP_05
前言:该篇是我对许多博客发表过关于cookie和session的文章的一个个人总结,也有一些自己的理解来帮助大家理解。
这里写目录标题
一、JSP_04问题解答
1、绝对路径的使用, 仅 转发
经过不断地的尝试,仅仅只有转发无法使用绝对路径。
原因:根据转发的特点,转发是服务器行为,只在该项目目录下寻找页面。本身本来就是在自己项目下寻找,可以理解路径最前面自带 /Web
所以转发使用路径不需要写前面的/Web。其他涉及到路径的可以归类为客户端行为。
实例:需要转发到news文件夹中的index.jsp界面。路径: /news/index.jsp
二、cookies、session对象
1、cookie是由网络服务器产生保存在电脑硬盘上的TXT文本
。
浏览器将cookie以键值对(Key/value)
的形式保存到客户机的某个指定目录中。
先看看使用:
创建了cookie后利用response添加cookie,响应给浏览器,当下次访问服务器是,request携带cookie到服务器,使用 request.getCookies();得到cookie
<%
//获取提交后的表单的信息
String name=request.getParameter("uname"); //用户名
String pwd=request.getParameter("upwd"); //密码
String rememberPwd=request.getParameter("rememberPwd"); //记住密码
//说明:
//UserDao().login(String,String),看到Dao应该就非常熟悉了,这是我们写的倒包,后面会学习javabean技术
//对代码进行封装,也就是写倒包了,我们在jsp写的那些代码要搬家了,节省代码,也让代码更清晰。
//判断账号密码是否正确
if(new UserDao().login(name, pwd)){
//创建一个cookie new Cookie(key,value)
//如果保存中文,为了防止乱码,使用URLEncoder.encode(value,"编码类型")
Cookie c=new Cookie("uname",URLEncoder.encode(name,"utf-8"));
//设置cookie的寿命为七天 默认的cookie是随着回话结束而消失
c.setMaxAge(60*60*24*7);
//响应给浏览器
response.addCookie(c);
Cookie c1=null;
//判断记住密码是否为空
if(rememberPwd!=null){
c1=new Cookie("upwd",URLEncoder.encode(pwd,"utf-8"));
}else{
c1=new Cookie("upwd","");
}
c1.setMaxAge(60*60*24*7);
response.addCookie(c1);
%>
<%
String name="";
String pwd="";
//使用request对象获取cookie
Cookie []cs=request.getCookies();
if(cs!=null){
for(Cookie c:cs){
if(c.getName().equals("uname")){
//注意了:这里是解码,我们以utf-8编码类型保存到cookie中,这里使用utf-8对cookie的值进行解码
//URLEncoder 和 URLDecoder 的区别 别使用错误
name=URLDecoder.decode(c.getValue(),"utf-8");
}
if(c.getName().equals("upwd")){
pwd=URLDecoder.decode(c.getValue(),"utf-8");
}
}
}
%>
可以看看这个例子来理解:商场A、商场B、客户
说明:例子仅助于我们理解之间的关系,我们还是要结合相关专业知识来诠释。
默认的cookie在商场进行消费为一次消费,发票上的每一条信息可以想象成cookie对我们本次消费跟踪保存的信息。new CooKie(“薯片”,“10元”)、 new Cookie(“xx”,“xx”)…
首先理解一下状态
:在线,离线,通话中…
下次来商场时靠这个发票
(可以想象为cookie)商场能认出我们是哪个消费者吗?不能,但是是一个消费过的凭据。如果商场有消费活动,累计多少可以获奖,凭这些可以将每一次的消费联系起来,该客户有消费过,让消费者具有这个消费过的状态,再想想如果没有发票如何具备状态。同理本机上的浏览器可以通过cookie知道用户有浏览过。这就是cookie机制解决客户端状态方案。
B商场的发票和A商场的cookie肯定是不同的,把商场想象成服务器,客户为客户端,本次消费过程像是在浏览器中浏览操作过程。去不同商场即不同的浏览器cookie肯定不同,相互之间也不能获取cookie,防止他人窃取。为什么不能获取可以百度学习。
注意:没有设置过期时间的cookie被称为会话cookie,只保存在客户端内存中,随着会话结束即销毁。设置了过期时间的cookie会保存在硬盘中,未到时间之前,打开浏览器这些cookie任然有效。
在浏览器与WEB服务器之间是使用HTTP协议
进行通信的,HTTP是无状态
的。用户的每进行一次请求就建立一次简单的连接,响应后关闭连接。请求和响应就像一次问答,会话就是一次通话不停的问答。无状态就像这次通话没有任何相关记录。然而我们的cookie就是为了解决这个问题。即用户在浏览器中的请求cookie都可以进行保存,至于保存哪些信息在于程序的设计。有了会话记录后,cookie的作用就凸显而出。
作用:(来着摘抄,在文章最后面我会放置摘抄网址)
(1)、Cookie能使站点跟踪特定访问者的访问次数、最后访问时间和访问者进入站点的路径
(2)、Cookie能告诉在线广告商广告被点击的次数,从而可以更精确的投放广告
(3)、Cookie有效期限未到时,Cookie能使用户在不键入密码和用户名的情况下进入曾经浏览过的一些站 点
(4)、Cookie能帮助站点统计用户个人资料以实现各种各样的个性化服务,其实,cookie的作用就是为了解决HTTP协议无状态的缺陷所作的努力.
2、cookie的坏处
cookie是以明文
的形式进行保存的,一些重要信息也保存的话,cookie是会被别人盗走的,对用户的危害极大。我们可以使用不可逆的加密算法
将密码加密后再保存。别人盗取后也很难获得原数据。我们会使用cookie制作一个七天免登陆
功能,这里就使用到了cookie,我们的程序最终都是使用cookie的信息进行验证来实现免登录,别人虽然拿到加密后的cookie无法获取原密码但是还是能登录进去,这个解决方法到目前为止我还是没能想出,如果有人有解决方案希望能够分享,谢谢。
3、session是一个内置对象,在服务器中。
用户每一次请求都会带着cookie过去,服务器从cookie中找是否有保存sessionID
的cookie,若没有,就为之创建一个session并生成sessionID保存。当我们关闭了浏览器再次打开时变成了一个新的sessionID
,也就是创建了一个新的session对象。之前的是否还存在呢?在,session对象在服务器中占用内存
,所以服务器为session设置了失效时间,到点清理。我们浏览一些网站时,就放在那一段时间,回来刷新一下就出现了请重新登录,也就是之前的session时间到了。
a.jsp界面有代码session.getAttribute(“username”),当用户访问a界面时,服务器加载a.jsp该拿哪一个session取值呢?请求携带过来的保存sessionID的cookie就起作用了。
这样客户端和服务器就建立了一个联系,服务器可以识别客户端了。
4、cookie的路径设置和session的使用
可以通过setPath("")
来设置cookie的路径,为什么要设置路径呢?
该路径 /项目名/news/a/b 从左至右不断减小,我们的cookie只能小取大。访问路径为 /项目名/news/a/b
,比当前访问路径范围要大的cookie会加载到request对象中。所以在b中request.getcookies()能拿到路径为/项目名/news/a 、/项目名/news的cookie
的cookie。 根据自己的项目需求来设置cookie的路径。
这张图很明显
session
是占用服务器内存的,如果保存的信息过多是会加重服务器的压力的,又因session在整个项目中都能取到,所以一般用来保存用户的基本信息即可(据目前学习的知识点而言)。
<%
//设置session,键值对形式 值可以为任何类型 该处的u是一个对象
session.setAttribute("user", u);
//取值 创建一个对象接收 根据我们的项目需求来使用
session.getAttribute("user");
%>
session在服务器保存时间默认为30min,如果到时间就清除,则session.getAttribute("")拿到null。所以可以写一个jsp来判断,如果session消失需要用户重新登录。
<%--用来做验证的jsp文件 yz.jsp --%>
<%
if(session.getAttribute("user")==null){
out.print("<script>alert('请登录');location.href='/Web_01/login.jsp'</script>");
}
%>
<%@include file="../yz.jsp"%>
//在使用include指令加载yz.jsp写到哪个页面上,哪个页面就包含了该jsp,
//页面加载也会加载这个,以判断session是否被清除,再让用户重新登录。
//file="" 路径以写在哪个jsp界面为主。
cookie作用摘要的文章找不到了,希望原作能够原谅。
总结:对cookie和session的介绍的文章非常多,万变不离其宗。多看,多想,多问,再敲敲试试。效果会很明显。祝大家工作顺利!学业有成!