java基础之----cookie,session,jwt
概要
web中为什么要引入cookie、session机制,为了验证用户的身份,验证用户的身份是为了系统的安全,那如果是系统和系统之间的API调用怎么办呢?因为系统之间调用往往是没有用户系统的(用户系统就是使用用户名,密码机制),这时就出现了JWT,下面详细说明cookie,session,JWT的流程,原理和代码演示。
cookie,session机制原理
首先,cookie是浏览器保存的,session是服务器保存的,那cookie和session有什么关系呢?如下,当用户首次访问的时候,服务器会为用户的这次会话建立一个session,每个session都有一个独立的session id,当服务器响应浏览器的时候会把这个sessionid返回到浏览器,返回到浏览器放到哪里呢,放到cookie中,为什么要放到cookie中呢?因为用户下次再访问这个网站的时候需要把这个session id放到请求参数中,也就是说这个cookie是每次用户访问服务器都要带上的。
session超时的问题?
用户每次访问服务器,服务端都会自动为session超时时间续签,session默认的超时时间是30分钟。
session共享的问题?
如果服务端只有一个节点,就不存在共享问题,只有当服务端部署成分布式,才会有session共享的问题,那怎么实现session共享呢?目前主流的做法是使用redis把session缓存起来,所有节点每次都读取这个session就实现了session共享,spring-session已经把这种方式集成进来,后续会有例子。
JWT原理
jwt的验证一般来说是无状态的,什么叫无状态呢?在cookie-session机制中,服务器需要保存session,这种就是有状态的,而jwt机制,服务器不会保存这种信息,那jwt怎么实现权限认证呢?要弄清楚这个问题,需要先搞清楚jwt的组成,jwt由3部分组成,分别为:header(头部)、payload(载荷)、signature(签名),下面举个例子介绍这3个东东是什么。
header往往是这个样子:
{
"alg": "HS256",
"typ": "JWT"
}
上面代码中,alg属性表示签名的算法(algorithm),默认是 HMAC SHA256(写成 HS256);typ属性表示这个令牌(token)的类型(type),JWT 令牌统一写为JWT。
最后,将上面的 JSON 对象使用 Base64URL 算法(详见后文)转成字符串。
payload往往是这个样子:
{
"sub": "1234567890",
"name": "John Doe",
"admin": true
}
注意,JWT 默认是不加密的,任何人都可以读到,所以不要把秘密信息放在这个部分。
这个 JSON 对象也要使用 Base64URL 算法转成字符串。
signature往往这样子:
Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)
算出签名以后,把 Header、Payload、Signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
代码示例
session-cookie机制的基本使用方法:
@Controller
public class CookieTest { @ResponseBody
@RequestMapping(value = "/get",method = RequestMethod.GET)
public String test(HttpSession session){
String value = String.valueOf(session.getAttribute("g"));
System.out.println(value);
return "cookie";
} @ResponseBody
@RequestMapping(value = "/add",method = RequestMethod.GET)
public String cookieTest(HttpServletResponse response, HttpSession session){
Cookie cookie= new Cookie("asdf","asfd");
response.addCookie(cookie);
session.setAttribute("g","niubi");
session.setMaxInactiveInterval(2000);
return "cookie";
}
}
spring-session的基本使用
引入依赖
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
配置yml文件(先在本地安装redis,之后启动redis-server)
spring:
redis:
host: localhost
database: 0
port: 6379
lettuce:
pool:
min-idle: 5
max-idle: 8
max-active: 8
max-wait: 1ms
shutdown-timeout: 100ms
代码测试
@RestController
public class SessionTest { @RequestMapping("/set")
String set(HttpServletRequest req, HttpServletResponse response) {
req.getSession().setAttribute("testKey","niubi");
return "设置session:testKey=niubi";
} @RequestMapping("/query")
String query(HttpServletRequest req) {
Object value = req.getSession().getAttribute("testKey");
return "查询Session:\"testKey\"=" + value;
}
}
在请求完set方法之后可以去redis中看一下,会发现多出了三个key,有兴趣的可以了解一下每个key的作用,参考这篇文章
jwt基本使用
看这个大佬的例子:https://github.com/hyrepo/jwt-demo
参考文章:
http://blog.didispace.com/tags/Spring-Session/
http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
https://github.com/hyrepo/jwt-demo
java基础之----cookie,session,jwt的更多相关文章
- Java web学习 Cookie&&Session
cookie&&session 会话技术 从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话.会 话技术就是记录这次会话中客户端的状态与数据的. 会话技术分为Coo ...
- java ->会话技术Cookie&Session
会话技术Cookie&Session 会话技术简介 存储客户端的状态 由一个问题引出今天的内容,例如网站的购物系统,用户将购买的商品信息存储到哪里?因为Http协议是无状态的,也就是说每个客户 ...
- Java基础-关于session的详细解释
转自:http://hi.baidu.com/zbzbzb/item/65d73d2a4d07cfd40f37f900 一.术语session 在我的经验里,session这个词被滥用的程度大概仅次于 ...
- 存储机制 cookie session jwt token
cookieCookie的诞生 由于HTTP协议是无状态的,而服务器端的业务必须是要有状态的.Cookie诞生的最初目的是为了存储web中的状态信息,以方便服务器端使用.比如判断用户是否是第一次访问网 ...
- Blazor和Vue对比学习(进阶2.2.4):状态管理之持久化保存(2),Cookie/Session/jwt
注:本节涉及到前后端,这个系列的对比学习,还是专注在前端Vue和Blazor技术,所以就不撸码了,下面主要学习概念. 我们知道,Http是无状态协议,客户端请求服务端,认证一次后,如果再次请求,又要重 ...
- JAVA基础之会话技术-Cookie及Session
至此,学习Servlet三个域对象:ServletContext(web项目).request(一次请求).Session(一个客户端)!均有相同的方法! 从用户开始打开浏览器进行操作,便开始了一次会 ...
- 第74节:Java中的Cookie和Session
第74节:第74节:Java中的Cookie和Session ServletContext: 什么是ServletContext,有什么用哦,怎么用呢? 启动服务器后,会给每个应用程序创建一个Serv ...
- Java Web之Servlet及Cookie/Session
Servlet参考文献: 1.http://www.cnblogs.com/luoxn28/p/5460073.html 2.http://www.cnblogs.com/xdp-gacl/p/376 ...
- Java Web学习总结(6)Cookie/Session
一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 二.会话过程中要解决的一些问题 每个用户在使用浏览器与服务器进行 ...
随机推荐
- 2019-11-29-dotnet-core-使用-GBK-编码
原文:2019-11-29-dotnet-core-使用-GBK-编码 title author date CreateTime categories dotnet core 使用 GBK 编码 li ...
- ASP.NET Core快速入门(第3章:依赖注入)--学习笔记
课程链接:http://video.jessetalk.cn/course/explore 良心课程,大家一起来学习哈! 任务16:介绍 1.依赖注入概念详解 从UML和软件建模来理解 从单元测试来理 ...
- WPF中绘图(含调用GDI+)
private void DrawStuff() { // //if (buffer == null) //{ // buffer = new RenderTargetBitmap((int)Back ...
- .net post请求webservice
class Program { static void Main(string[] args) { , name = "jxp" }); var a = HttpHelper.Po ...
- 教你使用 Swoole-Tracker 秒级定位 PHP 卡死问题
PHPer 肯定收到过这样的投诉:小菊花一直在转!你们网站怎么这么卡!当我们线上业务遇到这种卡住(阻塞)的情况,大部分 PHPer 会两眼一抹黑,随后想起那句名言:性能瓶颈都在数据库然后把锅甩给DBA ...
- JAVA性能监控与调优参考文档链接
JAVA性能监控与调优参考文档链接 jdk8工具集 https://docs.oracle.com/javase/8/docs/technotes/tools/unix/index.htmlTroub ...
- 6 、 图论—NP 搜索
6.1 最大团 //最大团 //返回最大团大小和一个方案,传入图的大小 n 和邻接阵 mat //mat[i][j]为布尔量 #define MAXN 60 void clique(int n, in ...
- 前端开发JS——数组
25.数组 1)声明数组: ①构造函数创建数组 var arr = new Array(); console.log(arr): //[] var arr = new Array(2 ...
- vue学习指南:第五篇(详细) - vue的 computed、methods、watch 的区别?
Computed 计算属性 1. 将函数代码块中返回的结果 赋值 给前面的方法名 2. computed 中的属性有缓存功能,只要data中的数据不发生改变,计算得到的新属 性就会被缓存下 ...
- Scrum冲刺第一篇
一.各个成员在 Alpha 阶段认领的任务 负责人和协作者 任务内容 陈嘉欣 设计编码规范 邓镇港 UI设计 肖烈涛 数据库设计 林德泽 设计测试计划 余晓东 用户注册登陆验证模块 陈嘉欣 余晓东 林 ...