标签:cat 绑定 gem 发送请求 相关 prot 分析 硬盘 对象序列化
前言代码演示:演示Cookie的使用步骤
(1) 此工程Tomcat的设置:
(2) 在src下创建CookieTest1.java
@WebServlet("/CookieTest1")
public class CookieTest1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1\. 创建Cookie对象,参数类似键值对
Cookie cookie = new Cookie("msg", "hello");
//2\. 客户端向浏览器发送Cookie
response.addCookie(cookie);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
(3) 在src下创建CookieTest2.java
@WebServlet("/CookieTest2")
public class CookieTest2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3\. 服务器获取Cookie对象
Cookie[] cookies = request.getCookies();
//4\. 服务器获取Cookie对象的值
for (Cookie cookie :
cookies) {
String name = cookie.getName();
String value = cookie.getValue();
System.out.println("获得的Cookie对象的值:" + name + ":" + value);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
运行结果:
在浏览器地址栏先输入:http://localhost:8080/MyTest/CookieTest1
后输入:http://localhost:8080/MyTest/CookieTest2
控制台输出:获得的Cookie对象的值:msg:hello
1.一次可以发送多个Cookie对象,使用response调用多次addCookie方法即可
2.Cookie在浏览器中保存的时间:
(1) 默认情况下,当浏览器关闭后,Cookie数据被销毁
(2) 持久化存储:
使用Cookie对象的setMaxAge(int seconds)方法:
a. 正数:将Cookie数据写到硬盘中存储,参数指定存活的秒数,时间到后,数据失效, 此时间指的是创建cookie后开始计时,并不是关闭浏览器后才开始计时
b. 负数:默认情况
c. 零:删除cookie信息
3.在Tomcat 8之后Cookie可以存中文,但特殊中文字符仍不支持,建议使用URL编码格式
4.Cookie的共享问题:
(1) 一个Tomcat服务器中,部署了多个web项目,这些web项目cookie的共享说明:
① 默认情况cookie无法共享
② 使用Cookie对象的setPath(String path)方法设置cookie的获取范围:
a. 默认情况,参数是web工程路径,只有这个工程才可以访问到,其余工程无法访问
b. 如果要共享,可以设置参数为”/” ( /被浏览器解析得到的地址为http://ip:port/ )
(2) 不同的Tomcat服务器间cookie的共享说明:
使用Cookie对象的setDomain(String path)方法,参数设置为一级域名,则一级域名相同的不同服务器之间Cookie可共享
如:setDomain(“.baidu.com”),则tieba.baidu.com与news.baidu.com等的cookie可共享
1.Cookie在客户端存储数据,客户端有了cookie之后,每次发送请求都会把cookie发送给服务器
2.浏览器对单个Cookie有大小限制(4KB),对同一个域名下的总cookie数量也有限制(20个)
3.作用:
(1)Cookie一般用于存储少量的安全性较低的数据
(2)在不登陆的情况下,完成服务器对客户端的身份识别,如没有登录百度账号的前提下打开百 度,设置搜索引擎搜索时不提示,以后打开浏览器访问百度时,不会再出现搜索提示框,原 理:百度服务器将设置的Cookie信息保存到浏览器,下次访问百度时,百度服务器获取浏览 器的Cookie,根据Cookie的值决定要不要显示提示框
代码演示:使用jsp页面完成此案例
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>CookieTest</title>
</head>
<body>
<%-- jsp页面通过首行的page标签自动的设置响应的格式,所以向浏览器输出数据不会乱码 --%>
<%
//1\. 服务器获取客户端的所有cookie
Cookie[] cookies = request.getCookies();
//2\. 获取的cookie不一定含有lastTime,用一个布尔类型判断
boolean flag = false;
//3\. 遍历cookie数组,判断是否有lastTime
if(cookies != null && cookies.length > 0) {
for (Cookie cookie :
cookies) {
String cookieName = cookie.getName();
if ("lastTime".equals(cookieName)) {
// 有lastTime,不是第一次访问
flag = true;
// 将现在的时间写回lastTime的cookie中
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String format = sdf.format(date);
// 防止乱码,向cookie对象中保存的中文数据使用URL编码
format = URLEncoder.encode(format, "UTF-8");
// 向名为lastTime的cookie中保存此时间
cookie.setValue(format);
// 设置cookie的存活时间
cookie.setMaxAge(60 * 60 * 24 * 30); //一个月
// 将cookie写回客户端
response.addCookie(cookie);
// 获取此cookie的value时间值,用于写出时间到浏览器
String cookieValue = cookie.getValue();
cookieValue = URLDecoder.decode(cookieValue, "UTF-8");
out.write("欢迎回来,您上次的访问时间是:" + cookieValue);
break; //找到了需要的cookie,就不需要判断别的cookie了
}
}
}
%>
<%
if(cookies == null || cookies.length == 0 || flag == false) {
// 没有lastTime,第一次访问,将当前时间保存至cookie,向客户端传递此cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
String format = sdf.format(date);
format = URLEncoder.encode(format, "UTF-8");
Cookie cookie = new Cookie("lastTime", format);
cookie.setMaxAge(60 * 60 * 24 * 30);
response.addCookie(cookie);
out.write("您好,欢迎您首次访问");
}
%>
</body>
</html>
代码演示:演示Session的使用
(1) 在src下创建SessionDemo1.java
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1\. 创建Session会话
HttpSession session = request.getSession();
//2\. 存储数据
session.setAttribute("msg", "Hello! Session!");
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
(2) 在src下创建SessionDemo2.java
@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1\. 获取Session
HttpSession session = request.getSession();
//2\. 获取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
运行结果:
在浏览器地址栏先输入:http://localhost:8080/MyTest/SessionDemo1
后输入:http://localhost:8080/MyTest/SessionDemo2
控制台输出:Hello! Session!
上述程序原理:Session底层是基于Cookie来实现的
注意:每个Session会话都有一个唯一的id值作为标识,getId方法可得到此id值
Session被销毁的方式
(1)服务器关闭
(2)Session对象调用invalidate()
(3)Session默认失效时间:30分钟,可以到web.xml中修改配置文件修改默认失效时间
<session-config>
<session-timeout>30</session-timeout>
</session-config>
客户端关闭之后服务器不关闭,两次获取的Session是否为同一个?
(1) 默认情况下,不是,Cookie消失,其中的Session自然也消失
(2) 如果需要相同,进行如下操作:
客户端不关闭,服务器关闭之后,两次获取的Session是否为同一个?
不是同一个Session,但是为了保证数据的不丢失,Tomcat服务器自动完成:
(1) Session的钝化:
在服务器正常关闭之前,将Session对象序列化到硬盘上
(2) Session的活化:
在服务器启动之后,将Session文件反序列化成为内存中的Session对象
注意:也就是说即使获取的不是同一个Session,但是Session中的数据都是相同的
Session的特点
(1) Session用于存储一次会话的多次请求数据,存在服务器端,一次会话只有一个session对象
(2) Session可以存储任意类型,任意大小的数据
说明:成功登录之后,重启浏览器,再次登录时,浏览器记住了上次登录的用户名
代码演示:免用户名登录的使用
(1) 创建login.jsp
<body>
<form action="http://localhost:8080/MyTest/LoginServlet" method="post">
用户名:<input type="text" name="username" value="${cookie.username.value}"> <br>
密码:<input type="password" name="password"> <br>
<input type="submit" value="登录">
</form>
</body>
(2) 创建LoginServlet.java
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
//设置正确的用户名为周杰伦,密码是123
if ("jay".equals(username) && "123".equals(password)) {
Cookie cookie = new Cookie("username", username);
cookie.setMaxAge(60 * 60 * 24 * 7); //cookie保存一周
response.addCookie(cookie);
System.out.println("登陆成功!");
} else {
System.out.println("登陆失败!");
}
}
}
运行结果:
使用正确的用户名和密码之后,再次访问登陆页面,用户名输入框会自动的填入jay
谷歌验证码的使用步骤:
<servlet>
<servlet-name>KaptchaServlet</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>KaptchaServlet</servlet-name>
<url-pattern>/kaptcha.jpg</url-pattern>
</servlet-mapping>
注:代表访问这个Servlet就会生成验证码及图片,并将此验证码保存到Session域中,每次访问都会生成不同的验证码
<body>
<form action="http://localhost:8080/MyTest/Servlet">
验证码:<input type="text" style="width: 80px;" name="code">
<img src="http://localhost:8080/MyTest/kaptcha.jpg" alt="验证码没有找到"
style="width: 100px; height: 28px;" id="code_img"> <br>
<input type="submit" value="登录">
</form>
</body>
public class Servlet extends HttpServlet {
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取Session中的验证码
String attribute = (String) request.getSession().getAttribute(KAPTCHA_SESSION_KEY);
//删除Session中的验证码
request.getSession().removeAttribute(KAPTCHA_SESSION_KEY);
//获取用户输入的验证码
String code = request.getParameter("code");
if (attribute.equalsIgnoreCase(code)) {
System.out.println("验证码正确!");
} else {
System.out.println("验证码错误!");
}
}
}
运行结果:
代码演示:为上述验证码绑定单击事件(使用script标签)
window.onload = function () {
//通过验证码图片的id属性值绑定单击事件
var elementById = document.getElementById("code_img");
elementById.onclick = function () {
//1\. 事件响应的function函数中的this对象是当前正在响应事件的标签的dom对象
//2\. src属性可读可写
this.src = "http://localhost:8080/MyTest/kaptcha.jpg?d=" + new Date();
}
}
运行结果:每次点击验证码的图片都会变成新的验证码,并将新验证码保存到session域中
感谢你看到这里,看完有什么的不懂的可以在评论区问我,觉得文章对你有帮助的话记得给我点个赞,每天都会分享java相关技术文章或行业资讯,欢迎大家关注和转发文章!
金九银十已到!Cookie 和 Session的这些知识你必须知道,面试必问!
标签:cat 绑定 gem 发送请求 相关 prot 分析 硬盘 对象序列化
原文地址:https://blog.51cto.com/14801695/2525184