讲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. Python生成器、推导式之前襟后裾

    生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...

  2. Linux 用户关联命令

    在执行useradd命令创建用户时,它首先读取/etc/default/useradd文件的配置参数,然后通过这些参数来配置新创建的用户,如创建名为luser的用户. [root@rhl5 -]# u ...

  3. 周末班:Python基础之模块

    什么是模块 什么是模块? 常见的场景:一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 但其实import加载的模块分为四个通用类别: 1 使用python编写 ...

  4. window.loaction.href 不自动跳转的问题

    window.location.href无效/不跳转的原因分析   1.源代码: <a href="javascript:void(0);" onclick="mo ...

  5. Building Lambda Architecture with Spark Streaming

    The versatility of Apache Spark’s API for both batch/ETL and streaming workloads brings the promise ...

  6. idea右键无法新建Java Class

    项目中新建目录之后,要在该目录下新增java Class文件,右键——>New发现无对应选项. 原因:新建目录之后需要设置目录作用,从而让idea识别. 方法:File-Project Stru ...

  7. Ubuntu 安装 Docker CE(社区版)

    参考自 https://yeasy.gitbooks.io/docker_practice/install/ubuntu.html#ubuntu-1604- docker-io 是以前早期的版本,版本 ...

  8. android glide图片加载框架

    项目地址: https://github.com/bumptech/glide Glide作为安卓开发常用的图片加载库,有许多实用而且强大的功能,那么,今天就来总结一番,这次把比较常见的都写出来,但并 ...

  9. Jenkins持续集成实践之java项目自动化部署

    关于Linux安装Jenkins可以参考我的这篇博文Ubuntu16.04环境安装jenkins 1.安装部署插件 进入插件管理,并搜索该插件Deploy to container Plugin进行安 ...

  10. java 服务端I/O非阻塞实现05

    /** * 非阻塞IO多线线程服务端 * 当一个任务进入多线程,这个任务线程需要处理接收信息.发送信息.因而发生I/O阻塞问题 * 利用selector可以实现异步 * */ public class ...