**会话:**在Web中,会话表示从浏览器打开某个网站和服务器进行交互,无论进行哪些操作,直到关闭浏览器,这个过程,称之为一次会话
如何算会话结束:
- 客户端关闭
- 服务器销毁
会话所涉及的两个端(客户端和服务端),JavaWeb中针对这两个不同的端,诞生了两个机制
从客户端来看,诞生了Cookie,在本地浏览器留下了标识符,会话从浏览器中提交信息
从服务器端来看,诞生了Session,再服务器端留下了标识符,会话从服务器中提交信息
Cookie
构造器:
Cookie cookie =new Cookie(String name ,String value);
服务器响应cookie给客户端
Response.addCookie(cookie);
服务查看用户带来的请求中是否含有cookie
//可以使用cookie来判断用户是否来过
Cookie[] cookie=Request.getCookie();
//判断cookie是否为空,然后遍历
For(int i=0;i<cookie.length;i++){
Cookie cookie=cookie[i];
cookie.getName();
cookie.getValue();
}
cookie示例:
需求:通过cookie判断用户是否来过,若没有来过,就让他办张卡0_0,若来过,显示上次来的时间
public class CookieTest extends HttpServlet {
//设置全局标识符
boolean flag = false;
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//解决乱码问题:
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
//检查请求的人是否带了Cookie
//通过用户的请求,检查它是否有cookie
Cookie[] cookies = request.getCookies();
System.out.println("cookie:"+cookies);
if (flag){//如果flag是真,来过
if (cookies!=null){//你有cookie
for (int i = 0; i < cookies.length ; i++) {
Cookie cookie = cookies[i];
if (cookie.getName().equals("lastLoginTime")){
response.getWriter().println("你上一次来的时间为:"+cookie.getValue());
System.out.println("刷新了cookie");
}
}
}
}else { //如果flag是真,没来过
response.getWriter().println("你是第一次来,还想要会员套餐");
System.out.println("给该用户一个cookie");
}
//建立一个cookie
Cookie cookie = new Cookie("lastLoginTime",System.currentTimeMillis()+"");
//设置cookie保存的时间 //cookie.setMaxAge();
//把这个cookie发给客户端
response.addCookie(cookie);
//response.addCookie(new Cookie("lastLoginTime",System.currentTimeMillis()+""));
flag = true;
}
}
(别忘记配置web.xml…)
第一次访问的时候,自上而下,还没有创建cookie,因此,此时标识符判断会进入else{}里,接着代码执行,创建cookie,在我们刷新页面后,因为cookie已经在上次创建了,因此这次就会变成了第二次访问,会随之打印上次来的时间
有一个点:在给cookie添加value属性的上次时间时,value应为String类型,我们可以使用System.currentTimeMillis+""拼接的形式,将时间和空字符串拼接来实现
Session
只要客户端一旦连接上服务器,服务器就会自动产生Session;
一个连接对应一个session,session可以在一个会话中传递信息;
//得到sessionID,一次会话,一个seesionID;
HttpSession session =req.getSession();
String id = session.getId();
//输出在网页中
resp.getWriter().println("获得的sessionId:\n"+id);
通过setAttribute设置值。
通过getAttribute获得值。
由服务器端控制,服务器如果重启了,信息就会丢失!
Session示例
需求:使用session在两个servlet之间进行传递数据
servlet01:(将数据写入session中,并输出Sessionid)
public class SessionTest extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题:
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//Session由服务器自动创建,如何获得session
//HttpSession 得到的sessioin对象
HttpSession session = req.getSession();
//得到sessionID,一次会话,一个seesionID;
String id = session.getId();
resp.getWriter().println("获得的sessionId:\n"+id);
String name = "暮凌寒雪";
//向session中存入一个值;
session.setAttribute("name",name);
resp.getWriter().println("存入信息成功:"+name);
}
}
servlet02:将session中的值读取出来,并输出sessionid
//获得session存入的值
public class SessionTest2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doPost(req,resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//解决乱码问题:
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
//获得
HttpSession session = req.getSession();
System.out.println("得到的SessionID:"+session.getId());
String name = (String) session.getAttribute("name");
resp.getWriter().println("得到的session存入的信息"+name);
}
}
(别忘了配置web.xml)
session相对于cookie而言,要简单一些,可以通过get/setAttribute来传入或者读取数据
会话注销方法:
- 可以通过代码注销会话:
session.invalidate();//了解即可,不推荐使用
- 在web.xml中设置会话自动过期,时间是以分钟为单位,
<session-config>
<session-timeout>1</session-timeout>
</session-config>
一分钟过期…