Cookie

Cookie 是浏览器提供的一种技术,通过服务器的程序能将一些只须保存在客户端,或者 在客户端进行处理的数据,放在本地的计算机上,不需要通过网络传输,因而提高网页处理的效率,并且能够减少服务器的负载,但是由于 Cookie是服务器端保存在客户端的信息, 所以其安全性也是很差的。例如常见的记住密码则可以通过 Cookie 来实现。

通过 new Cookie(“key”,”value”);来创建一个 Cookie 对象,要想将 Cookie 随响应发送到客户端,需要先添加到 response 对象中,resp.addCookie(cookie);此时该 cookie 对象则随着响应发送至了客户端。在浏览器上可以看见。

cookie的创建

public class cookie01 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie=new Cookie("name", "dulihong");
resp.addCookie(cookie); Cookie cookie2=new Cookie("hehe", "wahaha");
resp.addCookie(cookie2);
}
}

cookie的获取

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet; public class Cookie02 extends HttpServlet {
protected void service(javax.servlet.http.HttpServletRequest req, javax.servlet.http.HttpServletResponse resp) throws javax.servlet.ServletException ,java.io.IOException {
Cookie [] cookies=req.getCookies();
if(cookies!=null){
for(int i=0;i<cookies.length;i++){
System.out.println(cookies[i].getName()+"---->"+cookies[i].getValue());
if("name".equals(cookies[i].getName())){
System.out.println("++++++++++++++++++++++");
System.out.println(cookies[i].getName()+"----->"+cookies[i].getValue());
System.out.println("++++++++++++++++++++++");
}
}
}
};
}

从图中除了看到 Cookie 的名称和内容外,我们还需要关心一个信息, 到期时间,到期时间用来指定该 cookie 何时失效。默认为当前浏览器关闭即失效。我们可以手动设定 cookie 的有效时间(通过到期时间计算),通过 setMaxAge(inttime);方法设定 cookie 的最大有效时间,以秒为单位。大于 0 的整数,表示存储的秒数;若为负数,则表示不存储该 cookie;若为 0,则删 除该 cookie。负 整 数:cookie 的 maxAge 属性的默认值就是-1,表示只在浏览器内存中存活,一旦关闭浏览器窗口,那么 cookie 就会消失。正整数:表示 cookie 对象可存活指定的秒数。当生命大于 0 时,浏览器会把 Cookie 保存到硬盘上,就算关闭浏览器,就算重启客户端电脑,cookie 也会存活相应的时间。零:cookie 生命等于 0 是一个特殊的值,它表示 cookie 被作废!也就是说,如果原来浏览器已经保存了这个 Cookie,那么可以通过 Cookie 的setMaxAge(0)来删除这个 Cookie。 无论是在浏览器内存中,还是在客户端硬盘上都会删除这个 Cookie。

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Cookie03 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie c1=new Cookie("laflka", "lkafklda");
//c1.setMaxAge(0);
//c1.setMaxAge(10);
c1.setMaxAge(-1);
resp.addCookie(c1);
}
}

在一般的站点中常常有记住用户名这样一个操作,该操作只是将信息保存在本机上,换电脑以后这些信息就无效了。而且 cookie 还不能跨浏览器。Cookie 中不能出现中文,如果有中文则通过 URLEncoder.encode()来进行编码,获取时通过 URLDecoder.decode()来进行解码。如果服务器端发送重复的 Cookie 那么会覆盖原有的 Cookie。

import java.io.IOException;
import java.net.URLEncoder; import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Cookie04 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
String name="张三";
String value="哈喽";
name=URLEncoder.encode(name);
value=URLEncoder.encode(value);
Cookie cook=new Cookie(name, value);
resp.addCookie(cook); }
}

在 Servlet 中保存的 Cookie 如果没有设置 path,那么它的 path 默认为当前 Servlet 的所在路径;当访问的路径包含了 cookie 的路径时,则该请求将带上该 cookie;如果访
问路径不包含 cookie 路径,则该请求不会携带该 cookie。

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Cookie06 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
Cookie c=new Cookie("A", "a");
c.setPath("/");
resp.addCookie(c); Cookie cd=new Cookie("D", "d");
cd.setPath("/mycookie/cook06");
resp.addCookie(cd); }
}

Session

HttpSession 对象是 javax.servlet.http.HttpSession 的实例,该接口并不像HttpServletRequest 或 HttpServletResponse 还存在一个父接口,该接口只是一个
纯粹的接口。这因为 session 本身就属于 HTTP 协议的范畴。对于服务器而言,每一个连接到它的客户端都是一个 session,servlet 容器使用此接口创建 HTTP 客户端和 HTTP 服务器之间的会话。会话将保留指定的时间段,跨多个连接或来自用户的页面请求。一个会话通常对应于一个用户,该用户可能多次访问一个站点。可以通过此接口查看和操作有关某个会话的信息,比如会话标识符、创建时间和最后一次访问时间。在整个 session 中,最重要的就是属性的操作。session 无论客户端还是服务器端都可以感知到,若重新打开一个新的浏览器,则无法取得之前设置的 session,因为每一个 session 只保存在当前的浏览器当中,并在相关的页面取得。

ession 的作用就是为了标识一次会话,或者说确认一个用户;并且在一次会话(一个用户的多次请求)期间共享数据。我们可以通过 req.getSession()方法,来获取当前会话的 session 对象。

标识会话 JSESSIONID

Session 既然是为了标识一次会话,那么此次会话就应该有一个唯一的标志,这个标志就是 sessionId。每当一次请求到达服务器,如果开启了会话(访问了 session),服务器第一
步会查看是否从客户端回传一个名为 JSESSION 的 cookie,如果没有则认为这是一次新的会话,会创建 一个新的 session 对象,并用唯一的 sessionId 为此次会话做一个标志。如果有 JESSIONID 这 个 cookie 回传,服务器则会根据JSESSIONID 这个值去查看是否含有 id 为 JSESSION 值的 session 对象,如果没有则认为是一个新的会话,重新创建一个新的 session 对象,并标志此次会话; 如果找到了相应的 session 对象,则认为是之前标志过的一次会话,返回该 session对象,数据达到共享。这里提到一个叫做 JSESSION 的 cookie,这是一个比较特殊的 cookie,当用户请求服务器时,如果访问了 session,则服务器会创建一个名为 JSESSION,值为获取到的 session(无论是获取到的还是新创建的)的 sessionId 的 cookie 对象,并添加到 response 对象中,响应给客户端,有效时间为关闭浏览器。所以 Session 的底层依赖 Cookie 来实现

session的创建和常用方法

import java.io.IOException;
import java.sql.SQLClientInfoException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; import org.apache.coyote.RequestGroupInfo; import sun.java2d.SunGraphics2D; public class Session01 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession s1=req.getSession();
String sid=s1.getId();
System.out.println(sid); long time1=s1.getCreationTime();
System.out.println(time1); long time2=s1.getLastAccessedTime();
System.out.println(time2); boolean flag = s1.isNew();
System.out.println(flag); }
}

Session  的 销毁
1)  默认时间到期
当客户端第一次请求 servlet 并且操作 session 时,session 对象生成,Tomcat 中 session 默认的存活时间为 30min,即你不操作界面的时间,一旦有操作,session 会重新计时。那么 session 的默认事件可以改么?答案是肯定的。可以在 Tomcat 中的 web.xml 文件中进行修改。 如下图:

2)  自己设定到期时间
当然除了以上的修改方式外,我们也可以在程序中自己设定 session 的生命周期,通过 session.setMaxInactiveInterval(int);来设定 session 的最大不活动时间,
单位为秒。当然我们也可以通过 getMaxInactiveInterval();方法来查看当前 Session 对象的最大不活动时间

3)  立刻失效
我们也可以通过 session.invalidate();方法让 session 立刻失效

4)  关闭浏览器
从前面的 JESSION 可知道,session 的底层依赖 cookie 实现,并且该 cookie的有效时间为关闭浏览器,从而 session 在浏览器关闭时也相当于失效了(因为没有 JSESSION 再与之对应)。

5)  关闭服务器
当非正常关闭服务器时,session 销毁;当正常关闭服务器时,Session 将被序列化到磁盘上,在工作空间 work 目录下的 SESSION.ser 文件中,下次启动服务时,自动加载到内存。Session 失效则意味着此次会话结束,数据共享结束

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.websocket.Session; public class Session02 extends HttpServlet{ @Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
req.setAttribute("name", "liuqingfeng"); HttpSession hs=req.getSession();
String id=hs.getId();
hs.setAttribute("name","hello world");
//req.getRequestDispatcher("/s03").forward(req, resp); resp.sendRedirect("s03"); }
}
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class Session04 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession hss=req.getSession();
System.out.println(hss.getId()); hss.setMaxInactiveInterval(10);
//hss.invalidate();
System.out.println(hss.getId());
}
}

ServletContext  对象
每一个 web 应用都有且仅有一个 ServletContext 对象,又称 Application 对象,从名称中可知,该对象是与应用程序相关的。在 WEB 容器启动的时候,会为每一个 WEB 应用程序创 建一个对应的 ServletContext 对象。该对象有两大作用,第一、作为域对象用来共享数据,此时数据在整个应用程序中共享; 第二、该对象中保存了当前应用程序相关信息。例如可以通过getServerInfo();方法获取当前 服 务 器 信 息 , getResourceAsStream(Stringpath); 方法以流的形式获取某个资源,getRealPath(String path);获取资源的真实路
径等。

ServletContext  对象的四种获取方式

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Context01 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
//获取ServletContext对象的四种方式
ServletContext sc=req.getServletContext(); //第二种方式
sc=req.getSession().getServletContext(); //第三种方式
sc=getServletConfig().getServletContext(); //第四种方式
sc=getServletContext(); //获取服务器版本
String server_version=sc.getServerInfo();
System.out.println(server_version); //获取资源在服务器上的真实路径
String realpath=sc.getRealPath("/");
System.out.println(realpath);
}
}

2.  作为域对象
ServletContext 也可当做域对象来使用,通过向 ServletContext 中存取数据,可以使得整个应用程序共享某些数据。当然不建议存放过多数据,因为
ServletContext 中的数据一旦存储进去没有手动移除将会一直保存。

import java.io.IOException;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Context03 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
ServletContext haha=getServletContext();
String name=(String)haha.getAttribute("name");
System.out.println(name);
}
}

文件上传

前台页面

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="f01" method="post">
文件名<input type="text" name="filename">
<input type="submit" value="下载">
</form>
</body>
</html>

后台代码

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class file01 extends HttpServlet{
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
resp.setContentType("text/html; charset=UTF-8");
String filename=req.getParameter("filename");
if(filename==null || filename.trim().length()<1){
PrintWriter out=resp.getWriter();
out.write("<h1>文件名错误</h1><h3><a href='download.html'>返回</a></h3>");
out.close();
return ;
} String realpath=getServletContext().getRealPath("/download/");
System.out.println(realpath); String filepath=realpath+filename; File file=new File(filepath);
if(file.exists() && file.isFile()){
resp.setContentType("application/x-msdownload");
resp.setHeader("Content-Disposition", "attachment;filename=" + filename); InputStream in=new FileInputStream(file);
OutputStream out=resp.getOutputStream();
byte[] bs=new byte[1024];
int len=0;
while((len=in.read(bs))!=-1){
out.write(bs,0,len);
}
out.close();
in.close();
}
else{
PrintWriter sw= resp.getWriter();
sw.write("<h1>文件不存在</h1><h3><a href='download.html'>返回</a></h3>");
sw.close();
} } }

javaWeb中的session和cookie的更多相关文章

  1. JAVA中的Session和Cookie【转】

    一.cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案. 同时我们也看到,由于才服务器端保持状态的 ...

  2. Django中的session和cookie及分页设置

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  3. MVC、控件、一般处理程序中的session and cookie

    Mvc中: session: if (!string .IsNullOrEmpty(find)) //设置 Session["oip"] = "无锡"; Vie ...

  4. Django中的Session与Cookie

    1.相同与不同 Cookie和Session都是为了记录用户相关信息的方式, 最大的区别就是Cookie在客户端记录而Session在服务端记录内容. 2.Cookie和Session之间的联系的建立 ...

  5. express中 使用session与cookie

    1.express如何使用session与cookie : https://www.jianshu.com/p/1839e482274e  或  https://www.cnblogs.com/chy ...

  6. ASP.NET MVC 中解决Session,Cookie等依赖的方式

    原文:https://blog.csdn.net/mzl87/article/details/90580869 本文将分别介绍在MVC中使用Filter和Model Binding两种方式来说明如何解 ...

  7. Django中的Session和cookie

    Session和cookie 参考文献:https://www.cnblogs.com/wupeiqi/articles/5246483.html 1.问题引入 1.1 cookie是什么? 保存在客 ...

  8. TP中的session和cookie

    session:1.session('name','value');  //设置session2.$value = session('name');  // 获取所有的session 3.2.2版本新 ...

  9. YII中的session和cookie

    session的使用 存储数据 Yii::app()->session["名"] = 值; 取数据 $变量 = Yii::app()->session["名& ...

随机推荐

  1. python之pandas学习笔记-pandas数据结构

    pandas数据结构 pandas处理3种数据结构,它们建立在numpy数组之上,所以运行速度很快: 1.系列(Series) 2.数据帧(DataFrame) 3.面板(Panel) 关系: 数据结 ...

  2. 【操作系统】【C/C++开发】内存管理

    内存管理 操作系统对内存的划分和动态分配,就是内存管理的概念.有效的内存管理在多道程序设计中非常重要,不仅方便用户使用存储器.提高内存利用率,还可以通过虚拟技术从逻辑上扩充存储器.内存管理的功能有: ...

  3. 如何在picture上显示透明Label

  4. Prometheus + Grafana 监控 Redis

    Prometheus安装 .linux-amd64.tar.gz .linux-amd64. cd /prometheus # Start Prometheus. # By default, Prom ...

  5. day35 守护进程、互斥锁、IPC

    day35 守护进程.互斥锁.IPC 1.守护进程 # 守护进程:当父进程执行完毕后,设置的守护进程也会跟着结束# 当一个进程被设置为守护进程后,其不能再产生子进程​ from multiproces ...

  6. 【Python】【基础知识】【内置函数】【print的使用方法】

    原英文帮助文档: print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False) Print objects to the text ...

  7. springboot2.0结合freemarker生成静态化页面

    目录 1. pom.xml配置 2. application.yml配置 3. 使用模板文件静态化 3.1 创建测试类,编写测试方法 3.2 使用模板字符串静态化 使用freemarker将页面生成h ...

  8. django 聚合统计查询

    from django.shortcuts import renderfrom django.http import HttpResponsefrom django.db.models import ...

  9. 【xlwings】 wps 和 office 的excel creat_sheet区别

    最近在学习 xlwings,参考学习的网址:https://www.jianshu.com/p/b534e0d465f7 写得很棒,学到了很多. 在新建sheet表单, 发现一个问题. import ...

  10. Visual Studio高分屏下Winform界面变形

    现在高分屏的电脑越来越多,2K屏,4K屏层出不穷,对于.net开发人员来说,尤其是Winform开发者, 分辨率一直是个比较头疼的事情,屏幕分辨率高了,如果仍然设置显示100%,会导致字体非常小,影响 ...