Java Web之Cookie、Session
讲Cookie和Seesion之前,先讲一下HTTP连接其实是无序的,服务器不知道是谁在访问它。现在我们来实现一个简单的邮箱功能。
要求:
1.登录页面登录之后看到收件箱和欢迎我
2.点击收件箱看到几封邮件和欢迎我
3.点击一封邮件显示邮件内容和欢迎我
我们先来用Servlet实现一下试试
首先,写一个HTML 叫login,代码如下
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h3>注册页面</h3>
<form action="/param/login" method="post">
账号:<input type="text" name="userName" value="默认值" required><br/> <!--required是Html5的新特性,在以前必填字段我们需要通过js来判断,现在html5实现!-->
密码:<input type="password" name="passWord"><br/>
<input type="submit" value="登录"/>
</form>
</body>
</html>
然后我们的Servlet有三个,分别是
1.登录的LoginServlet
2.收件箱列表的ListServlet
3.邮件内容的GetServlet
代码分别如下:
package main.com.vae.Param; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; @WebServlet("/param/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
//=============上面三行代码几乎是固定的
String name=req.getParameter("userName");
out.println("欢迎你:"+name+"</br>");
out.println("<a href='/param/list?userName="+name+"'>收件箱</a>"); }
}
package main.com.vae.Param; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; @WebServlet("/param/list")
public class ListServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
//=============上面三行代码几乎是固定的
String name=req.getParameter("userName");
out.println("欢迎你:"+name+"</br>");
for (int i = 0; i < 6; i++) {
out.println("<a href='/param/get?userName="+name+"'>一封邮件</a><br>");
} }
}
package main.com.vae.Param; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter; @WebServlet("/param/get")
public class GetServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
//=============上面三行代码几乎是固定的
String name=req.getParameter("userName");
out.println("欢迎你:"+name+"</br>");
out.println("本封邮件的内容是:蜀云泉,你真帅啊"); }
}
看看效果,还是不错的



但是有一个问题啊,因为我写的是 <a href='/param/get?userName="+name+"'> 只有这样才能传我的名字过去,写在了请求头里面这样就显示在浏览器的url里面了啊
这样是不行的,我的名字暴露了,以后还有其他字段密码,手机号,住址什么的。。。这样肯定不行。所以,我们本篇文章的主人公,cookie和seesion该出场了。

Cookie
什么是Cookie呢?

我们用Cookie来实现一下上面的例子,把登录页面里面的action改一下

然后改一下我们的三个Servlet,直接贴代码吧
package main.com.vae.Cookie; 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.io.PrintWriter; @WebServlet("/cookie/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
//=============上面三行代码几乎是固定的
String name=req.getParameter("userName"); //使用Cookie技术
Cookie cookie=new Cookie("userName",name); //创建Cookie
resp.addCookie(cookie); //把Cookie响应给浏览器 out.println("欢迎你:"+name+"</br>");
out.println("<a href='/cookie/list'>收件箱</a>"); }
}
package main.com.vae.Cookie; 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.io.PrintWriter; @WebServlet("/cookie/list")
public class ListServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
//=============上面三行代码几乎是固定的
String userName="";
//获取多个Cookie
Cookie[] cookies=req.getCookies();
for (Cookie cookie : cookies) {
String name=cookie.getName();
String value=cookie.getValue(); if ("userName".equals(name)){
userName=value;
} } out.println("欢迎你:"+userName+"</br>");
for (int i = 0; i < 6; i++) {
out.println("<a href='/cookie/get'>一封邮件</a><br>");
} }
}
package main.com.vae.Cookie; 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.io.PrintWriter; @WebServlet("/cookie/get")
public class GetServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
//=============上面三行代码几乎是固定的
String userName=""; Cookie[] cookies=req.getCookies();
for (Cookie cookie : cookies) {
String name=cookie.getName();
String value=cookie.getValue(); if ("userName".equals(name)){
userName=value;
} } out.println("欢迎你:"+userName+"</br>");
out.println("本封邮件的内容是:蜀云泉,你真帅啊"); }
}
运行一下看看结果。完美的解决了上面的问题。


Cookie的详细介绍
以下7点都得掌握,其中第4点,cookie中文乱码的问题,Tomcat8.5版本之后,Cookie已经支持了中文了,8.5版本之前的不支持,需要自己手动的编码解码一下
第6点是最重要的,Cookie分为会话Cookie和持久化Cookie,这两个需要好好了解。


可以自己去尝试,设定一个Cookie的存活时间为15秒,可以刷新页面试试,15秒之后就没有名字了。这个可以做免登陆的事情。

Cookie的domain,如果修改了资源名称,Cookie就不认识了,所以必须设置domain,cookie.setPath("/")

Cookie的缺陷:

Session
Session其实就是一个会话Cookie,关了浏览器之后啥都没有了,属于服务器端技术.
网上大把的以会员卡为例子介绍Cooklie和Session的,我就不介绍了,Session技术服务器端会给你一个ID的,我们可以在浏览器里面看到

Session的一些操作:

//使用Session技术
HttpSession session=req.getSession(); //创建Session
session.setAttribute("name",name); //设置Session的值,Session是默认响应给浏览器的
//获取Session的值
HttpSession session=req.getSession();
userName=(String) session.getAttribute("name");
我们可以把上面的图书馆的例子修改一下,结果还是OK的,可以显示我许嵩的名字
Session细节

不知道发现了一个事情没,Cookie我们是可以接收多个参数的,Session其实也是可以的。
Session和Cookie的一个区别就是,Cookie都是String类型的参数,而Session的key是String类型的,value是Object类型的。
这样我们在设置value值的时候,其实是可以传入一个类类型的,也就是Model,我们现在写一个User类,来看看
package main.com.vae.Session;
public class User {
private String userName;
private String passWord;
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
}
package main.com.vae.Session; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter; @WebServlet("/Session/login")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
//=============上面三行代码几乎是固定的
String name=req.getParameter("userName");
String passWord=req.getParameter("passWord"); User user=new User();
user.setUserName(name);
user.setPassWord(passWord);
//使用Session技术
HttpSession session=req.getSession(); //创建Session
session.setAttribute("USER_IN_SESSION",user); //设置Session的值,Session是默认响应给浏览器的 out.println("欢迎你:"+name+"</br>");
out.println("<a href='/Session/list'>收件箱</a>"); }
}
package main.com.vae.Session; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter; @WebServlet("/Session/list")
public class ListServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
//=============上面三行代码几乎是固定的
String userName="";
//获取Session的值
HttpSession session=req.getSession();
User user =(User) session.getAttribute("USER_IN_SESSION");
// for (Cookie cookie : cookies) {
// String name=cookie.getName();
// String value=cookie.getValue();
//
// if ("userName".equals(name)){
// userName=value;
// }
//
// } out.println("欢迎你:"+user.getUserName()+"</br>");
for (int i = 0; i < 6; i++) {
out.println("<a href='/Session/get'>一封邮件</a><br>");
} }
}
package main.com.vae.Session; import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter; @WebServlet("/Session/get")
public class GetServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=utf-8");
PrintWriter out=resp.getWriter();
//=============上面三行代码几乎是固定的
String userName="";
HttpSession session=req.getSession();
User user =(User) session.getAttribute("USER_IN_SESSION"); out.println("欢迎你:"+user.getUserName()+"</br>");
out.println("本封邮件的内容是:蜀云泉,你真帅啊"); }
}
就是这样的,再次重启Tomcat,结果也是OK的
Session的删除

Session的超时管理

session.setMaxInactiveInterval(15);
Session的URL重写

当浏览器禁用Cookie之后,Cookie和Session都是不能再使用的。所以想要实现数据的共享,我们只能在跳转链接加上Session的ID,就是一串数字。但是这样很蠢,又在浏览器上的URL框里显示了。所以有一个Response.EncodeURL,使用这个可以自动的帮助我们加上Session的ID。但是一般是没有人关闭Cookie的,关闭了之后会很麻烦。所以一般的做法是监测用户的浏览器是否关闭了Cookie,如果禁用了Cookie那么就提醒开启。
Java Web之Cookie、Session的更多相关文章
- Java web学习 Cookie&&Session
cookie&&session 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会 话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Coo ...
- Java Web Application使Session永不失效(利用cookie隐藏登录)
在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...
- java ->会话技术Cookie&Session
会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...
- A candidate solution for Java Web Application - current session
Motivation Do it once, resue for ever. Audience myself, Java Web developers Scope 应用案例 图书借阅系统 阶段1需求: ...
- Java Web 禁用Cookie对Session的影响
如果客户端禁用了Cookie,那么服务端就不能得到Session了.因为通过Session ID来确定当前会话对应的服务端Session,而Session ID通过Cookie来传递,所以禁用Cook ...
- 关于Cookie 的HttpOnly属性(java/web操作cookie+Tomcat操作jsessionid)
关于Cookie的其它只是不在累述.本文主要讲讲自己在项目中遇到的cookie的HttpOnly属性问题 Cookie的HttpOnly属性说明 cookie的两个新的属性secure和Httponl ...
- Web Applicationservlet,cookie,session
Web Application简介: Web Application NameWEB-INFweb.xml 该web application的配置文件lib 该web application用到的依赖 ...
- java web(七)Cookie的简单使用
一.概述 测试 //1.创建一个Cookie对象 //Cookie cookie1=new Cookie("name","xrk"); //2.调用 ...
- java web中cookie的永久创建与撤销
一.首先是创建cookie 当在数据库中查找知道所输入的用户名和密码正确之后,就开始创建: String cb=request.getParameter("cb");//cb就是登 ...
随机推荐
- H5页面长按导致app崩溃问题解决
每天学习一点点 编程PDF电子书.视频教程免费下载:http://www.shitanlife.com/code 最近用H5页面做了个安卓的项目,但是在H5页面中长按文字内容,会导致APP崩溃掉... ...
- Spring Security(三十二):10. Core Services
Now that we have a high-level overview of the Spring Security architecture and its core classes, let ...
- sigsuspend()阻塞:异步信号SIGIO为什么会被截胡?
关键词:fcntl.fasync.signal.sigsuspend.pthread_sigmask.trace events. 此文主要是解决问题过程中的记录,内容有较多冗余.但也反映解决问题中用到 ...
- mapreduce map 的个数
在map阶段读取数据前,FileInputFormat会将输入文件分割成split.split的个数决定了map的个数.影响map个数(split个数)的主要因素有: 1) 文件的大小.当块(dfs. ...
- Entity Framework Core系列之DbContext
前言: EF Core DbContext表示与数据库的会话,并提供与数据库通信的API,具有以下功能: 数据库连接 数据操作,如查询和持久化 更改追踪 模型构建 数据映射 对象缓存 事务管理 数据库 ...
- Linux下修改MySQL数据表中字段属性
一.修改某个表的字段类型及指定为空或非空 alter table 表名称 change 字段名称 字段名称 字段类型 [是否允许非空]; alter table 表名称 modify 字段名称 字段类 ...
- 【学习总结】GirlsInAI ML-diary day-13-Try/Except 异常处理
[学习总结]GirlsInAI ML-diary 总 原博github链接-day13 认识异常处理 要点小结: try和except是同个等级,注意对齐和缩进 可以把try和except直接理解成另 ...
- Laravel 入口文件解读及生命周期
这里只贴index.php的代码, 深入了解的请访问 https://laravel-china.org/articles/10421/depth-mining-of-laravel-life- ...
- vue.js实战——splice使用
Vue在检测到数组变化时,并不是直接重新渲染整个列表,而是最大化地复用DOM元素.替换的数组中含有相同元素的项不会被重新渲染,因此可以大胆地用新数组来替换就数组,不用担心性能问题. 需要注意的是,以下 ...
- git 学习(1) ----- git 本地仓库操作
最近在项目中使用git了,在实战中才知道,以前学习的git 知识只是皮毛,需要重新系统的学一下,读了一本叫 Learn Git in a Month of Lunches 的书籍,这本书通俗易懂,使 ...