会话技术是帮助服务器记住客户端状态的(区分客户端的)。将客户访问的信息存在本地的叫Cookie技术,存在服务器上的叫Session技术。
注意:
学习分为两个方面
//1创建cookie对象,cookie不能存中文,只能存储非中文字符串
Cookie cookie = new Cookie("name", "zhangsan");
//2以头的形式将cookie中的信息发送到客户端
response.addCookie(cookie);
默认Cookie的级别是会话级别,即关掉浏览器,缓存的东西就被清除。那么如何让cookie持久化呢?
如果访问每一个网页都带着cookie,这会增加响应时间。因此我们应该为cookie指定访问哪些资源时需要携带的路径。
注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带该cookie信息。
// 1创建cookie对象,cookie不能存中文,只能存储非中文字符串
Cookie cookie = new Cookie("name", "zhangsan");
// 1.1为cookie对象设置持久化时间
cookie.setMaxAge(1 * 10);// 单位是秒
// 1.2指定需要携带cookie的路径
// 这句话的意思是只在访问/sendCookie时才携带此cookie
// 注意:如果不设置携带路径,那么该cookie信息会在访问产生该cookie的web资源所在的路径都携带该cookie信息。
cookie.setPath("/WEWB16/sendCookie");
// 2以头的形式将cookie中的信息发送到客户端
response.addCookie(cookie);
// 获取服务器向客户端写的cookie的数据
Cookie[] cookies = request.getCookies();
// 通过名字获得想要的cookie
if (cookies != null) {
for (Cookie cookie : cookies) {
// 获得cookie的name
String cookieName = cookie.getName();
if ("name".equals(cookieName)) {
// 获得该cookie的值
String cookieValue = cookie.getValue();
System.out.println(cookieValue);
}
}
}
new Date()
,并把当前时间以cookie的形式写给客户端protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// response.setCharacterEncoding("UTF-8");
// 获得当前时间
Date date = new Date();
DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
String currentTime = format.format(date).replace(" ", "9999");
// 1创建一个cookie,记录当前的最新访问时间
Cookie cookie = new Cookie("lastAccessTime", currentTime);
cookie.setMaxAge(60 * 10 * 60);
response.addCookie(cookie);
// 2获得客户端携带的名字为lastAccessTime的cookie
Cookie[] cookies = request.getCookies();
String lastAccessTime = null;
if (cookies != null) {
for (Cookie coo : cookies) {
// 第一次这段代码是不执行的,因此lastAccessTime还是空串
if ("lastAccessTime".equals(coo.getName())) {
lastAccessTime = coo.getValue().replace("9999", " ");
}
}
} // if
response.setContentType("text/html;charset=UTF-8");
if (lastAccessTime == null) {
response.getWriter().write("你是第一次访问");
} else {
response.getWriter().write("你上次访问的时间是:" + lastAccessTime);
}
}
tomcat版本过高会出现错误
An invalid character [32] was present in the Cookie value
这个错误是由于格式化的时间字符串中有空格,而cookie的值中不能有空格([32]),解决办法是
解决问题的方法其实很简单,只要字符串中不存在空格即可成功。
思路:用其他cookie允许的字符代替空格“ ”,之后记得换回来即可,程序成功运行。
### 三、Session技术
session技术是基于cookie技术的
学习内容包括两块内容
发送编号JSESSIONID(用于存储session编号的)
和根据编号去寻找session区域位置,这些操作是客户端和服务器自动完成,不要手动编码。
// 创建属于该客户端(会话)的私有session区域
HttpSession session = request.getSession();
//获得该session对象的编号id
String sessionId = session.getId();
response.getWriter().write("JSESSIONID=" + sessionId);
request.getSession()方法内部会判断,该客户端是否在服务器端已经存在session
session也是一个存储数据的区域对象,所以也具有以下方法:
HttpSesion request.getSession()
的时候创建<session-config>
<session-timeout>30</session-timeout>
</session-config>
默认在一次会话中,也就是说,一次会话中任何资源共用一个session对象
面试题:
浏览器关闭,session就销毁了。这种说法对吗?
session是存在服务器端,客户端关闭不影响。服务器有自己的销毁方式
由于存储JSESSIONID编号的cookie默认是会话级别的,一关闭浏览器就会失效,所以需要为它持久化。
HttpSession session = request.getSession();
session.setAttribute("name", "Tom");
//获得该session对象的编号id
String sessionId = session.getId();
//手动创建一个存储JSESSIONID的cookie,并设置时间,完成JSESSIONID的持久化
Cookie cookie = new Cookie("JSESSIONID", sessionId);
cookie.setPath("/WEB16/");
cookie.setMaxAge(10*60);//10分钟
response.addCookie(cookie);
// 验证用户密码之间先进行验证码校验
// 获得用户在页面输入的验证码
String checkCode_client = request.getParameter("checkCode");
// 获得生成图片的文字的验证码
String checkCode_session = (String) request.getSession().getAttribute("checkCode");
// 对比用户输入的和生成的验证码是否一致
if (!checkCode_client.equals(checkCode_session)) {
request.setAttribute("loginErrorInfo", "您的验证码不正确");
request.getRequestDispatcher("/login.jsp").forward(request, response);
return;
}
会话技术
原文:https://www.cnblogs.com/zxfei/p/11012814.html