Servlet 三大域对象和会话追踪 - KelovpString

/ 0评 / 0

    继续狗。在Servlet当中数据传递往往依赖三个对象:Request Session 和 Application,他们三个有着共同的作用但是作用域以及产生的办法也不一样 。     

      类型(接口)  对象名
  HttpServletRequest   request
  HttpSession  session
  ServletContext  application

request对象

    生命周期:客户端每次发请求,服务器就会创建一个新的request对象,本次访问结束后,该request对象就会被销毁
    作用范围:使用request存/取数据只能在一次请求之内起作用.比如服务器内部跳转的时候(因为内部跳转客户端只发一次请求).
    注意:客户端重定向是不行的,因为客户端重定向会发出多个请求(多个新的request对象).

    创建办法:在doGet()/service()方法的参数当中都带有

session对象

生命周期:
    getSession()方法第一次被调用时创建session对象。
    session.invalidate()调用的时候会销毁session
    session如果自动超时的话,也会被销毁
    session默认超时时间为30分钟
    session的超时时间可以在代码中设置或者在web.xml中设置
    代码中设置:session.setMaxInactiveInterval(5); 5秒
    web.xml中设置:
    1分钟超时,负数或者0为不限制时间

<session-config>  
    <session-timeout>1</session-timeout>  
</session-config>

    session超时时间是指:客户端不与服务器进行交互的时间

    作用范围:在一个会话之中起作用.一个会话中可以有多个request请求,所以放在session中的数据,可以被多个请求所共享.

    注意:注意服务器正常关闭和非正常关闭对session对象的影响(session被序列化的问题)

application对象

    生命周期:
        启动tomcat服务器的时候,就会被创建,关闭tomcat服务器的时候,就会被销毁,而且每个项目在运行期间,都会有且只有一个application对象
        作用范围:整个项目在运行期间,只有一个application对象,所以这个对象是所有用户共享的,大家都可以向这个对象里面存值,也可以再拿出来.因为这个对象一个项目中只有一个.
使用这三种对象存/取数据
    存值:

request.setAttribute("key", value);
session.setAttribute("key", value);
application.setAttribute("key", value);

    取值:

request.getAttribute("key");
session.getAttribute("key");
application.getAttribute("key");

会话追踪技术:cookie

    http协议的访问是无状态的访问,当前访问是不会知道之前访问的状态的.(http协议的访问是不会帮我们保存访问的记录/痕迹的)。所以当有时候要记录之前的访问状态时就凉了。而会话追踪技术也就这样产生了,而当session创建的时候cookie也会在你的本地被浏览器创建,session是保存在服务器端的一个对象.客户端是没有session的.cookie在客户端和服务器端都会有。但是存在的形式不一样.在客户端cookie是以本地文件(浏览器管理的文件)的形式存在的,在服务器端是以java对象的形式存在.我们平时说说的cookie都是指的客户端文件形式存在的cookie。session是在服务器端保存用户的相关信息,cookie是在客户端保存用户的相关信息。同时cookie还可以在客户端保存session的信息,例如session的id值。

    session和cookie之间的关系

    1.客户端访问服务器的时候,假设服务器创建了一个session对象,服务器端的内存里面同时可能有好多个session对象,分别对应着不同客户端的访问,每一个session对象都有一个唯一的id值,叫做JSESSIONID。
    2.服务器端给客户端产生一个session对象后,会通过这次访问的response对象把这个session的JSESSIONID的值返回给浏览器,浏览器接收到后会把这个值以一个cookie文件的形式保存起来.
    3.在此之后,这个浏览器再发请求到服务器的时候,就会把之前保存在cookie文件中的JSESSIONID的值传给服务器,服务器通过这个JESSIONID的值就能够知道服务器内存中是哪一个session对象和当前这个客户端对应/关联.
    4.这样以来,就能到达一个效果,客户端的每一次访问,在服务器端都能够拿到相同的一个session对象,从而实现不同请求之间通过相同的session对象进行数据的共享.
     用于测试的两个Servlet:

package org.string;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/setcookie")
public class CookieSet extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		Cookie c = new Cookie("name", "zhangsan");
		c.setMaxAge(60);
		resp.addCookie(c);
	}

}
package org.string;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/getcookie")
public class CookieGet extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		Cookie c[] = req.getCookies();
		if(c!=null){
			for(Cookie cs:c){
				System.out.println(cs.getValue());
			}
		}
	}

}

    Session测试:

package book.servlet;

import java.io.IOException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/logincheck")
public class LgoinSession extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		if((req.getParameter("username").equals("root"))&&(req.getParameter("password").equals("123456"))){
			req.getSession();
			RequestDispatcher dispatcher = req.getRequestDispatcher("/book/info.html");
			dispatcher.forward(req, resp);
		}else{
			resp.sendRedirect("error.html");
		}
	}
}
package book.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


//有继续购买
@WebServlet("/buybook")
public class PassInfo extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session = req.getSession();
		resp.setContentType("text/html;charset=utf-8");
		resp.setCharacterEncoding("UTF-8");
		PrintWriter out = resp.getWriter();
		if(req.getParameter("book").equals("book1")){
			session.setAttribute("book1", "[书名:Java从入门到精通,出版社:中国工业出版社,价格:23]");
		}else if(req.getParameter("book").equals("book2")){
			session.setAttribute("book2", "[书名:MySQL从删库到跑路,出版社:NTK出版社,价格:56]");
		}else if(req.getParameter("book").equals("book3")){
			session.setAttribute("book3", "[书名:Python网络数据采集,出版社:KarLS出版社,价格:72]");
		}else if(req.getParameter("book").equals("book4")){
			session.setAttribute("book4", "[书名:PHP从入门到入土,出版社:你们好出版社,价格:19]");
		}
		
		out.println("<html><body><h1>Buy Succeed!</h1>"
				+ "<a href=\"book/info.html\">继续购买</a></body></html>");
		out.flush();
	}
}
package book.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;


//显示当前Session所储存信息
@WebServlet("/showinfo")
public class ShowAllSession extends HttpServlet{
	private static final long serialVersionUID = 1L;
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
			throws ServletException, IOException {
		// TODO Auto-generated method stub
		resp.setContentType("text/html;charset=utf-8");
		resp.setCharacterEncoding("UTF-8");
		HttpSession session = req.getSession();
		PrintWriter out = resp.getWriter();
		for(int i=0;i<=4;i++){
			if(session.getAttribute("book"+i)!=null)
				out.println("已经购买的书有:"+session.getAttribute("book"+i)+"<br>");
		}
		out.flush();
	}
}

    可以简单测试session对象的使用。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注