热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java网站cookie_JavaWeb之Cookie和Session

七、Cookie和Session目录:会话、Cookie、Session(重点)1.会话会话:用户打开一个浏览器,点击了很多超链接

七、COOKIE和Session

目录:会话、COOKIE、Session(重点)

1.会话

会话:用户打开一个浏览器,点击了很多超链接,访问多个Web资源,关闭浏览器,这个过程可以称之为会话。

有状态会话:一位用户访问过某网站,下次再访问此网站,服务端会知道这个用户曾经来过,称之为有状态会话。

一个网站如何证明用户访问过?

①COOKIE:服务端给客户端一个“信件”,客户端下次访问服务端带上“信件”就可以了。

②Session:服务器“登记”用户访问过了,下次用户访问的时候自动访问。

保存两种会话技术:

①COOKIE:客户端技术。

②Session:服务器技术。利用这个技术可以保存用户的会话信息,可以把信息或者数据放在Session中。

常见场景:网站登录之后,下次不用再登录了,第二次访问就直接自动登录了。

2.COOKIE

1)从请求中拿到COOKIE信息

2)服务器响应给客户端COOKIE

COOKIEDemo.java:

package com.ping.servlet;

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import jave.io.IOException;

import java.io.PrintWriter;

public class COOKIEDemo extends HttpServlet {

//保存用户上一次访问的时间

@Override

protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException {

//解决中文乱码

req.setCharacterEncoding("utf-8");

resp.setCharacterEncoding("utf-8");

PrintWriter out = resp.getWriter();

//COOKIE,服务器端从客户端获取

COOKIE[] COOKIEs = req.getCOOKIEs;//这里返回数组,说明COOKIE可能存在多个

//判断COOKIE是否存在

if(COOKIEs!=null) {

out.write("你上一次访问的时间是:");

for(int i=0;i

COOKIEs COOKIE = COOKIEs[i];

//获取COOKIE的名字

if(COOKIE.getName().equals("lastLogintTime")) {

//获取COOKIE中的值

long lastLoginTime = Long.parseLong(COOKIE.getValue());

Date date = new Date(lastLogintTime);

out.writer(date.toLocaleString());

}

}

}else {

out.write("这是您第一次访问本站");

}

//服务端给客户端响应一个COOKIE

COOKIE COOKIE = new COOKIE("lastLogintTime",System.currentTimeMillis()+" ");

//COOKIE有效期为1天

resp.addCOOKIE(COOKIE);

}

@Override

protected void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException {…}

}

上述所使用的COOKIE方法:

COOKIE[] COOKIEs = req.getCOOKIEs(); //获得COOKIE

COOKIE.getName(); //获得COOKIE中的key

COOKIE.getValue(); //获得COOKIE中的value

new COOKIE(); //新建一个COOKIE

COOKIE.setMaxAge(); //设置COOKIE的有效期

resp.addCOOKIE(); //响应给客户端一个COOKIE

COOKIE一般会保存在本地的用户目录appdata下。

一个网站的COOKIE是否存在上限?

①一个COOKIE只能保存一个信息。

②一个Web站点可以给浏览器发送多个COOKIE,最多存放20个COOKIE。

③COOKIE的大小有限制,为4kb。

④300个COOKIE为浏览器的上限。

删除COOKIE:

①不设置有效期,关闭浏览器就自动失效。

②设置有效期时间为0。

DeleteCOOKIE.java

package com.ping.servlet;

import …

public class DeleteCOOKIE extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException {

//创建一个COOKIE,名字必须要和要删除的名字一致

COOKIE COOKIE = new COOKIE("lastLogintTime",System.currentTimeMillis()+" ");

//将COOKIE有效期设置为0,立马过期

COOKIE.setMaxAge(0);

resp.addCOOKIE(COOKIE);

}

@Override

protected void doPost(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException {

doGet(req,resp);

}

}

编码解码,来解决中文乱码问题:

URLEncoder.encode("ping","utf-8")//编码

URLDecoder.decode(COOKIE.getValue(),"utf-8")//解码

3.Session(重点)

1)什么是Session?

①服务器会给每一个用户(浏览器)创建一个Session对象。

②一个Session独占一个浏览器,只要浏览器没关闭,这个Session就存在。

③用户登录之后,整个网站它都可以访问。

2)HttpSession的重要方法

①getId():String:得到唯一标识符

②getServletContext():ServletContext:获得ServletContext

③getAttribute(String):Object:得到一个节点

④setAttribute(String,Object):void:用来设置属性

⑤removetAttribute(String):void:删除节点

⑥isNew():boolean:是否是新的

⑦invalidate():void:注销

3)Session使用场景

①保存一个登录用户的信息。

②如购物车信息等。

③整个网站中经常使用的数据。

……

4)使用Session

SessionDemo.java:

package com.kuang.servlet;

import com.kuang.pojo.Person;

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 java.io.IOException;

public class SessionDemo extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//解决乱码问题

req.setCharacterEncoding("UTF-8");

resp.setCharacterEncoding("UTF-8");

resp.setContentType("text/html;charset=utf-8");

//得到Session

HttpSession session = req.getSession();

//给Session中存东西

session.setAttribute("name",new Person("秦疆",1));

//获取Session的ID

String sessionId = session.getId();

//判断Session是不是新创建

if (session.isNew()){

resp.getWriter().write("session创建成功,ID:"+sessionId);

}else {

resp.getWriter().write("session以及在服务器中存在,ID:"+sessionId);

}

//Session创建的时候所做的事情,会自动实现,不用编写如下代码

//COOKIE COOKIE = new COOKIE("JSESSIONID",sessionId);

//resp.addCOOKIE(COOKIE);

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

doGet(req, resp);

}

}

GetSession.java:

package com.kuang.servlet;

import com.kuang.pojo.Person;

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 java.io.IOException;

public class SessionDemo extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

//解决乱码问题

req.setCharacterEncoding("UTF-8");

resp.setCharacterEncoding("UTF-8");

resp.setContentType("text/html;charset=utf-8");

//得到Session

HttpSession session = req.getSession();

Person person = (Person) session.getAttribute("name");

System.out.println(person.toString());

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {…}

}

DeleteSession.java:

package com.kuang.servlet;

import com.kuang.pojo.Person;

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 java.io.IOException;

public class SessionDemo extends HttpServlet {

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

HttpSession session = req.getSession();

session.removeAttribute("name");

//手动注销Session

session.invalidate();

}

@Override

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {…}

}

web.xml配置会话自动过期:

15

所用的Person类,Person.java:

package com.ping.pojo;

public class Person {

private String name;

private int age;

public Person() {

}

public Person(String name,int age) {

this.name = name;

this.age = age;

}

public String getName() {

return name;

}

public void setName() {

this.name = name;

}

public int getAge() {

return age;

}

public void setAge() {

this.age = age;

}

@Override

public String toString() {

return "Person{"

"name='"+name+'\''+

",age="+age+

'}';

}

}

5)Session和COOKIE的区别

①COOKIE是把用户的数据写给用户的浏览器,浏览器保存(可以保存多个)。

②Session把用户的数据写到用户独占Session中,服务器端保存(保存重要的信息,减少服务器资源的浪费)。

③Session对象由服务器创建。

c913d2de938e

Session工作原理



推荐阅读
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 本文探讨了利用Java实现WebSocket实时消息推送技术的方法。与传统的轮询、长连接或短连接等方案相比,WebSocket提供了一种更为高效和低延迟的双向通信机制。通过建立持久连接,服务器能够主动向客户端推送数据,从而实现真正的实时消息传递。此外,本文还介绍了WebSocket在实际应用中的优势和应用场景,并提供了详细的实现步骤和技术细节。 ... [详细]
  • 本文介绍了在 Android 平台上的图片上传工具类优化方案,重点讨论了如何通过设置 `MultipartEntity` 来实现图片的高效上传。具体实现中,通过自定义 `UserUploadServiceImpl` 类,详细展示了如何构建和发送包含图片数据的 HTTP 请求。此外,还探讨了如何处理上传过程中的常见问题,如网络异常和文件格式验证,以确保上传的稳定性和可靠性。 ... [详细]
  • 该大学网站采用PHP和MySQL技术,在校内可免费访问某些外部收费资料数据库。为了方便学生校外访问,建议通过学校账号登录实现免费访问。具体方案可包括利用学校服务器作为代理,结合身份验证机制,确保合法用户在校外也能享受免费资源。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • 本指南介绍了 `requests` 库的基本使用方法,详细解释了其七个主要函数。其中,`requests.request()` 是构建请求的基础方法,支持其他高级功能的实现。此外,我们还重点介绍了如何使用 `requests.get()` 方法来获取 HTML 网页内容,这是进行网页数据抓取和解析的重要步骤。通过这些基础方法,读者可以轻松上手并掌握网页数据抓取的核心技巧。 ... [详细]
  • 在探讨Hibernate框架的高级特性时,缓存机制和懒加载策略是提升数据操作效率的关键要素。缓存策略能够显著减少数据库访问次数,从而提高应用性能,特别是在处理频繁访问的数据时。Hibernate提供了多层次的缓存支持,包括一级缓存和二级缓存,以满足不同场景下的需求。懒加载策略则通过按需加载关联对象,进一步优化了资源利用和响应时间。本文将深入分析这些机制的实现原理及其最佳实践。 ... [详细]
  • 在本文中,我们将为 HelloWorld 项目添加视图组件,以确保控制器返回的视图路径能够正确映射到指定页面。这一步骤将为后续的测试和开发奠定基础。首先,我们将介绍如何配置视图解析器,以便 SpringMVC 能够识别并渲染相应的视图文件。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
  • 深入解读代码页与字符集的概念及其实际应用
    许多开发者可能未曾留意到这一问题,但如果您的网站频繁遭遇不明原因的乱码现象,深入了解代码页与字符集的概念及其实际应用将大有裨益。代码页(Codepage),即内码表,是计算机系统中用于映射字符与其编码值的一种机制,不同的代码页支持不同的字符集,正确选择和配置代码页对于确保文本数据的准确显示至关重要。在多语言环境下,合理运用字符集和代码页能够有效避免字符编码冲突,提升用户体验。 ... [详细]
author-avatar
茶人2502933107
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有