session(web_session)

1、Session 概述
Session也是一个域对象,可以在自身的属性域中保存数据,在一定范围内共享。

2、Session的工作机制
1)并不是浏览器一访问服务器就创建Session对象,而是只有在服务器端调用request.getSession()方法时,Tomcat服务器才会“创建”Session对象。

2)request.getSession()方法
(1)请求中没有携带任何有关Session的标识,往往就是浏览器第一次访问的时候。
(2)请求中没有携带任何有关Session的标识:Tomcat会创建一个Session对象,并创建一个特殊的Cookie,这个特殊Cookie的name属性是JSESSIONID,值是一个唯一值,而且是随机生成的。将这个JSESSIONID Cookie作为关联这个Session对象的标识写回浏览器。
(3)请求中携带了JSESSIONID时,Tomcat会在已经创建好的Session对象的集合中,查找匹配的Session对象。实现多个请求识别浏览器的身份的目的。
①能找到:返回找到的Session对象
②找不到:创建一个新的Session对象返回.通常由于服务器超时释放。
即:我们是通过JSESSIONID的值找到的session对象。
3)isNew()返回boolean标识当前Session对象是新创建的,还是原有的
4)getId()返回当前Session对象的JSESSIONID值

3、Session的时效管理
Session代表浏览器和服务器之间的一次会话,本来应该在会话开始时创建,会话结束时释放。但是浏览器关闭时,服务器根本检测不到,那就只能由服务器自己设置一个时间了。
[1]自然超时
<1>Tomcat配置文件中web.xml中有默认的超时时间的配置


30 Session对象默认的有效时间是30分钟,指的并不是Session对象从创建开始30分钟后过期,而是从最后一次访问开始,30分钟后失效。 <2>调用Session对象的方法手动设置超时时间 session.setMaxInactiveInterval(10)。以秒为单位 [2]手动调用invalidate()方法直接失效

4、项目阶段
登录成功,记录浏览器信息
1)显示登录用户

//将用户信息保存到Session对象中,到JSP页面中就可以通过Session隐含对象将数据读取出来
 HttpSession session = request.getSession();
 session.setAttribute(“loginUser”, userName);2)退出操作
 String method = request.getParameter(“method”);
 if(“logout”.equals(method)){
 HttpSession session = request.getSession();
 session.invalidate();
 response.sendRedirect(request.getContextPath()+"/index.jsp");
 return;
 }

5、code
1)SessionTestServlet

package com.alex.web.session;

import java.io.IOException;

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 SessionTestServlet extends HttpServlet{

	private static final long serialVersionUID = 1L;
	
	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String username = request.getParameter("username");
		//获取并返回之前分配的session
		//如果之前没分配过,就创建一个
		HttpSession session = request.getSession(true);
		//服务器将JSessionId写到客户端Cookie中了
		System.out.println("JSESSIONID" + session.getId());
		session.setAttribute("username", username);
		
		//一般注销时,需要销毁session
		//表示销毁session
		//session.invalidate();
		
		//注销系统,也可以不杀死session,而是将session数据清理掉
		//删除session存的数据
		//session.removeAttribute("username");
	}

}

2)web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns="http://xmlns.jcp.org/xml/ns/javaee"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	id="WebApp_ID" version="3.1">
	<display-name>web_session</display-name>

	<servlet>
		<servlet-name>SessionTestServlet</servlet-name>
		<servlet-class>com.alex.web.session.SessionTestServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>SessionTestServlet</servlet-name>
		<url-pattern>/SessionTestServlet</url-pattern>
	</servlet-mapping>
	
	<!-- 单位是分钟 -->
	<session-config>
		    <session-timeout>30</session-timeout>
	</session-config>

	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		    <welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

3)testsession.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="SessionTestServlet" method="post">
		用户名<input type="text" name="username" value="alex"/>
		<input type="submit" value="发送POST请求" />
	</form>
</body>
</html>

4)a.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
${sessionScope.username}
</body>
</html>