当前位置: 首页 > 编程日记 > 正文

cookie和session的代码实现

cookie和session的代码实现

1、设置cookie

今天笔试题考的是cookie的设置,我竟然选了request也可以设置cookie,我的天呀。

我们来看如何在response设置吧

复制代码
public void service(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{Cookie c = new Cookie("name","jenkins");resp.addCookie(c);} 
复制代码

这样子设置,实际上是在返回的消息头中加了一个key-value,key为Set-Cookie,value也是key-value的形式,上面的就是:name=jenkins,多个cookie用分号(;)隔开

消息头中的样式是:Set-Cookie:name=jenkins;JSESSIONID=ERERE23343423

其实如果要在request中把cookie返回到服务器端,我们可以在请求的消息头中加一个值:

复制代码
package servletbase;import java.io.IOException;
import java.io.Writer;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.Header;
import org.apache.commons.httpclient.HttpClient;public class MyServlet01 extends HttpServlet{public void postCookieToServer(){HttpClient client = new HttpClient();List<Header> headers = new ArrayList<Header>();//把key为JSESSIONID的cookie上传到服务器,服务器会根据这个id来判断//发起该会话的用户是不是之前登录过,做鉴权headers.add(new Header("cookie","JSESSIONID=RERER3"));//设置消息头client.getHostConfiguration().getParams().setParameter("http.default-headers", headers);}}
复制代码

2、查询Cookie

在请求对象中获取:

复制代码
public void getCookieFromRequest(HttpServletRequest request){//获取cookie数组Cookie[] cookies = request.getCookies();for(Cookie cookie:cookies){//获取cookie的key-valueString name = cookie.getName();String value = cookie.getValue();}}
复制代码

3、修改Cookie

复制代码
public void updateCookieFromRequest(HttpServletRequest request,HttpServletResponse response){//获取cookie数组Cookie[] cookies = request.getCookies();for(Cookie cookie:cookies){//修改cookie的valueString name = cookie.getName();if(name.equals("city")){cookie.setValue("guangzhou");response.addCookie(cookie);}}}
复制代码

4、Cookie的编解码(value为中文时需要编码,否则访问时会报错)

复制代码
     //编码Cookie c = new Cookie("city",URLEncoder.encode("广州","utf-8"));//解码String value = c.getValue();value = URLDecoder.decode(value,"utf-8");
复制代码

5、Cookie的其他方法

复制代码
//设置生存时间,单位是秒,默认小于零,保存在内存中。等于零是即刻删除
cookie.setMaxAge(30)//设置路径,浏览器访问服务器时只向cookie路径或者子路径发送cookie,以下访问/web/index.html是会发cookie,但访问/myweb/index.html就不会了
cookie.setPath("/web");
复制代码

6、Cookie的限制

a、可以被用户限制

b、保存在浏览器,不安全,敏感数据要进行加密

c、只能保存少量数据,大约4k左右

d、个数有限制

e、只能保存字符串

7、Session定义和工作原理

简单来说Session就是服务器为每一个访问的浏览器分配的内存空间,它有一个唯一的id,并且会将这个jsessionid以cookie的形式发送到浏览器(服务器调用了getSession()方法才会返回jsessionid到浏览器,并不是每个请求过来都返回),浏览器再次访问时就会把这个jsessionid发送到服务器,服务器就能找到session对象。

如果浏览器再次访问(请求消息头中带有jessionid)时,服务器能找到对应的sessionid,则服务器不再返回sessionid到浏览器。

8、获取Session

复制代码
//参数为true时一定会返回session对象
HttpSession session = request.getSession(true);
//不加参数默认是true
HttpSession session = request.getSession();//参数为false时,则没有sessionid时返回null
//有sessionid,但找不到session对象时也返回null,能找到session对象就返回该对象
HttpSession session = request.getSession(false);
复制代码

9、使用Session绑定对象

1
2
3
4
5
6
7
8
9
//绑定对象
void session.setAttribute(String name,Object boj);
//获取绑定对象
Object session.getAttribute(String name);
//移除绑定对象
void session.removeAttribute(String name);
//删除session对象
session.invalidate();

10、Session超时

服务器会将空闲时间过长的session对象删除以节省内存空间资源,一般是30分钟

在tomcat的conf/web.xml文件夹设置(单位是分钟):

<session-config>

<session-timeout>30</session-timeout>

</session-config>

通过编程修改:

void session.setMaxInactiveInterval(int seconds)

11、浏览器禁用cookie后果及解决方法

浏览器禁用cookie后,session就不能用了,因为jsessionid不能在浏览器保存。

解决办法:使用URL重写方法解决,就是在重定向时在url中加sessionid参数,就不需要浏览器保存了。看以下的例子,假如登录验证过程了,需要重定向到首页

复制代码
if(name.equals("admin") && pwd.equals("admin")){session.setAttribute("name",name);//重定向到首页//response.sendRedirect("index.jsp");//改为,其会在路径后面加上jsessionid,//System.out.println("url:" + resp.encodeRedirectURL("index.html")); --> url:index.html;jsessionid=4E885D5D87247441F761C96ACA9A7B68response.sendRedirect( response.encodeRedirectURL("index.jsp"));              }
复制代码

登录之后我们就可以把sessionid保存到页面,访问时把它带上就好了,可以在url后面加上sessionid,如下:

localhost:8080/testweb/servlet01;jsessionid=4E885D5D87247441F761C96ACA9A7B68

另外如果在服务器端没有生成session对象,服务器是不会返回sessionid的cookie到浏览器的,即在服务器端要调用request.getSession()

12、Session的优缺点

优点:

a、安全(状态保存在服务器端)

b、能保存的数据类型更多,cookie只能是字符串

c、能保存更多数据

缺点:

session将状态保存在服务器端,占用服务器内存,当用户量过大时,会严重影响服务器性能。

转载于:https://www.cnblogs.com/baojiao/p/6007123.html

相关文章:

idea 批量修改同一列_学会这个,1秒就可以批量处理文件

【问题1】根据公司名称&#xff0c;批量创建文件夹拿到老板给到的这个任务后&#xff0c;没关系我很有耐心&#xff0c;不就是右击新建文件夹重命名保存吗&#xff0c;然后加班点鼠标到天荒地老&#xff0c;终于完成了。结果老板说有些公司名有误要改正过来&#xff0c;还有几百…

动态规划和分治法的区别

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 动态规划也是一种分治思想&#xff08;比如其状态转移方程就是一种分治&#xff09;&#xff0c;但与分治算法不同的是&#xff0c;分治算法是把原问…

关于链式前向星。

一些代码 理解 #include<bits/stdc.h> using namespace std; //优先队列优化的链式前向星 const int maxn1000; const int INF0x3fffffff; struct Edge{int from, to, dist;Edge(int u, int v, int d):from(u),to(v),dist(d){} }; struct HeapNode{int u, d;HeapNode(int…

Ceph分层存储分析

最近弄Ceph集群考虑要不要加入分层存储 因此花了点时间研究了下 1&#xff0c;首先肯定要弄清Ceph分层存储的结构 &#xff0c;结构图大概就是下图所示 缓存层(A cache tier)为Ceph客户端提供更好的I/O性能&#xff0c;而数据存储在存储层(a backing storage tier)。用相对快速…

jemeter多场景混合案例_Redis 混合存储最佳实践指南

Redis 混合存储实例是阿里云自主研发的兼容Redis协议和特性的云数据库产品&#xff0c;混合存储实例突破 Redis 数据必须全部存储到内存的限制&#xff0c;使用磁盘存储全量数据&#xff0c;并将热数据缓存到内存&#xff0c;实现访问性能与存储成本的完美平衡。架构及特性命令…

交易所频频被盗,你该如何保护自己的数字资产?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 5月8日凌晨&#xff0c;数字货币交易所币安发生被盗事件&#xff0c;黑客从币安热钱包盗走大约 7000 个比特币。币安官方公告称&#xff0c;这是一次…

gitlab搭建

一、安装源和依赖包 #增epel源,如果你是i686系统&#xff0c;请把x86_64修改下。cd /usr/local/src wget -O /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 https://www.fedoraproject.org/static/0608B895.txt rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6 rpm -Uvh http://dl.f…

kafka源码分析(二)Metadata的数据结构与读取、更新策略

一、基本思路 异步发送的基本思路就是&#xff1a;send的时候&#xff0c;KafkaProducer把消息放到本地的消息队列RecordAccumulator&#xff0c;然后一个后台线程Sender不断循环&#xff0c;把消息发给Kafka集群。 要实现这个&#xff0c;还得有一个前提条件&#xff1a;就是K…

python实现简单的http服务器_Python实现简单HTTP服务器(二)

#coding:utf-8importsocketimportreimportsysfrom multiprocessing importProcessclassHTTPServer(object):def __init__(self, application):"""application&#xff1a;指的是框架的app"""self.server_socketsocket.socket(socket.AF_INET, so…

机器学习中的模型评价、模型选择及算法选择

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 正确使用模型评估、模型选择和算法选择技术无论是对机器学习学术研究还是工业场景应用都至关重要。本文将对这三个任务的相关技术进行回顾&#xff…

Apache 流框架 Flink,Spark Streaming,Storm对比分析(一)

https://bigdata.163.com/product/article/5 Apache 流框架 Flink&#xff0c;Spark Streaming&#xff0c;Storm对比分析&#xff08;一&#xff09;转载于:https://www.cnblogs.com/WCFGROUP/p/9075745.html

梯度下降算法_神经网络梯度下降算法

神经网络梯度下降算法2018, SEPT 13梯度下降&#xff08;Gradient Descent) 是神经网络比较重要的部分&#xff0c;因为我们通常利用梯度来利用Cost function&#xff08;成本函数&#xff09; 进行backpropagation&#xff08;反向传播&#xff09; 不断地iteration&#xff0…

微擎删除分类无法删除解决-select in效率低解决办法

今天朋友微擎后台微网站里的分类要删除&#xff0c;可是怎么删除也不能删除&#xff0c;同样的系统另一套却可以迅速删除。 后来查询到是查询语句的问题&#xff0c;朋友的平台用户量太大&#xff0c;数据太大&#xff0c;用了以下语句&#xff0c;造成效率太低&#xff1a; SE…

EOS技术及生态系统介绍

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 嘉宾介绍 哈胜&#xff0c;现任梦起文化传播有限公司技术总监&#xff0c;西北地区区块链技术发起第一人&#xff1b;一直在致力于将区块链技术推广…

svn 提交信息模板

版本&#xff1a;1.0作者&#xff1a;张三描述&#xff1a;修改了xxx转载于:https://www.cnblogs.com/ithfm/p/9075748.html

pta函数统计素数并求和_黎曼的zeta函数

9月24日阿提亚爵士&#xff08;Sir Atiyah&#xff09;直播“证明”黎曼猜想&#xff08;Riemann hypothesis&#xff09;在普通人中引发了一轮数学热潮&#xff0c;网络上一时间涌现了很多数学八卦文章。许多人在论及该命题重要性时都指出&#xff0c;ζ函数的非平凡零点与素数…

EasyRTMP手机直播推送rtmp流flash无法正常播放问题

本文转自EasyDarwin团队Kim的博客&#xff1a;http://blog.csdn.net/jinlong0603/article/details/52960750 问题简介 EasyRTMP是EasyDarwin团队开发的一套简单易用的RTMP推送SDK。本文想讲述下开发过程中遇到的一个问题。问题的现象是使用EasyRTMP推送音视频流到自己搭建的ngi…

对称加密和非对称加密

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 对称加密 对称密钥是双方使用相同的密钥 。 对称加密的要求 &#xff08;1&#xff09;需要强大的加密算法。算法至少应该满足&#xff1a;即使…

防火墙iptables介绍

防火墙&#xff1a; netfilter/iptables是集成在Linux2.4.X版本内核中的包过滤防火墙系统。该架构可以实现数据包过滤&#xff0c;网络地址转换以及数据包管理功能。linux中防火墙分为两部分&#xff1a;netfilter和iptables。netfilter位于内核空间&#xff0c;目前是Linux内核…

企业局域网的组建

写在前面的话 随着计算机技术发展啊&#xff0c;办公无纸化、网络化已经成为一种趋势。 企业局域网的概述 企业中可能有多台计算机&#xff0c;同时还可能有其他的硬件设备&#xff0c;比如打印机、扫描仪和数码相机等。通过组建小型网络&#xff0c;可以共享企业内部各种软、硬…

python3 线程池源码解析_5分钟看懂系列:Python 线程池原理及实现

概述传统多线程方案会使用“即时创建&#xff0c; 即时销毁”的策略。尽管与创建进程相比&#xff0c;创建线程的时间已经大大的缩短&#xff0c;但是如果提交给线程的任务是执行时间较短&#xff0c;而且执行次数极其频繁&#xff0c;那么服务器将处于不停的创建线程&#xff…

区块链+能源,能擦出什么样的火花?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 区块链从闯入能源行业的那一天起&#xff0c;就引起了行业内外人群的高度关注&#xff0c;关于能源区块链的争论与质疑不断搅动人们的神经。区块链能…

JS学习梳理(三)类型和语法

类型 JavaScript 有七种内置类型&#xff1a;null、undefined、boolean、number、string、object 和symbol&#xff0c;可以使用typeof 运算符来查看typeof返回的都是字符串很多开发人员将undefined 和undeclared 混为一谈&#xff0c; 但在JavaScript 中它们是两码事。undefin…

北师大历史系65 级同学聚会宁夏【之七】——在中阿之轴、西夏王陵、董府、板桥道堂、鸿乐府及告别宴会...

北师大历史系65级同学在中阿之轴 庞心田、王庆云、李建宇、樊淑爱、何明书、郑文范、李建宇夫人、惠晓秋、边聪民、登高夫人、张登高、杨家兴、杨森翔 西夏王陵 北师大历史系65级同学在西夏王陵 北师大历史系65级同学在西夏王陵 郑文范、王庆云在沙湖 北师大历史系65级同学在董…

会声会影水墨遮罩如何变大_自媒体长期网赚项目: 自媒体如何打造自己的自媒体知识付费课程(干货)...

小编简介&#xff1a;猫哥&#xff0c;自媒体人&#xff0c;9年互联网营销实战经验&#xff0c;乐于为大家分享实战经验&#xff0c;希望认识更多志同道合的朋友。面对现在知识付费的时代&#xff0c;知识就是财富&#xff0c;能把自己储存的知识转化为财富的人并不多&#xff…

OBS源代码阅读笔记

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 obs配置文件加载&#xff1a;bool OBSBasic::InitBasicConfig(); OBS认证信息加载&#xff0c;貌似还没有实现吗&#xff1f; void Auth::Load(){ …

存储器结构层次(二)

局部性&#xff1a; 局部性分为时间局部性和空间局部性&#xff1a;Locality is typically described as having two distinct forms: temporal locality and spatial locality. In a program with good temporal locality, a memory location that is referenced once is like…

python 核心编程 第十三章

python面对对象 类和实例&#xff1a;类是对象的定义&#xff0c;实例是真真的实物。 创建一个类&#xff1a; class AddrBookEnttry(object):def __init__(self, nm, ph):self.name nmself.phone phprint"Created instance for:", self.namedef updatePhone(self,…

python写一个文件下载器_Python3使用TCP编写一个简易的文件下载器

原标题&#xff1a;Python3使用TCP编写一个简易的文件下载器利用Python3来实现TCP协议&#xff0c;和UDP类似。UDP应用于及时通信&#xff0c;而TCP协议用来传送文件、命令等操作&#xff0c;因为这些数据不允许丢失&#xff0c;否则会造成文件错误或命令混乱。下面代码就是模拟…

提取Jar2Exe源代码,JavaAgent监控法

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 最近遇见一个麻烦&#xff0c;明明知道是java写的小软件&#xff0c;但是打包成了exe&#xff0c;木得办法&#xff0c;之前打包的都有缓存能在TEMP…