会话技术:记录用户上次访问时间
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