记住用户名密码这些参数的操作,称之为维护状态;
cookie
在web开发中用来维系状态的一种技术;
服务器要向浏览器返回cookie
//创建cookie
Cookie c=new Cookie(名,值);
response.addCookie(c);
浏览器再次发送请求时,会把这些cookie值重新发送给服务器
Cookie[] cookies=request.getCookies();
应用场景:自动登录、记录访问网页;
cookie的属性
up.setmaxAge(秒)
用来设置cookie存活的时间,默认值为-1,表示浏览器关闭cookie到期;0表示服务器主动删除cookie;up.setHttpOnly(true)
不允许js代码来操作cookie值,否则可以在js代码中使用document.cookie
访问到cookie值;
session
和cookie功能一样,但是把这些信息存储在服务器端,相对安全;
存储信息
//拿到session对象
HttpSession session=request.getSession();
session.setAttribute("名",值);
获取信息
//拿到session对象
HttpSession session=request.getSession();
session.getAttribute("名");//返回上一次存储的值
删除信息
session.removeAttribute("名");//返回被移除的值
session.invalidate(); //移除session中的所有值
生命周期
默认生命周期,第一次调用request.getSession()创建session对象,如果隔了30分钟没有向服务器发送请求,session会自动失效;
如果要改变默认时间,可以在web.xml中:
<session-config>
<session-timeout>30</session-timeout>
</session-config>
跟浏览器的关系:一个浏览器对应服务器中的一个session,并且每个浏览器在服务器中的session相互独立不干扰;
cookie和session对比
- 安全性:session的安全性高;
- 存储的类型:session存储类型为Object,cookie存储类型为String(并且需要进行编码处理);
- 存储大小:session存储的大小理论上与服务器大小有关无限制(但不建议存储太多内容);cookie的限制大约是4k左右,而且每个浏览器的cookie个数也是有限的,并且每个浏览器都不一样;
- 失效时间:session两次请求间隔30分钟失效,cookie默认关闭浏览器失效,还可以通过maxAge继续设置;
请求重定向和请求转发
请求转发
request.getReqyestDispatcher("跳转路径).forword(request,response);
请求重定向
response.sendRedirect("跳转路径");
二者区别:
- 请求焕发的地址不会改动,始终是刚开始的地址;请求重定向在跳转后,地址栏会变为目标地址;
- 请求转发是一次请求,跳转操作在服务器内部发生;请求重定向是两次请求,跳转操作是在浏览器,服务器之间发生;
- 请求转发可以使用request.setAttribute进行值的传递;请求重定向需要使用session.setAttibute进行值的传递;
作用域(scope)对象
request
作用范围:限于一次请求
如果是重定向请求即两次请求则访问不到;
request.setAttribute(key,value);
request.getAttribute(key);
request.removeAttribute(key)
;
session
作用范围:同一个浏览器的多次请求之间(一次会话)
如果是两个浏览器则访问不到
session.setAttribute(key,value);
session.getAttribute(key);
session.removeAttribute(key)
;
page
作用范围:限于当前页面
如果跳到别的页面就访问不到;
application
作用范围:作用于整个应用程序
作用范围:page<request<session<application
案例测试:
jsp01.jsp
<%pageContext.setAttribute("key0","value0");
request.setAttribute("key1","value1");
session.setAttribute("key2","value2");
application.setAttribute("key3","value3");
%>
jsp02.jsp
<h1>欢迎来到${key0}界面</h1>
<h1>欢迎来到${key1}界面</h1>
<h1>欢迎来到${key2}界面</h1>
<h1>欢迎来到${key3}界面</h1>
- page
请求转发另一个页面
request.getRequestDispatcher("jsp02.jsp").forward(request,response);
跳转结果
可以看出page作用域的作用范围只在同一页面;
- request
请求重定向另一个页面
response.sendRedirect("jsp02.jsp");
可以看出request作用域是同一个request;
- session
使用两个不同的浏览器访问jsp02,第一个浏览器session中放入变量再访问即由jsp01跳转到jsp02,第二个浏览器直接访问jsp02;
可以看到session的作用域只限于同一浏览器,并且是在session存活时的多次访问;而application的作用域是整个应用程序;
EL表达式会从小的作用域往大的作用域寻找;
也可以利用前缀精确地找到某个作用域:
- pageScope page作用域
- requestScope 请求作用域
- sessionScope 会话作用域
- applicationScope 应用程序作用域
jsp中的9个隐式对象
- pageContext 页面作用域
- request 请求对象
- session 会话对象
- application 应用程序对象
- response 响应对象
- out 响应输出流
- page 当前jsp页面对象
- config 用来读取和jsp配置相关的信息
- exception 必须在当前页面的page指令中添加
isErrorPage="true"
,表示一个异常对象;
会话跟踪的原理
利用jsessionid的cookie把浏览器和session对象关联起来;
- request.getSession(); 首次请求在服务端创建出session对象,session会有一个id值;
- 第一次返回响应时,由tomcat返回一个特殊cookie(jsessionud=session的id值) 给浏览器;
- 后续的请求,浏览器就根据这个jsessionid的值找到服务器的session对象;
应用:自动登录