java web编程学习5

上次学习了cookie,这次当然就学习session了。session和cookie很相像,都是为了解决相似的问题存在的。不同在于,session存在于服务端,而cookie存在于客户端。

上个最简单的demo

package demo;

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("/session.do")
public class SessionServlet 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");
		PrintWriter out = resp.getWriter();
		out.print("hello,session");
		HttpSession session = req.getSession();
		String name = (String) session.getAttribute("name");
		if(name == null) {
			out.print("<br/> no session data now");
			session.setAttribute("name", "tmac");
		}
		else {
			out.println("<br /> hello, " +name);
			session.invalidate();
		}
	}
}

这个demo实现的是当session中存在name的值,则显示并销毁,不存在则创建,所以浏览器显示的就是两种效果:

image

image

我们可以用request的getSession方法得到session,getSession重载了两种方法,getSession()返回一个session,如果不存在则创建一个再返回。而getSession(boolean b)提供了一个选项,如果b==false,不存在session的话返回null。

session提供了getAttribute和setAttribute方法,我们可以获取和存放需要的值。getAttribute返回的是object,这就意味着我们不止可以存放String的值。

session的invalidate方法可以将session失效。setMaxInactiveInterval方法可以设置session 的时间,如果在这段时间内浏览器都没有发送请求的话,session就会自动失效。

这里就有一个问题,发送请求的浏览器有很多,服务器是如何分辨不同的浏览器来获取特定的session呢?在tomcat中,使用session机制的时候,会在客户端设置一个cookie:JSESSIONID,每次发送请求的时候将这个cookie一起放入请求行中,这样tomcat就通过这个id找到对应的session(session提供了getId()方法),这样不同的浏览器就能获取不同的session了。这样的话也有个问题,cookie默认是在关闭浏览器则失效,那么也就说关闭浏览器的话session同样也失效,在开启浏览器发送请求同样会生成一个新的session。当然servlet也提供了设置的接口,我们可以自己设置cookie的存活时间。可以再web.xml中进行设置session-config,也可以实现servletcontextlistener。这个以后再进行学习。

你可能感兴趣的:(java web编程学习5)