四种会话跟踪技术比较及应用场景 9种JSP的隐式对象


1.什么是会话 、会话跟踪 ?为什么需要会话跟踪?

1.1 客户端打开与服务器的连接发出请求到服务器响应客户端请求的全过程称之为会话
1.2 对同一个用户对服务器的连续的请求和接受响应的监视称之为会话跟踪
1.3 浏览器与服务器之间的通信是通过HTTP协议进行通信的,而HTTP协议是”无状态”的协议,它不能保存客户的信息,即一次响应完成之后连接就断开了,下一次的请求需要重新连接,这样就需要判断是否是同一个用户,所以才应会话跟踪技术来实现这种要求


2.举例阐述四种会话跟踪技术的特点,应用场景

2.1 URL传递参数
          URL重写的技术就是在URL结尾添加一个附加数据以标识该会话,把会话ID通过URL的信息传递过去,以便在服务器端进行识别不同的用户
形式: url?参数名=值&参数名=值

2.2 隐藏表单域
          将会话ID添加到HTML表单元素中提交到服务器,此表单元素并不在客户端显示

2.3 使用Cookie
        Cookie是Web服务器发送给客户端的一小段信息,客户端请求时可以读取该信息发送到服务器端,进而进行用户的识别。对于客户端的每次请求,服务器都会将Cookie发送到客户端,在客户端可以进行保存,以便下次使用
      
保存在客户端的
永久性Cookie 设置了有效时间的,就是永久性的
     会以文件的形式保存在浏览器的临时文件夹中

临时性Cookie 当客户端关闭之后,Cookie就没有了
    只是保存在浏览器的缓存中

2.4 使用会话对象session
          每一个用户都有一个不同的session,各个用户之间是不能共享的,是每个用户所独享的,在session中可以存放信息。
session的默认失效时间是30分钟
在web.xml中可以配置session的失效时间
<session-config>
  <session-timeout>10</session-timeout>
  </session-config>
         创建过程:

         当第一次请求服务器的时候,在服务器中会自动创建Session对象,
服务器在响应时,会将Session对象的ID通过临时Cookie的方式响应给浏览器

浏览器在以后的请求过程中,都会先获取临时Cookie中的SessionID,
在请求过程中,会带上SessionID一起发送给服务器

服务器收到请求后,会先判断SessionID是否存在,
           如果不存在,说明是第一次请求
如果存在,证明这次请求和上次请求是同一个浏览器发送的

如果有多个浏览器同时请求服务器,服务器会根据SessionID找到对应的浏览器
 
        两次请求判断是否来自同一个会话/是同一个sessionid [只要之前的窗口不关闭]
       一个浏览器 两个窗口 一个会话 都是从同一个缓存中取数据  -->一样的
        两个浏览器 两个窗口 两个会话


2.5 四种会话跟踪技术比较及应用场景

通过URL重写地址传递参数 它可以把会话ID编码在URL中,即使浏览器禁用了cookie也可以实现会话跟踪
隐藏表单域 非常适合需要大量数据存储的会话应用
Cookie:一个 Cookie 是一个小的,已命名数据元素。服务器使用 SET-Cookie 头标将它作为 HTTP响应的一部分传送到客户端,客户端被请求保存 Cookie 值,在对同一服务器的后续请求使用一个Cookie 头标将之返回到服务器。与其它技术比较,Cookie 的一个优点是在浏览器会话结束后,甚至在客户端计算机重启后它仍可以保留其值 通过cookie保存在浏览器缓存。通过名值对保存在浏览器中 ,可以设置cookie的过期时间属性来指定cookie的有效期。当下次浏览器发出请求时,会检索其保存的cookie。应用于自动登录、记录浏览过的商品。同时由于只能保存在浏览器的文本中,容易泄露个人信息,有时用户会禁用掉cookie

隐藏域和URL重写有着共同的优点:
它们在Cookie被禁用或者根本不支持的情况下依旧能够工作。
缺点:
所有页面必须是表单提交之后的结果,还有涉及许多冗长的处理工作。


3.Cookie与Session的区别

a、cookie是保存在浏览器缓存当中的,而session是保存在服务器中的。
b、cookie比session不安全,可能会被用户禁用。
c、cookie可以设置有效期,没到有效期之前会一直存在浏览器缓存中.
   临时性Cookie存在浏览器的缓存中,关掉浏览器,会清空.
   永久性Cookie是存在临时文件中,到达有效期前,一直存在
    而session在关闭浏览器之后就会被清空。

  //URL
 <form action="updateInfoChat.jsp?id=1" method="post">
 </form>
 //隐藏表单域
 <form action="updateInfoChat.jsp" method="post">
 <input type="hidden" name="userid" value=1/>
 </form>
 

            //URL 与 隐藏表单域 获取提交数据的方法一样
            String id=request.getParameter("id");   


           //创建Cookie对象
    	   Cookie cookieName=new Cookie("userName",userName);
    	   cookieName.setMaxAge(60*60);
    	   //将Cookie对象响应给客户端
    	   response.addCookie(cookieName);
    	   
    	   //创建Cookie对象
    	   Cookie cookiePwd=new Cookie("password",password);
    	   cookiePwd.setMaxAge(60*60);
    	   //将Cookie对象响应给客户端
    	   response.addCookie(cookiePwd);


      String cuserName="";
      String cuserPwd="";
      //获得Cookie中的数据
      Cookie[] cookies=request.getCookies();
      if(cookies!=null){

       for(int i=0;i<cookies.length;i++){
    	   String name=cookies[i].getName();
    	  if(name.equals("userName")){
    		   cuserName=cookies[i].getValue();
    	   }
    	   if(name.equals("password")){
    		   cuserPwd=cookies[i].getValue();
    	   }
    //  System.out.println(cookies[i].getName()+"< > "+cookies[i].getValue());
       }
   }



          session.setAttribute("user",userName);

 //Object 强制转型为String
 String userName2=(String)session.getAttribute("user");



4.JSP的隐式对象[9个]


4.1  用来数据共享的对象:[存储数据]  [容器对象]
pageContext:   在本页共享数据/数据的可用范围在本页
request:        在同一次请求响应过程中共享数据
session:        在同一个会话中共享数据 [不关闭浏览器]
application:  在应用程序运行期间共享数据[不关闭服务器]

page是代表与一个页面相关的对象和属性。一个页面有一个编译好的Java Servlet类(可以带有任何的include指令,但是没有include动作)表示。这既包括servlet又包括被编译成servlet的JSP页面。

request是代表与Web客户机发出的一个请求相关的对象和属性,一个请求可能跨越多个页面,涉及多个Web组件  request保存在一次服务器请求范围内。request对象从客户端向服务器发出请求,包括用户提交的信息以及客户端的一些信息。用户可以通过html表单post方法、get方法或URL重写方法提交数据,然后通过request方法来获取这些数据。
(由于forward指令和include动作的关系)

session是代表与用于某个web客户机的一个用户体验相关的对象和属性。一个Web回话可以也经常会跨越多个客户机请求。session保存在一次会话范围内。session对象在浏览器第一次发送请求给服务器的时候创建,并且分配一个sessionID给浏览器,处理和保存这一次会话过程中用户的各种信息,直到它的生命周期被超过会被人为释放为止

application是代表与整个web应用程序想关的对象和属性,着实质上是跨越整个web应用程序,包括多个页面、请求和会话的一个全局作用域。


解释 request请求对象的应用范围  涉及include/forward 与重定向 的区别
----------------------------
include/forward 与重定向 的区别
include 转发 包含之前的页面 forward 转发 不包含之前的页面
1.URL改变 
2.重定向 重新发起一次请求  forward/include 同一次请求
-------------------------------
index.jsp
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%            
          //存储
          pageContext.setAttribute("pageContext",1);
          request.setAttribute("request",1);
          session.setAttribute("session",1);
          application.setAttribute("application",1);

          //在本页面获取
           Object obj=pageContext.getAttribute("pageContext");
         Object obj1=request.getAttribute("request");
         Object obj2=session.getAttribute("session");
         Object obj3=application.getAttribute("application");
%>

    pageContext:<%=obj %> <br/>
    request:    <%=obj1 %><br/>
    session:    <%=obj2 %><br/>
    application:<%=obj3 %><br/>
<%
    request.getRequestDispatcher("index2.jsp").forward(request,response);
  //response.sendRedirect("index2.jsp");
%>
</body>
</html>




没有转向其他界面



<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%            
         
         //在转发后的页获取
           Object obj=pageContext.getAttribute("pageContext");
         Object obj1=request.getAttribute("request");
         Object obj2=session.getAttribute("session");
         Object obj3=application.getAttribute("application");
%>

         这里是index2.jsp的数据 <br/>
          pageContext:<%=obj %> <br/>
          request:    <%=obj1 %><br/>
          session:    <%=obj2 %><br/>
          application:<%=obj3 %><br/>
<%
  request.getRequestDispatcher("index3.jsp").forward(request, response);
%>
</body>
</html>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<%            
         
         //在转发后的页获取
           Object obj=pageContext.getAttribute("pageContext");
         Object obj1=request.getAttribute("request");
         Object obj2=session.getAttribute("session");
         Object obj3=application.getAttribute("application");
%>

      这里是index3.jsp的数据 <br/>
    pageContext:<%=obj %> <br/>
    request:    <%=obj1 %><br/>
    session:    <%=obj2 %><br/>
    application:<%=obj3 %><br/>

</body>
</html>


forward/include  转向其他界面



重定向转发



关闭浏览器 重新发起请求[另一次会话]



重启服务器




4.2  和Servlet有关的对象:
page: 指jsp页面本身    [page]==[this]
config: 用来存储jsp配置信息的对象

JSP与serlet一样都可以配置web.xml
web.xml 可以添加配置参数 [切换数据库时 不更改代码]
/aa  经过web.xml  参数有值 url 不经过web.xml 参数无值


<servlet>
  	<servlet-name>aa</servlet-name>
  	<jsp-file>/index5.jsp</jsp-file>
  	<init-param>
  		<param-name>className</param-name>
  		<param-value>oracle.jdbc.driver.OracleDriver</param-value>
  	</init-param>
  	<init-param>
  		<param-name>url</param-name>
  		<param-value>jdbc:oracle:thin:@127.0.0.1:1521:ORCL</param-value>
  	</init-param>
  	<init-param>
  		<param-name>user</param-name>
  		<param-value>scott</param-value>
  	</init-param>
  		<init-param>
  		<param-name>pwd</param-name>
  		<param-value>tiger</param-value>
  	</init-param>
  </servlet>
  <servlet-mapping>
  	<servlet-name>aa</servlet-name>
  	<url-pattern>/aa</url-pattern>
  </servlet-mapping>


<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
              这个是index5.jsp!    
<%
	String className = config.getInitParameter("className");
	String url = config.getInitParameter("url");
	String user = config.getInitParameter("user");
	String pwd = config.getInitParameter("pwd");
%>   

<%=className %> <br/>
<%=url %> <br/>
<%=user %> <br/>
<%=pwd %> <br/> 
</body>
</html>








4.3  与输入输出有关的对象:
out 向浏览器输出信息
request:包含请求信息
response:包含的响应信息

4.4 和异常处理有关的对象
exception 用来处理异常的对象
定义错误页面              -->才有exception对象
<%@ page isErrorPage="true" %>

如果页面需要处理异常
<%@ page errorPage="error.jsp"%>







猜你喜欢

转载自liuyuan418921673.iteye.com/blog/2279882