cookie和session、请求转发和请求重定向、作用域对象、会话跟踪原理

记住用户名密码这些参数的操作,称之为维护状态;

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对象;

应用:自动登录

猜你喜欢

转载自blog.csdn.net/mashaokang1314/article/details/86490437