JAVA企业级开发-session,cookie(13)
一、 jsp
jsp: java server pager .java动态生成网页的一门技术
使用servlet生成网页时候遇到的问题,为什么使用jsp?
在servlet里面书写html,并且需要java代码输出。
1、(页面)开发人员想要书写html需要非常熟悉java
2、不便于页面的维护和调试。----当你页面进行扩展的时候,修改java,需要编译,运行。
3、很难使用网页设计工具进行页面设计。需要使用html导入到servlet中,并且使用printWriter进行输出。
4、对于java程序员说。拼接html。页面代码混乱。
sun公司为了解决这样的问题:提出一门技术。jsp。
1. jsp快速入门
注意事项:
1、jsp是一个类似于html的一个页面。 jsp直接存放到webroot目录下,和html一样
访问jsp的时候,也和访问html一样
2、jsp的默认编码集是iso-8859-1修改jsp的默认编码
3、访问jsp就和访问html一样。
http://localhost:8080/应用名/jsp在服务器中具体路径
2. jsp简介
jsp是什么?
jsp是(Java Server Pages):java服务器页面。基本上告别html,写jsp。jsp中书写的html代码。
是sun公司设计的一种动态网页技术。html代码的内容可以变化。
servlet 尽可能不要去书写html代码
jsp 尽可能不要去书写java代码
3. jsp的运行原理
jsp实质是就是一个servlet。
客户端访问服务器的jsp文件,服务器(tomcat)会读取jsp 的内容,将其翻译为一个servlet(web服务器把jsp翻译成servlet),(jsp就是一个servlet)。执行jsp的过程实际上是执行servlet的过程,返回给客户端的页面是由servlet的程序生成的。
jsp的翻译过程:
jsp执行过程
4.jsp三种脚本元素---jsp内书写java代码
jsp外光上看起来和html没有区别。
jsp中可以书写java代码。
1、<%! java代码 %> 声明脚本。只能书写声明语句。
可以定义成员方法,成员属性(全局变量) 内部类
成员变量,成员方法,内部类,注意叹号和百分号不能分开。
如果定义一个变量, 翻译成 全局变量 成员变量
如果定义一个方法,翻译成全局方法,成员方法
如果定义一个类,,翻译成内部类
2、<%=表达式 %> 表达式,输出表达式的值,到html源代码中。会被翻译成servcie方法中 out.print()(service方法中)
out 是jsp的一个内置对象,用于生成html的源代码
注意:表达式不要以分号结尾。
3、<% java代码 %>jsp程序脚本代码,可以嵌入任意java语句
把java代码一如到serivce方法中。在方法中可以书写什么,在脚本代码就可以书写什么
如果在java代码片段中定义一个变量,这个变量是,service方法内部的局部变量。
注意点:表达式中不能以分号结尾。
以下是描述
5. jsp脚本总结:
<%! %>声明脚本。 只能书写声明语句。并且声明的变量是全局变量,在方法中可以直接使用。
<%=a %> 输出: 替代out.print(a); 翻译到servcie方法中。 注意:不要去书写分号。
<% %> java代码片段。 会被翻译servcie方法中。在java代码片段中,能书写的内容,参考,方法里面语句。
并且多个 java代码片段,可以组合一起去使用
6. servlet与jsp
jsp也是servlet,也可书写java代码。
jsp以后主要做页面(尽可能只有html代码)尽可能不要去书写java代码。 主要用于去书写要显示的内容。
servlet---主要用来做逻辑的处理(尽可能没有html代码)
serlvet先进行处理,处理之后要显示的内容,交给jsp去显示。 通过转发的方式交给jsp。
使用转发。从一个servlet去转到jsp中。
二、EL表达式
EL 全名为Expression Language,翻译成中文表达式语言,jsp2.0新的特性。
语法:${标识符} 作用就是输出标识符的所代表的值。
el出现目的:代替<%= %>,代替out.print();
常用功能
获取各种域对象取出数据,进行输出
域对象:request,servletContext
特点:都可以去向这两个对象中,存放数据。 setAttribute(string key,Object value);
这两个对象有着各自的作用范围:
request:一次请求
servletContext:从项目开始启动,一直到停止。
优点:如果el表达式没有取出值,不会显示,可以理解为输出空的字符串
request/context .getAttribute() 如果去不到值,得到的是null,会输出null
1. 简单登录案例
页面使用jsp书写,验证登录的效果,数据提交到servlet中。
serlvet的内容
三、 cookie,session
什么是会话?
当用户打开浏览器,访问某一个网站(day11)。 然后点击多个连接(操作过程),访问服务器多个web资源。然后关闭浏览器的整个过程。成为一次会话。
会话过程中要解决一些问题:
每个用户与服务器进行交互的过程中,各自会有一些数据,程序要想办法保存每个用户的数据。
cookie,session:保存数据
四、cookie
cookie 的原理。 介绍api。 做一个小案例。 记录用户上次访问时间。
Cookie是客户端(浏览器)技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,浏览器会把cookie发送给服务器。这样,web资源处理的就是用户各自的数据了
数据保存到浏览器中,用户的本机。
原理介绍:
创建一个 cookie,cookie 是 servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器
4.1 cookie-api详解
4.1.1. 服务器端创建一个cookie---重要
在javaEE的api中,有一个cookie对象
创建一个 cookie,cookie 是 servlet 发送到 Web 浏览器的少量信息,这些信息由浏览器保存,然后发送回服务器。cookie 的值可以唯一地标识客户端,因此 cookie 常用于会话管理。
创建cookie的方式。使用cookie的构造方法。
name:相当于cookie一个标识。一个cookie只有一个标识。
value:cookie具体存放的内容,value存放的是字符串。并且不能有中文。
4.1.2. 服务器向客户端发送cookie ,发送cookie—重要
response的方法。
servlet可以发送多个cookie,给浏览器。
response.addCookie(cookie1);
response.addCookie(cookie2);
当业务处理好之后,response对象,自己会自动把cookie的内容,放到响应头中,去把cookie发送浏览器
response.addCookie(cookie); 通过response 提供的api addCookie 把cookie发送给客户端(浏览器)
4.1.3. 获取cookie---重要
获取cookie:只的是,浏览器发送给服务器的cookie,如何去获取
request.getCookies 返回值 cookie[] 。服务器会把浏览器发送过来的所有的cookie封装到一个数组中。
浏览器向一个servlet发送信息的时候,可能发送多个cookie过来。 requets.getCookies(); 表示获取所有的cookei。返回值是以数组的方式进行存在的。
如果想获取具体的cookie,需要去遍历这个数组。通过cookie标识去定位。 设置cookie的时候,name值。
cookie.setValue() 把原来的值,替换成新的值。
总结:
1、获取浏览器发送过来的cookie request.getCookies(); 返回值是cookie数组
2、获取某一个cookie标识: cookie.getName();
3、获取cookie的里面的值: cookie.getValue();
4、修改cookie里面的值: cookie.setValue();
案例:
效果:
代码:
4.1.4 cookie--api整理
创建cookie : cookie cookie = new Cookie(String name,String value);
发送cookie:response.addCookie(cookie);
获取cookie:request.getCookies(); 返回cookie[]
获取cookie的name cookie.getName();
获取cookie的value cookie.getValue();
重新设置,cookie.setValue(String newValue);
4.1.5 cookie工具类
4.1.6 案例记录用户的上次访问的时间
原理分析:
服务器发送给浏览器cookie的形式:
servlet代码:
五、 知识点回顾:
<%! %> 声明语句
<%= %> 输出语句
<% %> 普通的所有语句
el表达式:代替<%= %> 输出语句; 从各个域对象中取出数据,并且进行输出。
cookie:
创建cookie: cookie = new cookie(String name ,String value); name:标识,value,值
发送cookie:response.addCookie(cookie);
获取cookie:Cookie[] cookies = request.getcookies();
根据cookie标识去获取cookie . getName();
获取cookie的值,cookie.getValue();
5.1 cookie的持久问题
默认情况下,设置的cookie,当浏览器关闭之后,会消失。那么如何让浏览器关闭之后仍然保存cookie,
通过cookie提供的api:setMaxage();设置cookie的过期时间。参数的单位是秒。cookie 将在经过该值表示的秒数后过期
5.2 cookie访问有效路径
cookie存储本机,由浏览器从从磁盘上获取cookie,把cookie发送到服务器。
cookie 浏览器发送个服务器;一个网址有很多的页面,很多的servlet。 访问那个servlet才会发送信息。
cookie,服务器去接受,并且去解析请求头,把cookie封装到cookie对象中。
uri设置一个资源路径。
表示当前的路径或者是当前路径的子目录,都会去发送cookie,其他的不会发送cookie
/day11/abc
/day11/abc/a
day11/abc/b
day11/aaa/
当设置了cookie的有效路径。那么该路径下的所有子路径,都生效。默认的有效路径-----/应用名
代码片段:
5.3 删除cookie---了解
通过浏览器的工具---可以删除cookie。
缺点:需要用户去手动操作。
希望通过设置cookie中的内容。浏览器浏览器cookie内容。浏览器自动的去销毁一个cookie;
去设置cookie 最大生存时间
cookie.setMaxAge();
整数的参数: 如果参数是负数: 表示关闭浏览器之后cookie删除
如果参数是0 , 表示浏览器会马上删除cookie
删除持久cookie的办法,将最大的失效设置成0。设成0马上删除,设置成-1是关闭浏览器之后删除。
cookie.setMaxage();
或者在浏览器方面删除cookie。
5.4 有效域名---了解
cookie保存到浏览器。浏览器会保存很多网站的cookie
浏览器访问某个网址的时候,如何区分出某个cookie属于某个网址?
domain : 域名。设置有效域名。默认就是自己网址的域名:localhost
设置有效域名的时候,不要去乱设置。下次访问自己的网站的就不会发送。并且如果设置到别的网址。默认浏览器不接受cookie。
举例:
A. .a.com
B. .b.com
用户访问A a创建cookie 设置域名 cookie.setDomain(“.b.com”);
浏览器就接受了cookie
当用户之后去访问B的时候, 浏览器就会把之前的cookie(A) 发送B
这样的cookie叫做第三方cookie或者恶意的cookie。
如果A和B 是竞争公司
访问A网址。 生成了大量的cookie。给浏览器,并且标识的域名 B的域名。
访问B的 时候, 把cookie 发送给B。 b服务器去接受cookie,并且把cookie转换成Cookie的对象
需要销毁资源。
这种cookie 第三方cookie 也叫做恶意的cookie。。浏览器默认的情况下,不接受这样的cookie的。
5.5 cookie细节---整理
l 一个Cookie只能标识一种信息(name),并且这个name不能修改。它至少含有一个标识该信息的名称(NAME)和设置值(VALUE)。
value可以更改setValue,但是name不可以更改。
l 一个WEB站点可以给一个WEB浏览器发送多个Cookie,一个WEB浏览器也可以存储多个WEB站点提供的Cookie。
response.addCookie(cookie1);
response.addCookie(cookie2);
l 浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。并且cookie存储的内容字符串。不要有中文
l 如果创建了一个cookie,并将他发送到浏览器,默认情况下它是一个会话级别的cookie(即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。
如果要想关闭浏览器的时候不消失:cookie.setMaxAge(int 秒);
通常情况设置时间 如果是int类型的。秒单位。如果long类型的是毫秒为单位。
l 删除持久cookie,可以将cookie最大时效设为0---直接删除cookie。如果-1,关闭浏览器之后删除。
5.6 应用---记住用户名
分析:
1、第一次登录的servlet
2、写在页面
六、session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的每一个浏览器创建一个其独享的session对象,
由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把用户各自的数据放在各自的session中,
当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
jsessionid:xxxxxxxxxxxxx具体的内容。
如何判断一个用户是否登陆过?
2、获取,创建session
3、向session中保存数据
4、从session取出数据
6.1 session的获取
Session对象由服务器创建,
开发人员可以调用request对象的getSession方法得到session对象。
6.2 向session中存入数据---重要
session.setAttribute(name,value); 类似于map的操作。可以存放任意类型的数据
6.3 从session中取出数据—重要
6.4 删除session中的数据----了解
session.removeAttribute(String name);
删除key对应的 那个对象。
username=zs
password=12345
age=19
session.removeAttribute(age);
session 只剩下 username=zs password=12345
6.5 登录---带有验证码的登录
登录页面:
图片验证码的内容:
登录的servlet
6.6 案例---应用---访问不同网页,显示用户名。
serlvet代码:
jsp代码:其他页面
注销的servlet
6.7 session整理
6.8 session的生命周期----次重要
什么时候被创建;
第一次调用request.getSession()的时候。
什么时候被删除;
1、session是什么时候被创建的?
当第一次调用request.getSession()的时候创建session。
如果第一次访问jsp页面也会创建一个session
2、session时候被销毁
知道session销毁:注意session销毁的三种场景。
面试题:浏览器关闭后,session对象是否销毁?
6.8.1 session的销毁方式
三种销毁session的场景:
1、不正常关闭服务器(如果正常关闭服务器,session的信息,会被序列化硬盘中,保存在tomcat的work目录,当tomcat下一次启动的时候,会把session加载回来。序列化的文件会被销毁)。
2、session过期,默认的过期时间,tomcat/config/web.xml
如果在tomcat的web.xml中修改,那么所有的项目都会被修改。
如果想修改某个项目自己的session的过期时间。在项目的web-inf/web.xml设置
3、在程序执行中,手动销毁session对象,session.invalidate();
销毁session:案例:注销。
6.9 session细节
浏览器关闭之后session是否能否使用。
session是依赖于jsessionid存在,jsessionid 是一个cookie 这个cookie 过期时间是负数(关闭浏览器之后,就会销毁)
所以关闭浏览器之后,找不到对应的jsessionid,所以找不到之前的session对象。
关闭浏览器之后JSESSIONID,默认不能(JSESSSION ,默认关闭浏览器的时候销毁掉);
我们自己创建一个jsessionid这个cookie,把这个cookie设置maxAge。
通过sesssion中提供过的方法
获取JSESSIONID;
2、cookie禁用的时候,session是否可以使用。
默认的情况,用户不能使用session
可以通过url的方式将jsessionid传递给服务器
http://localhost:8080/day12/session2;jsessionid=A5761BA1F433474E5E6E8FE111B341FF
保证了,每次请求都会寻找一个session,就可以继续使用session
encodeURL(“/login”) -==== /login;jsesionid;xxxxxxx
是不是需要每一个路径都要进行response.encodeURL();
如果工作中,遇到用户把cookie禁止。session不能使用。
告诉用户不能够禁止cookie。
response.encodeURL ,request对象,会自己把jsessionid,拼接到url中。注意该方法只有在浏览器把cookie禁用之后才有效
或者如下:
七、 servlet数据范围总结
servlet三种数据范围:
servletContext----全局应用于整个项目 , httpsession-----一次会话内, httpservletRequest----一次请求
向这个三个对象中去存放数据。
同时拥有
getAttribuet(String name)
setAttribute(String name,Object value);
以上三个对象,可以当做容器来使用, 可以保存数据,因此他们也被称为域对象。
ServletContext:它保存的数据所有的Servlet共享。它的范围最大。开发几乎不用。除非需要保存整个项目中共享的信息才会使用。(并且,从项目启动,到项目停止一直存在。)
HttpSession:它是针对当前某个用户(浏览器)的一系列操作,然后在服务器端创建的一个容器,整个容器仅仅只能是当前这个客户端(浏览器)使用------一次会话。多个客户端(浏览器),它们会有不同的Session容器对象。sesion保存数据的时间(从session创建,到销毁)
通常把用户的信息,保存到session。
HttpServletRequest:它的针对用户的这次请求,只要请求和响应结束,这个容器就消失了。一般开发中这个容器是最常用。只要给request中保存了数据之后,那么就会使用转发技术,转发到JSP页面上,在页面上使用EL表达式把request中的数据取出,并显示。
安装存活时间数据范围总结
servletContext最大 --- 整个项目运行过程中。一直存在
session 存活时间—默认是30分钟
request 最小 存活时间—一次请求。