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);
}
}