博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
javaweb入门笔记(5)-cookie和session
阅读量:6575 次
发布时间:2019-06-24

本文共 2471 字,大约阅读时间需要 8 分钟。

hot3.png

javaweb入门笔记(5)-cookie和session

标签: javaweb


[TOC]


Cookie是客户端技术;Session是服务器端技术。

API:

cookie

一些细节:

  • 一个cookie只能标识一种信息,至少含有标识该信息的名称和值
  • 浏览器一般只允许存放300个cookie,每个站点最多存放20个,每个cookie大小限制为4KB
  • 默认是会话级别cookie(存储于浏览器内存),浏览器进程关闭则删除。有效期通过maxAge设置,存于硬盘,0表示删除
  • 删除cookie时,path必须一致,否则不会删除

session

session对象由服务器创建,一个浏览器(会话)独占一个session对象

session对象由服务器创建生命周期

  • 创建:调用request对象的getSession方法后才会创建session对象;getSession(false)只获取, 不创建
  • 销毁:默认30分钟没人使用则自动销毁。失效时间可在web.xml<session-config>标签中使用<session-timeout>,单位分钟;也可调用session对象的invalidate方法销毁

实现原理

session基于cookie实现,将JSESSIONID写回浏览器,这个cookie(JSESSIONID)默认没设置有效期,关浏览器即销毁。可以自行回写JSESSIONID覆盖原cookie值

示例代码片段:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {    HttpSession session = req.getSession();    String sessionid = session.getId();    Cookie cookie = new Cookie("JSESSIONID",sessionid);    cookie.setPath("/s1");    cookie.setMaxAge(30*60);    resp.addCookie(cookie);}

应用案例

  • 用户登录
  • 防止表单重复提交
  • 一次性验证码的校验

小Tips

  • 一般大型网站不用session,使用cookie,减小服务器压力
  • 若浏览器禁用cookie,需使用url自带sessionid,相关方法:encodeURLencodeRedirectURL
  • 禁止表单重复提交:在javascript或者服务器实现。javascript防不死,用户可通过修改js、自建表单提交,刷新页面,后退等方法重复提交;服务器实现是给每个表单一个随机表单号
  • 生成表单号使用“令牌发生器”,为保证唯一性(减小重复概率),使用单例。
  • base64编码,三字节变四字节,每6位变8位(一字节),高位补零,每字节最大值为63,故得名。
  • md5,常用于保存密码(可能为防止破解会加随机数),校验数据完整性

防止表单重复提交之令牌例子:

package org.iot.data;import sun.misc.BASE64Encoder;import java.security.MessageDigest;import java.security.NoSuchAlgorithmException;import java.util.Random;/** * Created by brian on 2016/1/27. */public class TokenProcessor {//令牌    /**     * 1.构造方法私有     * 2.自己创建一个     * 3.对外暴露一个方法,允许获取上面创建的对象     */    private TokenProcessor(){}    private  static final TokenProcessor instance = new TokenProcessor();    public static TokenProcessor getInstance(){        return instance;    }    public String genetateToken(){        String token = System.currentTimeMillis()+new Random().nextInt()+"";        try {            MessageDigest md =  MessageDigest.getInstance("md5");            byte [] md5 =  md.digest(token.getBytes());            //base64编码            BASE64Encoder encoder = new BASE64Encoder();            return encoder.encode(md5);        } catch (NoSuchAlgorithmException e) {            e.printStackTrace();            throw new RuntimeException(e);        }    }}

三个域对象

  • Session
  • Request
  • ServletContext

容器选用经验:

  • 数据显示完了就没用了,则选用Request
  • 数据除了显示外,稍后还会用,则选用Session
  • 数据除了显示外,不仅稍后会用,还会给别人用,则选用ServletContext

作者更多文章: | |

转载于:https://my.oschina.net/brianway/blog/614216

你可能感兴趣的文章
在Unbuntu 上安装Phalcon
查看>>
常用的加密算法--摘要认证和签名认证的实现
查看>>
webplayer 设置加载图标和屏蔽右键
查看>>
Jolt大奖获奖图书
查看>>
drools 将添加switch支持
查看>>
android中webview空间通过Img 标签显示sd卡中 的图片
查看>>
url 的正则表达式:path-to-regexp
查看>>
ubuntu 16.04 安装PhpMyAdmin
查看>>
安卓开启多个服务
查看>>
设置分录行按钮监听事件
查看>>
C Primer Plus 第5章 运算符、表达式和语句 5.2基本运算符
查看>>
蓝牙手柄按键码
查看>>
java并发库之Executors常用的创建ExecutorService的几个方法说明
查看>>
Spring框架错误之org.springframework.beans.factory.BeanCreationException
查看>>
23种设计模式(1):单例模式
查看>>
socket 编程入门教程(五)UDP原理:4、“有连接”的UDP
查看>>
Jquery获取iframe中的元素
查看>>
Laravel 学习笔记5.3之 Query Builder 源码解析(下)
查看>>
Struts2简单入门实例
查看>>
2012CSDN年度博客之星评选http://vote.blog.csdn.net/item/blogstar/xyz_lmn
查看>>