会话技术
会话:一次会话中包含多次请求和响应
一次会话:浏览器第一次给服务器资源发送请求会话建立,直到有一方断开会话结束
功能:在一次会话的范围内的多次请求间共享数据
方式:
1.客户端会话技术Cookie
2.服务器端会话技术Session
Cookie
概念:客户端会话技术,将数据保存到客户端
使用步骤:
1.创建Cookie对象,绑定数据
new Cookie(String name ,String value)
2.发送Cookie对象
response.addCookie(Cookie cookie)
3.获取Cookie,接收数据
Cookie[] request.getCookies()
原理:
服务器第一次创建cookie并发送给浏览器是通过set-Cookie响应头将数据发送给浏览器并保存,服务器从浏览器获取Cookie是通过将请求头Cookie发给服务器。
细节:
1.一次可以发送多个cookie,使用response调用多次addCookie方法即可
2.Cookie的保存时间
1.默认情况下当浏览器关闭后,Cookie被销毁
2.持久化存储:setMaxAge(int seconds)
参数的取值:
- 整数:代表将Cookie数据写到硬盘的文件中持久化存储,参数代表Cookie的存储时间,到时间后会自动删除Cookie
- 负数:代表默认值,即关闭浏览器Cookie被销毁
- 零:代表删除Cookie消息
3.在tomcat8版本之前Cookie不能直接存储中文数据(解决:将中文数据转码,一般采用URL编码),但是在tomcat8版本之后Cookie可以直接存储中文数据,一些特殊字符还是不支持
建议:使用URL编码存储Cookie,使用URL解码解析Cookie
使用URLEncoder.encode(String value,String charset)编码
使用URLDecoder.decode(String value,String charset)解码
4.Cookie共享问题
- 在一个tomcat下部署了多个web项目默认情况下Cookie不能共享
- setPath(String path):设置Cookie的获取范围,默认情况下设置当前项目的虚拟目录
- 若设置cookie.setPath("/")(斜杠代表当前项目的根路径),则服务器中的多个web项目可以共享Cookie
- 不同tomcat服务器间cookie共享
若设置cookie.setdomain(“一级域名”),则一级域名相同的多个服务器可以共享Cookie
例:teiba,baidu.com和news.baidu.com若设置cookie.setdomain(".baidu.com")则可以共享Cookie,一级域名:".baidu.com",二级域名:"teiba"和”news“
特点
1.cookie存储数据在客户端浏览器
2.浏览器对于单个cookie的大小有限制(4kb),以及对同一个域名下的cookie数量有限制(20)
作用
1.cookie一般用于存储少量不太敏感的数据
2.在不登陆的情况下完成服务器对客户端的身份识别
案例
需求:
1.访问一个servlet,如果是第一次访问则提示:您好,欢迎您首次访问
2.如果不是第一次访问,则提示:欢迎回来,您上次的访问时间为:显示时间字符串
分析:
1.采用Cookie来完成
2.在服务器中的Servlet判断是否有一个名为lastTime的cookie
1.有,不是第一次访问
- 响应数据:欢迎回来,您上次的访问时间为:显示时间字符串
- 写回当前时间给cookie
2.没有,第一次访问
-
响应数据:您好,欢迎您首次访问
-
写回当前时间给cookie
例:package com.fengqi.web.instance; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.net.URLDecoder; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.Date; /** * @Author: NieFengQi * @Date: 2019/8/1 19:58 * @Decription: */ @WebServlet("/cookieTest") public class CookieTest extends HttpServlet { protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置响应数据字符集 response.setContentType("text/html;charset=utf-8"); //没有cookie为lastTime boolean flag = false; //获取cookie Cookie[] cookies = request.getCookies(); if (cookies != null && cookies.length != 0){ //遍历cookie for (Cookie cookie : cookies) { //若存在lastTime的cookie if ("lastTime".equals(cookie.getName())){ flag = true;//存在lastTime则标记为true //响应数据到页面 String value = cookie.getValue(); value = URLDecoder.decode(value,"utf-8"); response.getWriter().write("<h1>欢迎回来,您上次的访问时间为:"+value+"</h1>"); //获取当前时间,并设置本地格式 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); String str_date = sdf.format(date); //使用URL编码str_date str_date = URLEncoder.encode(str_date, "utf-8"); //将编码后的时间字符串写回cookie cookie.setValue(str_date); //设置cookie存活时间,并响应回去 cookie.setMaxAge(60 * 60 * 24 * 30); response.addCookie(cookie); //跳出循环 break; } } } if (cookies == null || cookies.length == 0 || flag == false){ //获取当前时间,并设置本地格式 Date date = new Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd天 HH:mm:ss"); String str_date = sdf.format(date); //使用URL编码str_date str_date = URLEncoder.encode(str_date, "utf-8"); //创建名为lastTime的Cookie Cookie cookie = new Cookie("lastTime", str_date); //设置cookie存活时间,并响应回去 cookie.setMaxAge(60 * 60 * 24 * 30); response.addCookie(cookie); //响应数据到页面 response.getWriter().write("<h1>您好,欢迎您首次访问</h1>"); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { this.doPost(request, response); } }
JSP入门
jsp:java server page java服务器端页面
一个特殊的页面,其中既可以定义java代码,也可以直接定义html标签
用于简化书写
原理:JSP本质就是一个Servlet
jsp的脚本:定义java代码的方式
1.<% java代码 %>:定义的java代码在service方法中,service方法中可以定义什么该脚本就可以定义什么
2.<%! java代码 %>:定义的java代码在jsp转换后的java类的成员位置,可以定义成员变量和成员方法以及代码块(使用较少)
3.<%= java代码 %>:这个脚本相当于输出语句,会将java代码输出到页面,输出语句可以定义什么,该脚本就可以定义什么
jsp的内置对象:在jsp页面不需要获取和创建就可以直接使用的对象
jsp一共有九个内置对象:request、response、out(字符输出流对象)等
out:out.writer类似于response.getWriter(),两者区别:在tomcat响应数据到页面之前,会先找response的缓冲区,再找out的缓冲区;因此response.getWriter()输出的数据永远在out.writer之前
Session
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象(HttpSession)中
HttpSession对象的常用方法:
Object getAttribute(String name)
void setAttributte(String name,Object value)
void removeAttribute(String name)
原理
session是依赖于cookie的,当一次获取session时响应头中会包含一个set-cookie,set-cookie中包含了一个JSESSIONID的键值对,它可以确保session的唯一性,当第二次获取session时请求头cookie中也包含了JSESSIONID的键值对
细节
1.当客户端关闭后服务器不关闭,两次获取的session默认情况下不是同一个,因为客户端关闭后一次会话已经结束;如果需要相同则可以创建Cookie,键设置为JSESSIONID,值设置为session.getId(),并设置Cookie的存活时间,这样在Cookie的存活时间内,可以让两次获取为同一个sesson
2.客户端不关闭服务器关闭后,两次获取的session默认情况下不是同一个,因为服务器关闭后一次会话已经结束
服务器关闭后为确保数据不会丢失:
session的钝化:在服务器正常关闭之前,将session对象序列化到硬盘上
session的活化:在服务器启动后,将session文件转化为内存中的session对象
tomcat会自动完成session的钝化(session对象的序列化)和session的活化(session对象的反序列化),并将session文件存在work目录下,这样就可以确保数据不会丢失;而idea编辑器关闭服务器后也会创建session文件存在work目录下,但是重新启动后会把work目录删除并创建新的work目录,这样session中数据就丢失了
3.销毁session的方式
- 服务器关闭
- 调用invalidate()方法
- session的默认失效时间为30分钟(可以在tomcat的web.xml文件中配置session-config设置session的默认失效时间,tomcat的web.xml文件为所有项目的父文件,或者在当前项目的web.xml中配置)
特点
1.用于存储一次会话多次请求间的数据,存在服务器端
2.session可以存储任意类型任意大小的数据
session与cookie的区别
1.session存储数据在服务器端,cookie存储数据在客户端
2.session没有数据类型,数据大小的限制,而cookie有
3.session数据安全,而cookie相对于不安全
验证码案例
需求:
1.访问带有验证码的登录页面login.jsp
2.用户输入用户名、密码及验证码
如果用户名和密码输入有误,则跳转到登陆页面,提示:用户名或密码错误
如果验证码输入有误,则跳转到登陆页面,提示:验证码错误
如果全部输入正确,则跳转到主页success.jsp,显示用户名,欢迎您