讲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的更多相关文章

  1. Java web学习 Cookie&&Session

    cookie&&session 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会 话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Coo ...

  2. Java Web Application使Session永不失效(利用cookie隐藏登录)

    在做 Web Application 时,因为 Web Project 有 session 自动失效的问题,所以如何让用户登录一次系统就能长时间运行三个月,就是个问题. 后来,看到 session 失 ...

  3. java ->会话技术Cookie&Session

    会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...

  4. A candidate solution for Java Web Application - current session

    Motivation Do it once, resue for ever. Audience myself, Java Web developers Scope 应用案例 图书借阅系统 阶段1需求: ...

  5. Java Web 禁用Cookie对Session的影响

    如果客户端禁用了Cookie,那么服务端就不能得到Session了.因为通过Session ID来确定当前会话对应的服务端Session,而Session ID通过Cookie来传递,所以禁用Cook ...

  6. 关于Cookie 的HttpOnly属性(java/web操作cookie+Tomcat操作jsessionid)

    关于Cookie的其它只是不在累述.本文主要讲讲自己在项目中遇到的cookie的HttpOnly属性问题 Cookie的HttpOnly属性说明 cookie的两个新的属性secure和Httponl ...

  7. Web Applicationservlet,cookie,session

    Web Application简介: Web Application NameWEB-INFweb.xml 该web application的配置文件lib 该web application用到的依赖 ...

  8. java web(七)Cookie的简单使用

    一.概述 测试 //1.创建一个Cookie对象    //Cookie cookie1=new Cookie("name","xrk");    //2.调用 ...

  9. java web中cookie的永久创建与撤销

    一.首先是创建cookie 当在数据库中查找知道所输入的用户名和密码正确之后,就开始创建: String cb=request.getParameter("cb");//cb就是登 ...

随机推荐

  1. 【转载】FPGA 中的latch 锁存器

    以下这篇文章讲述了锁存器的一些概念和注意事项.原文标题及链接: FPGA 中的latch 锁存器 - 快乐至永远上的博客 - 与非博客 - 与网 http://www.eefocus.com/liuy ...

  2. centos7.4系统升级kernel内核

    在实验环境下,已安装了最新的CentOS 7.4操作系统,现在需要升级内核版本. 实验环境CentOS-7-x86_64-Minimal-1708.iso CentOS Linux release 7 ...

  3. SP11470 TTM - To the moon

    嘟嘟嘟 主席树+区间修改. 以为是水题,写着写着发现区间修改标记下传会出问题,然后想了想发现以前做的只是单点修改. 那怎么办咧? 然后题解交了我标记永久化这个神奇的东西. 特别好理解,就是修改的时候直 ...

  4. eclipse换工作空间站快捷键失效解决

    1.找到你可以用快捷键的eclipse的空间所在目录.2.复制.metadata文件.3.找到不可用快捷键的空间目录,把之前复制的文件夹覆盖到现在的.4.重启eclipse.

  5. Mybatis实现高级映射一对一、一对多查询

    终于把论文写得差不多了,系统也不急着完成,可以抽出点时间来完成这个系列的博客了.在写本博客之前我是惶恐不安的,高级映射一贯是持久层框架里的重中之重,小到自己开发小系统,大到企业级开发,表的存在从来就不 ...

  6. Spring AOP前置通知实例说明AOP相关概念

    今天又看了下韩顺平的SpringAOP的讲解,讲解的很透彻.仿照视频自己使用下前置通知. 一.引出问题 有个接口TestServiceInter,有两个实现方法TestService和Test2Ser ...

  7. 判断语句之if..else if...else

    判断语句之if..else if...else if语句第三种格式:if..else if...else 格式: 执行流程 首先判断关系表达式1看其结果是true还是false 如果是true就执行语 ...

  8. 软件工程(FZU2015) 赛季得分榜,第11回合(beta冲刺+SE总结)

    SE_FZU目录:1 2 3 4 5 6 7 8 9 10 11 12 13 积分规则 积分制: 作业为10分制,练习为3分制:alpha30分:beta30分 团队项目分=团队得分+个人贡献分 个人 ...

  9. Web项目中出现乱码

    (不知道怎么写才好) 分两种情况: 1.如果是 get 方式 单独修改: new String(str.getBytes("原来的编码"), "想要的编码") ...

  10. Python 执行 shellcode

    import urllib2 import ctypes import base64 # 从我们的web服务器上下载shellcode url = "http://rinige.com/sh ...