JavaWeb -- 会话, Cookie 和 Session

1. 会话
Cookie 客户端技术,服务器把每个用户的数据以 cookie 的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的 web 资源时,就会带着各自的数据去。这样, web 资源处理的就是用户各自的数据了。
Session 服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的 session 对象,由于 session 为用户浏览器独享,所以用户在访问服务器的 web 资源时,可以把各自的数据放在各自的 session 中,当用户再去访问服务器中的其它 web 资源时,其它 web 资源再从用户各自的 session 中取出数据为用户服务。
 
2. API
javax.servlet.http.Cookie 类用于创建一个 Cookie response 接口也中定义了一个 addCookie 方法,它用于在其响应头中增加一个相应的 Set-Cookie 头字段。同样, request 接口中也定义了一个 getCookies 方法,它用于获取客户端提交的 Cookie Cookie 类的方法:
public Cookie(String name,String value) setValue getValue 方法  setMaxAge getMaxAge 方法  setPath getPath 方法 setDomain getDomain 方法 getName 方法
 
3. 实例:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		
		PrintWriter out = response.getWriter();
		out.print("上次访问时间: ");
		
		//get Cookie  获得上次写入的cookie
		Cookie[] cookies = request.getCookies();  //从request获得cookie数组
		for(int i=0; cookies!=null && i<cookies.length; i++)
		{
			if( cookies[i].getName().equals("lastAccessTime") )
			{
				long cookieValue = Long.parseLong(cookies[i].getValue());
				Date date = new Date(cookieValue);
				out.print(date.toLocaleString());
			}
		}
		
		//write cookie 写入相应名字的cookie
		Cookie  cookie = new Cookie("lastAccessTime", System.currentTimeMillis()+""); //新建访问时间cookie
		cookie.setMaxAge(1*30*24*3600);
		cookie.setPath("/WebTest3");
		response.addCookie(cookie);  //将cookie添加到response,将会返回到浏览器
		
	}
cookie的一些细节
l 一个Cookie 只能标识一种信息,它至少含有一个标识该信息的名称( NAME )和设置值( VALUE )。
l 一个 WEB 站点可以给一个 WEB 浏览器发送多个 Cookie ,一个 WEB 浏览器也可以存储多个 WEB 站点提供的 Cookie
l 浏览器一般只允许存放 300 Cookie ,每个站点最多存放 20 Cookie ,每个 Cookie 的大小限制为 4KB
l 如果创建了一个 cookie ,并将他发送到浏览器,默认情况下它是一个会话级别的 cookie (即存储在浏览器的内存中),用户退出浏览器之后即被删除。若希望浏览器将该 cookie 存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie
l 注意,删除 cookie时,path 必须一致,否则不会删除
 
4.Session
Session生命周期: 第一次请求request.getSession()时创建, 创建后如果30分钟内没有使用,服务器就将其销毁:
l WEB 开发中,服务器可以为每个用户浏览器创建一个会话对象( session 对象),注意: 一个浏览器独占一个session对象 ( 默认情况下 ) 。因此,在需要保存用户数据时,服务器程序可以把用户数据写到用户浏览器独占的 session 中,当用户使用浏览器访问其它程序时,其它程序可以从用户的 session 中取出该用户的数据,为用户服务。
Session Cookie 的主要区别在于:
Cookie 是把用户的数据写给用户的浏览器。
Session 技术把用户的数据写到用户独占的 session 中。
Session 对象由服务器创建,开发人员可以调用 request 对象的 getSession 方法得到 session 对象。
Web.xml中配置Session生命周期:
  <!-- 10 minutes 10分钟-->
  <session-config>
  	<session-timeout>10</session-timeout>
  </session-config>
实例:
Servlet Demo4 写入Session
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();		
		
		HttpSession session = request.getSession();  //获得Session
		String sessionID = session.getId();
		Cookie cookie = new Cookie("JSESSIONID", sessionID);   
		cookie.setPath("/WebTest3");
		cookie.setMaxAge(30*60);     //设置保存时间,不然关闭浏览器即销毁相应的Cookie
		response.addCookie(cookie);
		session.setAttribute("name", "bug a TV");
		out.print("bug");
		
		//String url1 = response.encodeURL("/WebTest2/Demo4");  //如果浏览器的Cookie功能被关闭,则需要重写URL
		//String url2 = response.encodeURL("/WebTest2/Demo5");				
	}
Servlet Demo5 读出Session
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		HttpSession session = request.getSession(false);
		if(session!=null)
		{
			String product = (String) session.getAttribute("name");
			out.print("name = " + product);
		}
	}

实现自动登录功能
首页JSP代码: welcome.jsp
<body>
	Welcome: ${user.username} <br/>
	<a href="/WebTest3/1.html">Login</a> <br/>
	<a href="/WebTest3/Demo7">Logout</a> <br/>
	
</body>
注册表单 1.html
<form action="/WebTest3/Demo6" method="post">
	用户名:<input type="text" name="username"/> <br/> 
	密码: <input type="password" name="passwd"/><br/> 
	登录: <input type="submit" name="submit"/>  <br/> 
	自动登录:<input type="checkbox" name="autoLogin" value="true"/> <br/> 
</form>
登录处理,建立Session Demo6.java
@WebServlet("/Demo6")
public class Demo6 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Demo6() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=UTF-8");
		PrintWriter out = response.getWriter();
		
		String username = request.getParameter("username");
		String passwd = request.getParameter("passwd");
		//System.out.println("log: " + username + "  " + passwd);
		
		ArrayList<User> list = DB.getAll();  //从数据库获取用户信息
		for(User user : list)
		{
			if(user.getUsername().equals(username) && user.getPasswd().equals(passwd)) //用户名密码校验
			{
				request.getSession().setAttribute("user", user);
				response.sendRedirect("/WebTest3/welcome.jsp"); //获得Session
				return;
			}
		}
		
		out.write("Username or passwd Error");			
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doGet(request, response);
	}
}

class DB
{
	private static ArrayList list;	
	static 
	{
		list = new ArrayList<User>();
		list.add(new User("kevin", "123456"));
		list.add(new User("xiang", "123456"));
	}
	public DB() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public static ArrayList getAll()
	{
		return list;
	}	
}
登录用户User类
public class User implements Serializable
{
	private String username;
	private String passwd;
	
	public User() {
		super();
		// TODO Auto-generated constructor stub
	}
	public User(String username, String passwd) {
		super();
		this.username = username;
		this.passwd = passwd;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPasswd() {
		return passwd;
	}
	public void setPasswd(String passwd) {
		this.passwd = passwd;
	}
}
登录注销Servlet Demo7
public class Demo7 extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public Demo7() {
        super();
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		
		HttpSession session = request.getSession();
		if( session==null)
		{
			response.sendRedirect("/WebTest3/welcome.jsp");
			return;
		}
		session.removeAttribute("user");  //删除Session中的User  注销
		response.sendRedirect("/WebTest3/welcome.jsp");
		
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doGet(request, response);
	}

}





 

 
 
 
 
  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaWeb中的CookieSession是用于在服务器和客户端之存储和传递数据的机制。 Cookie是在客户端(浏览器)保存少量数据的文本文件,它由服务器发送给浏览器,并在浏览器下一次向同一服务器发送请求时被浏览器携带过去。Cookie可以用于实现用户认证、记住登录状态、记录用户行为等功能。在JavaWeb中,可以使用`javax.servlet.http.Cookie`类来创建和设置CookieSession是在服务器端存储用户信息的一种机制。当用户第一次访问服务器时,服务器会为该用户创建一个唯一的会话标识(Session ID),并将该标识保存在Cookie中发送给客户端。客户端在后续的请求中会带上这个Session ID,服务器通过这个Session ID可以获取到对应的会话信息。在JavaWeb中,可以使用`javax.servlet.http.HttpSession`类来创建、获取和操作SessionCookieSession的区别主要有: 1. 存储位置:Cookie存储在客户端,Session存储在服务器端。 2. 容量限制:Cookie有大小限制,一般为4KB左右;Session可以存储较大量的数据。 3. 安全性:Cookie数据存储在客户端,容易被恶意篡改;Session数据存储在服务器端,相对较安全。 4. 生命周期:Cookie可以设置过期时间,可以长期保存在客户端;Session默认情况下会在一段时间内保持活跃,超过时间会被销毁。 在实际应用中,CookieSession常常结合使用,通过Cookie存储Session ID来实现用户的身份验证和状态管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值