servlet web会话管理session

 

小案例

package cn.cast.session;

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

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

//购买
public class SessionDemo2 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		HttpSession  session = request.getSession();
		session.setAttribute("name", "洗衣机");
        //摧毁代码session
        //session.invalidate();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}
package cn.cast.session;

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

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

//结账servlet
public class SessionDemo3 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		HttpSession  session = request.getSession();
        //只获取不创建session,在查看购物车时节省性能,假设用户没有购买商品(没有创建session),查看购物车,使用下面的代码就不会创建session,r如果使用上面代码,就会创建session,效果一样但是性能上有优劣。
        HttpSession  session = request.getSession(false);
		String value = (String) session.getAttribute("name");
		out.println("你购买了"+value);
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

session的生命周期,session是会话级别的,打开多个浏览器创建的是隔离的session

并不是打开浏览器就创建,session的创建需要触发,用户点击某个超链接时由servlet创建,在不使用时,默认30分钟后销毁,用户关闭浏览器后session不会立即销毁,也要等到30分钟以后才销毁。

在web.xml中配置session的销毁时间。单位是min

  <session-config>
  <session-timeout>10</session-timeout>
  </session-config>

程序中也能使用代码摧毁session

session.invalidate();

session的实现原理基于cookie

用户访问服务器创建session的时候,服务器会返回一个带有id号的cookie给浏览器,浏览器再次访问浏览器时会带cookie给服务器,如果没有携带cookie给服务器,服务器会创建session,并再次回写cookie.这个cookie没有设有效时间,当浏览器关闭时,cookie就会被摧毁,所以下次打开浏览器访问时会重新创建session.

基于上面的原理,要实现用户在关闭浏览器重新打开的时候,购物信息任然存在就需要设置回写cookie的存在时间(30min).

只需要重写demo2

package cn.cast.session;

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

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//购买
public class SessionDemo2 extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		HttpSession  session = request.getSession();
		
		String sessionid = session.getId();
		Cookie cookie = new Cookie("JSESSIONID", sessionid);
		cookie.setMaxAge(30*60);
		cookie.setPath("/WEB");
		response.addCookie(cookie);
		
		session.setAttribute("name", "洗衣机");
		//session.invalidate();
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

场景:当浏览器禁止使用cookie时,服务器获取不到session

应对方法,当浏览器访问网站的时候服务器就会创建一个session.当用户购买商品时,超链接后面会添加sessionid号,服务器根据这个id号存取数据。

package cn.cast.session;

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

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

public class WelcomeSeverlet extends HttpServlet {
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		response.setCharacterEncoding("UTF-8");
		response.setContentType("text/html;charset=utf-8");
		PrintWriter out = response.getWriter();
		
		request.getSession();
		
		//sun公司提供的带sessionid号的url获取方法,当用户没有禁用cookie时,方法不会重写url
		String url1= response.encodeURL("/WEB/servlet/SessionDemo2");
		String url2= response.encodeURL("/WEB/servlet/SessionDemo3");
		
		out.println("<a href='"+url1+"'>购买</a>");
		out.println("<a href='"+url2+"'>结账</a>");
		
		
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doGet(request, response);
	}

}

禁用cookie后关闭浏览器,开启浏览器时就没办法保存数据了。

猜你喜欢

转载自blog.csdn.net/qq_38125626/article/details/83421610
今日推荐