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就是登 ...
随机推荐
- c/c++ 网络编程 UDP 发送端 bind 作用
网络编程 UDP 发送端 bind 作用 upd 发送端 调用bind函数的效果:把socket特定到一个指定的端口,如果不调用bind,内核会随机分配一个端口. upd 发送端 调用bind函数的目 ...
- python3打印当前时间和获取程序运行时间
学习使用time模块和datetime模块. 通常我们想让程序等待几秒钟,再继续向下运行,time模块的sleep()方法是一个很好的选择.但是想通过time模块打印系统的当前时间,则比较麻烦.如下: ...
- Redis可视化工具 Redis Desktop Manager
1.前言 从接触Redis也有两年,平时就使用它来做缓存层,它给我的印象就是很强大,内置的数据结构很齐全,加上Redis5.0的到来,新增了很多特色功能.而Redis5.0最大的新特性就是多出了一个数 ...
- Bootstrap -- 缩略图、进度条、列表组、面板
Bootstrap -- 缩略图.进度条.列表组.面板 1. 缩略图 大多数站点都需要在网格中布局图像.视频.文本等.Bootstrap 通过缩略图为此提供了一种简便的方式.使用 Bootstrap ...
- 爬虫系列二(数据清洗--->xpath解析数据)
一 xpath介绍 XPath 是一门在 XML 文档中查找信息的语言.XPath 用于在 XML 文档中通过元素和属性进行导航. XPath 使用路径表达式在 XML 文档中进行导航 XPath 包 ...
- 20175310 《Java程序设计》第9周学习总结
20175310 <Java程序设计>第9周学习总结 本周博客:https://www.cnblogs.com/xicyannn/p/10785915.html 教材学习内容总结 这周学习 ...
- 厚着脸皮求领导写了一篇java小白进阶大牛之路!!!
缘起&应朋友之邀 2019年已经过去两个月了,应朋友之邀,写写自己的个人经历,与其说经历还不如是自我的总结与反思.2012年2月份只身一人拖着行李箱来到北京库巴科技有限公司实习,那时候库巴处在 ...
- Auto Layout - BNR
继续UIImageView - BNR篇. 通过Homepwner TARGETS -> General -> Deployment Info -> Devices中的iPhone改 ...
- swipe.js实现支持手拔与自动切换的图片轮播
一.Html代码如下: <div id='mySwipe' style='max-width:500px;margin:0 auto' class='swipe'> <div cla ...
- PS制作科幻特效的金色立体文字
最终效果 一.Photoshop打开背景素材. 二.然后我们来制作字效,首先当然是在画布上打上字了,在这里要注意的是尽量选一些艺术字体,这样做出来的效果比较好些,我这里用到的字体为“Matura MT ...