会话技术:记录用户上次访问时间
jsp:java server pages(java服务器页面),本质上是一个servlet,在html代码中嵌套java代码,运行在服务器端,用于处理请求,生成动态内容
对应的java和class文件在tomcat目录下的work目录,后缀名为 .jsp
jsp的脚本

<%...%>java程序片段:生成在_jspservlce方法中
 <%=...%>输出表达式:生成在_jspservlce方法中,相当于在java中调用out.print()方法
 <%!...%>声明成员:定义在servlet中
 例如jap页面中:
 <%
 int i = 10
 %>
 <%=i
 %>
 <%=k
 %>
 <%!
 int k = 0
 %>


会话技术:用户打开浏览器,访问不同的资源,直到浏览器关闭,称之为一次会话
作用:http协议是一个无状态的的协议,不记录上次访问的内容,而通过会话技术,可以将上次访问的内容保存
例如在用户登录,验证码,购物车,访问记录等等常用的场景
cookie:浏览器端的会话技术
由服务器生成,通过response将cookie写回浏览器(cookie),保留在浏览器上,下一次访问,浏览器根据一定规则通过request的头将cookie发送至服务器
cookie的api:

new Cookie(String key,String value)用于生成一个cookie
 response.addCookie(Cookie)用于将生成的cookie写回浏览器
 Cookie[] request.getCookies()用于在浏览器端获得cookie
 getName()用于获取指定cookie的key值
 getValue()用于获取cookie的value值
 response.setContentType("text/html;charset=utf-8");
 例子:
 PrintWriter w = response.getWriter();
 //1.创建一个cookie
 Cookie c = new Cookie("akey","avalue");
 //2.写回浏览器
 response.addCookie(c);
 w.print("cookie c 已写回");
 实例-记录上次访问时间(一次会话):
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.Date;


 import javax.servlet.ServletException;
 import javax.servlet.http.Cookie;
 import javax.servlet.http.HttpServlet;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;


 public class RemTimeServlet extends HttpServlet {


 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 //1.设置编码
 response.setContentType("text/html;charset=utf-8");
 PrintWriter w = response.getWriter();
 //2.获取指定名称cookie
 Cookie c = getCookieByName("lastTime",request.getCookies());
 //3.判断cookie是否为空
 if(c == null){
 w.print("您是第一次访问");
 }else{
 //若cookie不为空,则展示上一次访问时间
 String value = c.getValue();
 long time = Long.parseLong(value);
 Date date = new Date(time);
 w.print("您上次访问时间为:"+date.toLocaleString());
 }
 //4.记录当前访问时间

 c = new Cookie("lastTime",new Date().getTime()+"");
 c.setMaxAge(3600)//设置cookie永久化时间,服务器重启任然存在
 //5.创建cookie并写回浏览器
 response.addCookie(c);
 }
 /**
 * 通过名称获取一个Cookie数组中指定的Cookie
 * @param name 需要获取的cookie名称
 * @param cookies Cookie数组
 * @return
 */
 private Cookie getCookieByName(String name, Cookie[] cookies) {
 if(cookies != null){
 for (Cookie cookie : cookies) {
 if(name.equals(cookie.getName())){
 return cookie;
 }
 }
 }
 return null;
 }
 public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 }
 }


Cookie其他方法:
setMaxAge(int secound):设置Cookie在浏览器端持久化时间,以秒为时间,若设置为0,删除cookie
setPath(String path):设置cookie的路径,即当我们访问的路径中包含此path,会携带此cookie
默认路径为访问servlet路径,从"/"项目名开始,到左后一个"/"结束,例如servlet路径为/Pro/first/secound/servlet
则默认路径为/pro/first/secound,只有访问包含这个路径上的资源才会携带响应的cookie
手动设置路径也需要以"/项目名"开始,以"/"结尾
session:服务器端的会话技术,底层依赖于Cookie
当第一次访问服务器,服务器获取一个Cookie(id),有两种结果
如果不能获取id,则创建一个session,将数据保存到session中,将session的id通过cookie返回给浏览器
如果能获取id,则拿着id去服务器中查找有无此session
若查找到,直接拿来使用,将当前sessin的id返回给浏览器
若无法查到,创建一个session
获取一个session:
HttpSession request.getSession() 也是一种域对象
可以使用xxxAttribute存储数据,在调用request.getsession()创建,销毁在服务器关闭的时候
session会超时,默认超时时间30分钟,在web.xml中配置,可以通过setMaxInactiveInterval(int secounds)手动设置
通过invalidate()可以销毁session