session,是服务端用来保存用户信息的技术,与之相对应的是cookie,同样也是保存用户的数据,不过它是存放在客户端的。cookie分为持久性cookie和会话cookie,持久性cookie是被我们设置了保存时间的cookie(通过setMaxAge()),它会被保存在硬盘上的某个文件中,即便我们关闭了浏览器,只要没有超过保存时间,它就不会失效;会话cookie是没有被设置保存时间的cookie,它保存在浏览器的内存中,只要我们关闭浏览器,它就会失效。session是在服务端为每一个用户保存其信息的区域,那么,当我们再次访问服务器,服务器是如何辨别用户的身份,也就是说,它该取用哪个用户的session呢?原来,服务器将cookie返回给客户端的时候,会将一个sessionId放到cookie中,这个sessionId是session的唯一标识,当用户再次访问,会连同这个sessionId给带过去,这样服务器就能区分谁是谁了。
//UserServlet
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//处理乱码,设置请求编码
req.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");
String pwd = req.getParameter("pwd");
//Cookie创建
Cookie c1=new Cookie("name", URLEncoder.encode(name, "UTF-8"));
Cookie c2=new Cookie("pwd", URLEncoder.encode(pwd, "UTF-8"));
c1.setMaxAge(60*2);//设置有效时间为2分钟,默认是关闭浏览器失效
resp.addCookie(c1);
resp.addCookie(c2);
resp.sendRedirect("success.jsp");
}
//success.jsp
<%
Cookie[] cookies=request.getCookies();
for (Cookie c : cookies) {
//判断是否是被编码过的name和pwd
if (c.getName().equals("name") || c.getName().equals("pwd")){
//对值进行解码处理
String s = URLDecoder.decode(c.getValue(), "UTF-8");
System.out.println(c.getName()+":"+s);//name:张三 pwd:234567
}else{
//下面这个就是我们的sessionId
System.out.println(c.getName()+":"+c.getValue());//JSESSIONID:658476B5A435A494E16341560BAB4665
}
}
%>
在上面这个示例中,我们需要注意两个问题:
1.cookie无法保存中文value,如果你想要存放中文的话,需要对value进行编码处理,并且在取出的时候需要进行解码。
2.在创建了cookie之后,一定要将其加入到response对象中(使用addCookie())。
3.如果cookie的名字一样的话,比如说上面的c1和c2我取同一个名字"name"的话,那么c2会将c1的value给覆盖。
HttpSession session = req.getSession();
session.setAttribute("name", name);
session.setAttribute("pwd", pwd);
session.setMaxInactiveInterval(20);//设置session保存时间 session默认保存30分钟
resp.sendRedirect("success.jsp");
//show.jsp
<%
String name=(String) session.getAttribute("name");
String pwd=(String) session.getAttribute("pwd");
System.out.println(name+":"+pwd);//王舞:234567
%>
注意问题:
1.会话是我们打开浏览器–》进行一系列操作–》关闭浏览器的过程,关闭浏览器后本次会话就结束了,如果再次打开浏览器并访问就取不到session里的东西了,除非将session中保存的内容写到某个位置,下次有人访问,再将它读出来。
2.除了使用setMaxInactiveInterval()设置session保存时间,也可以在web.xml中进行统一设置,
50
3.如果使用setAttribute设置的名字一样的话,后面的会将前面的覆盖。
//简单的免登录示例
//index.jsp
<%!String username;%>
<%
username=(String) session.getAttribute("username");
%>
欢迎,<a href="show2.jsp"><%=username==null?"请登录":"用户"+username%></a>
//regist.jsp
<form action="userServlet" method="get">
用户名:<input type="text" name="username"/><br/>
密码:<input type="password" name="password"/><br/>
<input type="submit" value="登录"/>
</form>
//UserServlet
req.setCharacterEncoding("UTF-8");
String username = req.getParameter("username");
String password = req.getParameter("password");
HttpSession session = req.getSession();
session.setAttribute("username", username);
session.setAttribute("name", password);
resp.sendRedirect("index.jsp");