JavaWeb——JSP_05学习笔记

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的介绍的文章非常多,万变不离其宗。多看,多想,多问,再敲敲试试。效果会很明显。祝大家工作顺利!学业有成!

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小张同学_java

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值