路径问题:
什么是路径:
链接地址 <a href="url"></a>
表单提交<form action="url"></form>
重定向:response.sendRedirect("url")
转发:request.getRequestDispatcher("url")
url:路径
ps:以上四种情况中的url可以为绝对路径也可以是相对路径
但是都不可以盘符开始的绝对路径
什么是相对路径:
从当前文出发到达目标文件所经过的路径叫做相对路径
书写格式不以"/"开头
退至上一级目录"../"开头
什么是绝对路径:
.以"/"开头的路径都是绝对路径,不以当前文件的位置作为起始,而是以一个固定的位置作为起始到达
.这个固定位置可能是应用名,也可能是应用名之后.不一定两种情况都可以,不可以使用从盘符开始的路径
/appName/a/a2.jsp
/a/a2.jsp (应用名之后.)
经验总结:
关于重定向和转发的相对路径和绝对路径问题
转发和重定向的url前加有"/"则为绝对路径,反之为相对路径
1.通过form表单的action属性向服务器发送请求.
action="LoginServlet"
表单生成的请求地址
http://localhost:8080/appName/LoginServlet
2.重定向:
相对路径:response.sendRedirect("index.jsp");
http://localhost:8080/appName/index.jsp
绝对路径:response.sendRedirect("/Manager/index.jsp");
Web容器本身地址+参数生成完整的url
http://localhost:8080/Manager/index.jsp (把appName覆盖掉)
web应用地址
response.sendRedirect("http://www.baidu.com");
转发:
相对路径:
与重定向生成的url方法相同
request.getRequestDispatcher("index.jsp")
http://localhost:8080/appName/index.jsp
2.绝对路径:
转发使用绝对路径和重定向不同:比如:
request.getRequestDispatcher("/Manager/index.jsp")
http://localhost:8080/appName/Manager/index.jsp
但是转发用相对路径和绝对路径,最后产生的地址都一样
练习:
绝对路径和相对路径练习:
<%=request.getContextPath() %>:获取项目名
<%=request.getContextPath() %> = /appName(/Sc1807-2JavaWeb13)
状态管理:
为什么需要状态管理:
web应用程序使用HTTP协议通信,而HTTP协议是"无状态协议",即服务器一旦响应完客户的请求之后,就断开连接,而同一个客户的
下一次请求将重新建立网络连接.
.服务器应用程序有时需要判断是否为同一个客户发出的请求,比如客户的多次选购商品,
因此,有必要跟踪同一个客户发出的一系列请求
什么是状态管理:
将客户端(浏览器)与服务器的多次交互(一次请求,一次响应)当做一个整体来看待并且多次交互所涉及的数据状态保存下来
状态指的是数据
管理指的是多次交互时对数据的修改
状态管理的两种常见模式:
.服务器状态管理技术:将状态(数据)保存在服务器端,代表性的是session技术.
.浏览器端状态管理技术:将状态保存在客户端,代表性的技术Cookie.
什么是Cookie
浏览器向web服务器发送请求时,服务器会将少量的数据以set-Cookie消息头的方式发送
给浏览器,浏览器将这些数据保存下来
当浏览器再次访问服务器时,会将这些数据以Cookie消息头的方式发送给服务器
第一次访问服务器以如下形式返回给客户端
Set-Cookie: uname=tom
Set-Cookie: city=shangrao
当浏览器再次访问服务器的时候会在request header中发送如下数据,以便达到状态管理
Cookie: uname=tom; city=shangrao
ps:cookie的生命周期:
随着浏览器的关闭,保存在浏览器端的Cookie也跟着被删除
Cookie原理:
客户端:<-----访问----->服务器:
1.http/1.1 200 OK
set-cookie:uname=tom;
2.GET /find http/1.1协议
Cookie:uname=tom;
如何创建Cookie
.Servlet API为使用Cookie提供了javax.servlet.http.Cookie
创建:
Cookie cookie1 = new Cookie(String name,String value); (key-value)
response.addCookie(cookie1);
name:用于区分不同种cookie的名字
value:cookie的值.
如何查询Cookie
获取客户端所有Cookie对象
Cookie[] cookies = request.getCookies();
ps:该方法可能会返回null
获取一个Cookie对象的名称和值
String name = c.getName();
String value = c.getValue();
问题:在控制台输出发送的cookie的信息,如果没有则输出"无cookie信息"
如何修改Cookie
1.获取客户端发送的所有Cookie
2.根据name找到要修改的Cookie
3.调用Cookie的setValue(String newValue)方法修改该Cookie的值
4.将修改后的Cookie加入到response返回到客户端.
使用cookie实现自动登入功能,可以设置身份保存时间是为一次或2个小时
需要用到session做客户端的验证
效果:关闭浏览器中再次登入时实现自动登入,有效期限为2个小时
cookie的生存时间:
默认情况下:浏览器会将cookie保存在内存中,只要浏览器不关闭,cookie就一直存在.
.如果希望关闭浏览器后cookie仍然存在,可以通过设置过期时间达到目的.
void cookie.setMaxAge(int second);
ps:second单位是秒,精度不是很高.
second >0:浏览器要保存cookie的最长时间设置的参数值,如果超过指定时间,浏览器会主动删除这个cookie.
此时cookie保存在硬盘上.
second=0:删除cookie,在修改cookie的生存时间为0后,随着response发送回客户端替换原有cookie,因生命周期到了
就将该cookie删除
secede<0:缺省值:浏览器会将cookie保存到内存中.(默认情况)
练习:
设置cookie的过期时间,使得cookie保存在硬盘上.
方案:通过setMaxAge方法对cookie过期时间设置为>0的数.
使用Chrome浏览器查看cookie生成时间
菜单中选择设置-->显示高级设置-->隐私设置-->内容设置
查看所有cookie设置,可以显示cookie的创建时间和过期时间
cookie编码
.cookie只能保存合法的ASSII字符,如果是要保存中文,需要将中文转换成合法的ASSII字符,即编码.
URLEncoder.encode("草薙京","utf-8")
Cookie c1 = new Cookie("uname",URLEncoder.encode("草薙京","utf-8"));
作业:通过程序判断用户是否禁用了cookie
cookie的路径问题:
浏览器在访问服务器上的某个地址时,会比较cookie的路径与该路径是否匹配
只有匹配的cookie才会发送给服务器
cookie的默认路径等于添加这个cookie的web组件的路径
举例:
如果是该web组件添加了cookie
http://localhost:8080/Sc1807-2JavaWeb14/cookie
则cookie的路径为:
http://localhost:8080/Sc1807-2JavaWeb14
发送cookie的条件
.要访问的地址必须是cookie的路径或者其子路径,浏览器才会发送cookie
比如:
则cookie的路径为:
http://localhost:8080/Sc1807-2JavaWeb14
则访问则cookie的路径为:
访问http://localhost:8080/Sc1807-2JavaWeb14/a.jsp
或者则cookie的路径为:
http://localhost:8080/Sc1807-2JavaWeb14/b/c.jsp
都会发送cookie
如果访问http://localhost:8080/d.jsp则不会发送cookie.
此时cookie为:http://localhost:8080/Sc1807-2JavaWeb14/jsp
此时a.jsp的路径为:http://localhost:8080/Sc1807-2JavaWeb14
设置cookie的路径
使用如下代码完成cookie路径的设置
Cookie c1 = new Cookie("uname","tom");
c1.setPath("/Sc1807-2JavaWeb14");
response.addCookie(c1);
ps:修改路径的时候不要带上容器本身的地址(http://localhost:8080),否则无法识别
状态管理-session
什么叫session(会话)
浏览器访问web服务器的时候,服务器会为每一个浏览器在服务器的内存中分配空间,单独创建
这个session对象,该对象有一个id属性,其值唯一,一般称之为sessionId并且服务器会将这个sessionId(使用cookie的方式)
发送给浏览器,浏览器再次访问服务器时会将sessionId发送给服务器,服务器可以依据sessionId找到对应的session对象
如何获取session
HttpSession sessin = request.getSession(boolean flag);
HttpSession是一个接口,后面返回的是符合接口规范的对象.
当flag为true时:先查看请求中有没有SessionId,如果没有sessionId,则服务器创建一个session对象,
如果有session,则依据SessionId查找对应的session对象,找到则返回,找不到则创建一个新的session对象,
所以当flag为true,一定能找到session对象
当flag为false,没有SessionId及有SessionId但是没有找到session对象,均返回null,找到则返回
request.getSession() 等价于request.getSession(true);
如何使用session绑定对象(数据)
void session.setAttribute(String,Object obj);
获取绑定对象
Object session.getAttribute(String name);
移除绑定对象
void session.removeAttribute(String name);
练习:
使用session实现访问计数(integer为空(==null),int不能为空)
int i = 0 ; int默认为0, Integer I = null ;Integer默认为null;
out.println("i ="+i+",I="+I);
如何删除session对象:
立即删除session对象
session.invalidate
session验证:
保存登入信息,保护某些资源只有在登入验证之后才可以访问(防盗链)
将浏览器缓存禁用,实现用户2小时免登入
建议URL重写的方式.
session验证
用户访问需要保护的资源时,可以使用session验证的方式保证其安全性,比如要求登入后才能访问的资源
实现session的验证,遵循以下步骤
-1.使用session.setAttribute()先绑定数据
-2.使用session.getAttribute()方式来读取绑定值,如果没有,则跳转回到登入页面
session超时.
Web服务器会将空闲时间过长的session对象直接删掉以节省服务器内存空间资源
Web服务器缺省的超时时间限制:一般是30分钟
如何修改session的缺省的时间限制
1.修改tomCat的conf/web.xml配置文件的设置
2.通过编程的方式来修改
session.setMaxIncativeIntval(int seconds);
练习:
使用编程的方式,设置session的时间为10秒,实现当用户登入,10秒钟之内没有任何动作则session失效
此时在访问firstP阿哥.jsp页面时,就会重定向到index,jsp页面,重新登入
作业:
假设有当前用例流程,在一个项目中,从A页面跳转到B页面,通过js完成对cookie值的设置以及传递
需要在A页面设置键值对:name=刘德华,pwd=123,sex=男
通过cookie的形式传递到页面,在B页面中打印显示.
禁用cookie不能使用document.cookie获取cookie的值
浏览器禁用cookie的后果:
如果浏览器禁用cookie,session还能用吗
答案:不能,但有其他解决方案
服务器在默认情况下,会使用cookie的方式将sessionId发送给浏览器,如果用户
禁止了cookie,则sessionId不会被浏览器保存,此时,服务器可以使用URL重写这样的方式来方式sessionId
什么叫URL重写
:浏览器在访问服务器的某个地址时,不再使用原来的那个地址,而是使用经过改写的地址(即:在原来的地址后面加上sessionId)
response.sendRedirect(response.encodeRedirectURL("a.jsp"))
jsessionid=1BCAAC067CEEABF01F3F3E55B7A5157A
如果是链接地址或者表单提交,使用
response.encodeURL(String url)生成重写后的url
如果是重定向:
response.encodeRedirectURL(String url)
session的优缺点:
优点:
-安全:(将状态保存在服务器端)
-session能够保存的数据类型更加丰富,cookie只能保存字符串
session能够保存更多的数据,cookie大约保存4k
缺点:
session将状态保存在服务器端,占用服务器内存,如果用户过大,会影响服务器内存
验证码的作用:
为了防止机器人的破坏性操作,可以使用验证码技术来防止恶意的发送数据
验证码的本质上是一张动态的产生的图片
图片的内容会随着程序的运行而随机产生.