Servlet 3 复习
文章目录
1.研究 什么是转发 什么是重定向 如何完成
转发:forward
如果请求之后希望跳转到另一个页面,转发和重定向均可以做到,如果想要回传信息的时候,这个时候只有转发才能做到。
转发:一个web组件,将未处理完毕的请求 通过Tomcat转交给另外的一个web组件
步骤:
1.获取请求转发器:
RequestDispatcher rd = request.getRequestDispatcher("新地址");
2.开始转发:
rd.forward(请求对象,相应对象);
特点:1.转发过程中,只产生一次请求,一次响应,多个组件之间共享一个请求对象和转发对象,地址栏不会发生改变。
2.转发无法跨域实现。
3.相较于重定向而言,效率高。
重定向:Redirect
当请求传达到servlet的时候,我们会同样可以通过response对象去跳转到新的页面,但是这种跳转不能携带参数,因为response没有域对象,相当于服务器重新做了一个新的url,和原来的对象没有什么关系了,实际上发生了新的资源定位,重定向发生了两次的资源的跳转,资源会相对的消耗点
一个web组件 处理完毕请求后, 在响应时, 告知浏览器新的请求地址.
格式:
response.sendRedirect("新地址");
流程:
当客户端请求服务器时, 服务器给浏览器响应一个302的状态码 , 以及一个location (新地址)
当客户端接收到服务器回复的302状态码时, 会主动向location发送新的请求.
特点:1.重定向每发生一次,就产生一个新的请求。
2.浏览器地址栏会改变。
3.重定向可以实现夸域。
4.相较于请求而言,效率低。
301是永久重定向,而302是临时重定向。
301表示旧地址A的资源已经被永久地移除了(这个资源不可访问了),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时地从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的网址。
301用途:
301请求是可以缓存的,浏览器会存在缓存。当该重定向基本不会发生变化时,采用301.如域名的解析:一个域名跳转到另一个域名。这时往往采用301.permenent标识301。切记301跳转在浏览器上是有缓存的。调试过程更换跳转地址,需清除浏览器的缓存。
302用途:
302 比如未登陆的用户访问用户中心重定向到登录页面。访问404页面会重新定向到首页。redirect标识302
//请求重定向的例子
response.setStatus(301);
response.setHeader("Location", "http://127.0.0.1/login.htm");
}
在用户访问后浏览器都会重定向到http://127.0.0.1/login.html
注意:
1. 一个组件将 请求进行了 转发 或 重定向操作后, 不能再给用户进行响应
2. 请求转发 与 请求重定向操作 , 可以进行多次, 但是一定要有出口.
区别:
1、请求次数:重定向是浏览器向服务器发送一个请求并收到响应后再次向一个新地址发出请求,转发是服务器收到请求后为了完成响应跳转到一个新的地址;重定向至少请求两次,转发请求一次;
2、地址栏不同:重定向地址栏会发生变化,转发地址栏不会发生变化;
3、是否共享数据:重定向两次请求不共享数据,转发一次请求共享数据(在request级别使用信息共享,使用重定向必然出错);
4、跳转限制:重定向可以跳转到任意URL,转发只能跳转本站点资源;
5、发生行为不同:重定向是客户端行为,转发是服务器端行为;
6.转发效率高于重定向。
2.什么是状态管理
1.HTTP是无状态的协议. 我们客户端与服务器的每一次交流 ,服务器都没有记忆能力.
学习会话跟踪技术 , 可以让我们的服务器 在与客户端 的一场会话中, 拥有记忆能力.
2.将浏览器与web服务器的多次交互当做一个整体来处理,将多次交互所涉及的数据状态保存下来。
管理方式1:将状态保存在浏览器(客户端),使用cookie技术。
管理方式2;将状态保存在服务器,使用session技术。
3.研究Cookie 和 Session 的差别 分别使用Cookie 和 Session完成用户请求次数的记录问题
什么是cookie?
cookie是一种客户端的状态管理技术。
技术实现原理:
当服务器给浏览器响应时, 创建一个Cookie , 并将Cookie添加到响应头部.
浏览器根据HTTP协议约定, 接收到Cookie , 将Cookie存储在一个文本文件中(.txt).
当浏览器下一次访问 这个服务器时, 会将文本文件中的Cookie取出, 发送给服务器.
必须是相同的服务器 且 路径相同时才会发送.
创建cookie:
一个Cookie就是一个键值对,在java中是一个描述键和值的类。
创建对象的格式:
Cookie cokie = new Cookie(String Key ,String value);
注意:
在tomacat8.5 之前cookie无法存储中文。
将cookie加入到响应头部
格式:response.addCookie(Cookie cookie);
注意:
如果是同一个服务器,同一个路径存储的两个cookie键相同,则旧的cookie会被覆盖。
从请求头获取Cookie
格式:
Cookie[] cookies = request.getCookies();
注意:
如果从未存储过,则获取的数组是null;
Cookie的常用操作:
1.取出Cookie中的键:
String name = cookie.getName();
2.取出Cookie中的值:
String value = cookie.getValue();
3.Cookie的存活时间问题:
设置时间格式:
cookie.setMaxAge(int 秒);
值的含义:
正数:存活的秒数
负数:默认值为-1.负数表示浏览器关闭时删除。
0: 立即删除
Cookie类的主要方法
No. 方法 类型 描述
1 Cookie(String name, String value) 构造方法 实例化Cookie对象,传入cooke名称和cookie的值
2 public String getName() 普通方法 取得Cookie的名字
3 public String getValue() 普通方法 取得Cookie的值
4 public void setValue(String newValue) 普通方法 设置Cookie的值
5 public void setMaxAge(int expiry) 普通方法 设置Cookie的最大保存时间,即cookie的有效期,
当服务器给浏览器回送一个cookie时,如果在服务器端没有调用setMaxAge方法设置cookie的有效期,那么cookie的有效期只在一次会话过程中有效,用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一次会话,当用户关闭浏览器,会话就结束了,此时cookie就会失效,如果在服务器端使用setMaxAge方法设置了cookie的有效期,比如设置了30分钟,那么当服务器把cookie发送给浏览器时,此时cookie就会在客户端的硬盘上存储30分钟,在30分钟内,即使浏览器关了,cookie依然存在,在30分钟内,打开浏览器访问服务器时,浏览器都会把cookie一起带上,这样就可以在服务器端获取到客户端浏览器传递过来的cookie里面的信息了,这就是cookie设置maxAge和不设置maxAge的区别,不设置maxAge,那么cookie就只在一次会话中有效,一旦用户关闭了浏览器,那么cookie就没有了,那么浏览器是怎么做到这一点的呢,我们启动一个浏览器,就相当于启动一个应用程序,而服务器回送的cookie首先是存在浏览器的缓存中的,当浏览器关闭时,浏览器的缓存自然就没有了,所以存储在缓存中的cookie自然就被清掉了,而如果设置了cookie的有效期,那么浏览器在关闭时,就会把缓存中的cookie写到硬盘上存储起来,这样cookie就能够一直存在了。
6 public int getMaxAge() 普通方法 获取Cookies的有效期
7 public void setPath(String uri) 普通方法 设置cookie的有效路径,
比如把cookie的有效路径设置为"/xdp",那么浏览器访问"xdp"目录下的web资源时,都会带上cookie,再比如把cookie的有效路径设置为"/xdp/gacl",那么浏览器只有在访问"xdp"目录下的"gacl"这个目录里面的web资源时才会带上cookie一起访问,而当访问"xdp"目录下的web资源时,浏览器是不带cookie的
8 public String getPath() 普通方法 获取cookie的有效路径
9 public void setDomain(String pattern) 普通方法 设置cookie的有效域
10 public String getDomain() 普通方法 获取cookie的有效域
Cookie的路径问题
我们在使用Cookie时, 经常需要关注Cookie的路径问题.
为了避免此问题, 我们一般设置Cookie的路径为 /
格式:
cookie.setPath("/");
-----------------------------------------------------------------------------------------
1、服务器端每次访问的cookie是每次请求头中发送给服务器端的
2、客户端每次请求只发送当前路径下和“直系”关系的父路径的cookie(父路径的页面是不能访问子路径和兄弟路径的cookie的)
3、setcookie如果不设置路径,默认为当前页面的路径,父亲路径的页面是无法访问的
4"/"这个根路径可以在任何路径下访问,求简单可以把cookie都放在这里。
------------------------------------------------------------------------------------------
那么Cookie的path是干什么的呢?假设你的浏览器当前已经有了两个Cookie:
c1:name=id; value=itcast; path=/day07_03/;
c2:name=name; value=qdmmy6; path=/day07_03/servlet/。
当访问http://localhost/day07_03/*时,请求头中会包含c1,而不会包含c2。
当访问http://localhost/day07_03/servlet/*时,请求头中会包含c1和c2。
也就是说,在访问子路径时,会包含其父路径的Cookie,而在访问父路径时,不包含子路径的Cookie。
Cookie的优缺点:
缺点:
1.Cookie存储的数据类型只能是String
2.数据存储在了客户端的文本文件中,不安全。
3.存储的数据大小 不能超过4kb
4.在Tomcat8.5版本之前 无法存储中文
5. 太依赖用户的浏览器设置,用户可以主动删除Cookie 甚至禁用Cookie
优点:
数据储存在浏览器中,减少了服务器的压力。
什么是Session?
HttpSession 可以看做一个Map集合, 存储的键是string , 存储的值是Object.
技术原理:
当浏览器访问服务器时, 服务器可以选择为浏览器创建一个新的HttpSession对象.
HttpSession对象被创建时, 会产生一个id , 我们称其为SessionID (Java程序员又称其为:JSESSIONID)
tomcat会自动将这个id 封装为一个Cookie , 将这个Cookie发送给浏览器.
当浏览器再次访问服务器时, 会携带这个包含id的cookie.
服务器接收到这个cookie后, 就取出id , 并根据这个id 找到对应的HttpSession对象 供程序员调用.
如何得到session对象
格式一:
HttpSession session = request.getSession();
//内部代码是 调用了一参的getSession方法,传了一个true
格式二:
HttpSession session = request.getSession(boolean isNew);
参数:
true :根据当前浏览器传来的sessionID 查找一个session对象,并返回
如果sessionid不存在 ,则创建Session并返回
false :根据当前浏览器传来的sessionID 查找一个session对象,并返回
如果sessionid不存在 ,则返回null
Session 的常用方法
1.设置 或替换数据
session.setAtribute(String key , Object value );
2.获取数据
Object value = session.getAttribute(String key );
3.移除数据
session.removeAttribute(String key);
4.销毁session
//我们使用此方法,做的最多的事情就是 退出登录
session.invalidate();
Session API
long getCreationTime();【获取Session被创建时间】
String getId();【获取Session的id】
long getLastAccessedTime();【返回Session最后活跃的时间】
ServletContext getServletContext();【获取ServletContext对象】
void setMaxInactiveInterval(int var1);【设置Session超时时间】
int getMaxInactiveInterval();【获取Session超时时间】
Object getAttribute(String var1);【获取Session属性】
Enumeration getAttributeNames();【获取Session所有的属性名】
void setAttribute(String var1, Object var2);【设置Session属性】
void removeAttribute(String var1);【移除Session属性】
void invalidate();【销毁该Session】
boolean isNew();【该Session是否为新的】
设置Session的销毁时长(生命周期)
服务器默认会话时长为30分钟。
当浏览器最后一次访问30分钟后,服务器删除对应的session
为了让session的存活时长, 更适用于我们的项目. 我们可以调整全局session时长 或 单独设置某个session的时长.
方法一:
设置全局session时长
独立环境:
修改tomcat/conf/web.xml文件夹
开发环境:
修改Servers项目中的 web.xml文件夹
更改web.xml中的session-config节点:
<session-config>
<session-timeout>分钟数字</session-timeout>
</session-config>
方法二:
设置某个项目的session时长
打开web-inf/web.xml , 加入如下节点:
<session-config>
<session-timeout>分钟数字</session-timeout>
</session-config>
方式三:
通过Java代码, 设置某一个session的存活时长.
session.setMaxInActiveInterval(int 秒);
浏览器禁用Cookie后的session处理
4.2、解决方案:URL重写
response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。
response.encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写
Session 优缺点
优点:
1. 数据存储在服务器中, 安全.
2. 数据存储类型为Object , 表示可以存储万物.
3. session存储的数据大小是 无限制的.
缺点:
数据存储在服务器中, 当用户量较大时, 极易耗尽服务器性能. 导致服务器崩溃.
sion处理
4.2、解决方案:URL重写
response.encodeRedirectURL(java.lang.String url) 用于对sendRedirect方法后的url地址进行重写。
response.encodeURL(java.lang.String url)用于对表单action和超链接的url地址进行重写
Session 优缺点
优点:
1. 数据存储在服务器中, 安全.
2. 数据存储类型为Object , 表示可以存储万物.
3. session存储的数据大小是 无限制的.
缺点:
数据存储在服务器中, 当用户量较大时, 极易耗尽服务器性能. 导致服务器崩溃.