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就是登 ...
随机推荐
- 浅谈TCP IP协议栈(四)IP协议解析
通过之前的网络层基础知识,IP地址以及路由器的简介,大家应该对于TCP/IP有一个大致的了解,在脑海里应该对于网络的几个基础概念有个大概的了解,简单点说整个协议栈就是在做一件事,规定网络报文(网络传输 ...
- Redis可视化工具 Redis Desktop Manager
1.前言 从接触Redis也有两年,平时就使用它来做缓存层,它给我的印象就是很强大,内置的数据结构很齐全,加上Redis5.0的到来,新增了很多特色功能.而Redis5.0最大的新特性就是多出了一个数 ...
- [原创]GDB调试指南-断点设置
前言 上篇<GDB调试指南-启动调试>我们讲到了GDB启动调试的多种方式,分别应用于多种场景.今天我们来介绍一下断点设置的多种方式. 为何要设置断点 在介绍之前,我们首先需要了解,为什么需 ...
- 新的编辑工具IDE
因为最近一段时间前端都是用EXTJS开发,之前用vs2012来编辑extjs,感觉缺少智能感应,很不方便.后来发现一款工具Visual Studio Code,非常棒. VS Code是免费,轻量,跨 ...
- Spark的性能调优杂谈
下面这些关于Spark的性能调优项,有的是来自官方的,有的是来自别的的工程师,有的则是我自己总结的. 基本概念和原则 <1> 每一台host上面可以并行N个worker,每一个worke ...
- python购物车demo
product_list = [ ('Iphone',11800), ('Mac Pro',13800), ('BMW CAR',480000), ...
- 微信小程序中用户登录和登录态维护
提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情.像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件. 让用户 ...
- 使用 xUnit 编写 ASP.NET Core 单元测试
还记得 .NET Framework 的 ASP.NET WebForm 吗?那个年代如果要在 Web 层做单元测试简直就是灾难啊..NET Core 吸取教训,在设计上考虑到了可测试性,就连 ASP ...
- OC调用c++函数
1.调用的时候我明明改成了 .mm , 也添加了libstdc++.dylib 调用自己(xcode )写的(cocoa static lib )c++ ,编译总是报找不到库里的函数, 最后我在 ...
- pci设备驱动相关
pci 设备注册及查找: https://www.cnblogs.com/image-eye/archive/2012/02/15/2352912.html PFN https://nieyong.g ...