如何使用会话Cookie和Java实现JWT身份验证

HTTP是无状态协议,用于传输数据。它启用了客户端和服务器端>之间的通信。它最初是为了在Web浏览器和Web服务器之间建立连接而建立的。比如在网上购物,我们添加一些商品,例如。耳机到我们的购物车,然后,我们继续寻找其他项目,在此期间,我们希望在执行任何其他任务是存储购物车项目的状态且不丢失它们。这意味着我们希望在整个购物过程中记住我们的状态。由于HTTP是无状态协议,因此要克服问题,我们可以使用会话或者令牌

1、基于会话的身份验证

在JSON Web令牌出现之前,我们主要使用这种身份验证。在这种身份验证中,服务器负责身份验证,客户端不知道发送请求后服务器端会发生什么。

那么什么是会话Cookie?

由于客户端未指定Expires(过期时间)或Max-Age(最大上限)指令,因此在客户端关闭时将其删除。但是,Web浏览器可能会使用会话还原,这会使大多数会话Cookie永久保持状态,就像从未关闭过浏览器一样。

用户在网络浏览器上登录网站发生什么。例如,用户登录后,服务器 将为该用户创建一个会话并将该会话数据存储在服务器内存中。当用户在网站上执行某些活动时,会创建一个会话ID,该会话ID存储在客户端浏览器的cookie中。在用户提出的每个请求中,cookie都将随之发送。然后,当用户最初登录时,服务器可以使用存储在服务器内存中的会话数据来验证Cookie上的会话数据。当用户从网站注销时,该会话数据将从数据库和服务器内存中删除。

2、基于令牌的身份验证

在基于令牌的身份验证中,我们使用JWT(JSON Web Tokens)进行身份验证。这是RESTful API的广泛使用方法。

当用户发送带有登录详细信息的用户身份验证请求时,服务器将以JSON WEB TOKENS(JWT)的形式创建一个加密的令牌,并将其发送回客户端。当客户端收到令牌时,这意味着该用户以通过身份验证,可以使用客户端执行任何活动。

JWT通常存储在客户端的localstorage中,当用户从服务器请求任何数据或对该网站执行任何活动时,JWT将作为该用户的唯一密钥发送。因此,当服务器接收到该请求时,它将针对每个请求验证JWT仅是该特定用户,然后将所需的响应发送回客户端。

localStorage.setItem("key", "value");

用户状态存储在客户端JWT中。当用户注销时,令牌将从客户端(localStorage)中删除。因此,大多数数据存储在客户端,并且可以直接访问,而不是向服务器发送请求。

JSON WEB TOKENS由(.)连接的三个部分组成:
1.标头
2.有效载荷
3.签名

JWT结构:
xxxxx.yyyyy.zzzzz

输出包含三个由点分割的Base64-URL字符串,可以在HTML和HTTP环境中轻松传递这些字符串,与基于XML的标准(例如SAML)相比,它更紧凑。

JWT已对先前的标头和有效负载进行了编码,并用一个密钥进行签名,如下

哪个更好用?

在现代Web应用程序中,JWT被广泛使用,因为它的伸缩性优于基于会话的cookie,因为令牌存储在客户端,而会话使用服务器内存来存储用户数据,这可能是一个大问题。大量用户一次访问应用程序。由于JWT是随着每个请求一起发送的,而且包含所有用户信息,因此即使对JWT进行了编码,也有必要在JWT中使用必要的信息,并且应避免使用敏感信息或者将其加密以防止安全攻击。

没有固定的方法可以始终使用,它取决于开发人员和要求的类型,以找出在哪种情况下需要使用哪种方法。

3、jwt实现登录

 //定义JWT的有效时长七天
 private static final long EXPIRE_TIME = 60 * 1000 * 60 * 24 * 7;
 //签发人
 private static String ISSUER = "K_ang";
 /*秘钥*/
 private static final String SING = K*&^A%$#N@!G;
 /**
  * 生成令牌
  *
  * @param map
  * @return
  */
 public static String getToken(Map<String, String> map) {

  //设置过期时间
  Date date = null;
  try {
   date = new Date(System.currentTimeMillis() + EXPIRE_TIME);

   //创建token
   JWTCreator.Builder builder = JWT.create()
     .withIssuer(ISSUER)
     .withExpiresAt(date);
   //添加信息
   map.forEach((k, v) -> {
    builder.withClaim(k, v);
   });
   return builder.sign(Algorithm.HMAC256(SING));
  } catch (Exception e) {
   e.printStackTrace();
   return null;
  }
 }

 /**
  * 验证token
  *
  * @param token
  */
 public static boolean verify(String token, String userNo) {
  try {
   //设置加密算法
   JWTVerifier verifier = JWT.require(Algorithm.HMAC256(SING)).withClaim("userNo", userNo).build();
   //校验token
   DecodedJWT jwt = verifier.verify(token);
   return true;
  } catch (Exception e) {
   return false;
  }

 }

 /**
  * 获取token信息方法
  *
  * @param
  * @return
  */
 public static String getTokenInfo(String token) {
  DecodedJWT decode = JWT.decode(token);
  return decode.getClaim("userNo").asString();
 }
}
@PostMapping("/login")
 public Result login(@PathParam("empNo") String empNo, @PathParam("empPassword") String empPassword) {
  if (empNo == null || "".equals(empNo)) {
   return ResultUtil.error(103, "请输入用户名,用户名不能为空");
  }
  if (empPassword == null || "".equals(empPassword)) {
   return ResultUtil.error(103, "请输入密码,密码不能为空");
  }
  Emp emp = empService.login(empNo, empPassword);
  if (emp == null) {
   return ResultUtil.error(103, "用户不存在,获取token失败");
  }
  if (emp.getEmpPassword() == null || !emp.getEmpPassword().equals(empPassword)) {
   return ResultUtil.error(103, "密码错误,获取token失败");
  }
  //正常token
  String token = JwtUtils.sign(empNo, empPassword);
  emp.setToken(token);
  return ResultUtil.success(200, "登录成功", emp);
 }

以上就是如何使用会话Cookie和Java实现JWT身份验证的详细内容,更多关于使用会话Cookie和Java实现JWT身份验证的资料请关注我们其它相关文章!

(0)

相关推荐

  • Spring Boot 2结合Spring security + JWT实现微信小程序登录

    项目源码:https://gitee.com/tanwubo/jwt-spring-security-demo 登录 通过自定义的WxAppletAuthenticationFilter替换默认的UsernamePasswordAuthenticationFilter,在UsernamePasswordAuthenticationFilter中可任意定制自己的登录方式. 用户认证 需要结合JWT来实现用户认证,第一步登录成功后如何颁发token. public class CustomAuthe

  • 深入了解java-jwt生成与校验

    什么是 JWT 这里是jwt 官方地址,想了解更多的可以在这里查看. jwt 全称是JSON Web Token,从全称就可以看出 jwt 多用于认证方面的.这个东西定义了一种简洁的,自包含的,安全的方法用于通信双方以 json 对象的形式传递信息.其中简洁,安全,传递信息和 web 系统非常契合. jwt 实际上就是一个字符串,由以下三个部分构成(通过.分隔): Header 头部 Payload 负载 Signature 签名 因此一个 jwt 字符串都是如下的形式: Header.Payl

  • springboot+jwt+springSecurity微信小程序授权登录问题

    场景重现:1.微信小程序向后台发送请求 --而后台web采用的springSecuriry没有token生成,就会拦截请求,,所以小编记录下这个问题 微信小程序授权登录问题 思路 参考网上一大堆资料 核心关键字: 自定义授权+鉴权 (说的通俗就是解决办法就是改造springSecurity的过滤器) 参考文章 https://www.jb51.net/article/204704.htm 总的来说的 通过自定义的WxAppletAuthenticationFilter替换默认的UsernameP

  • Java中使用JWT生成Token进行接口鉴权实现方法

    先介绍下利用JWT进行鉴权的思路: 1.用户发起登录请求. 2.服务端创建一个加密后的JWT信息,作为Token返回. 3.在后续请求中JWT信息作为请求头,发给服务端. 4.服务端拿到JWT之后进行解密,正确解密表示此次请求合法,验证通过:解密失败说明Token无效或者已过期. 流程图如下: 一.用户发起登录请求 二.服务端创建一个加密后的JWT信息,作为Token返回 1.用户登录之后把生成的Token返回给前端 @Authorization @ResponseBody @GetMappin

  • Spring Cloud Gateway 使用JWT工具类做用户登录校验功能

    1. JWT测试 /** * @Auther: csp1999 * @Date: 2021/01/24/19:29 * @Description: JWT测试 */ public class JwtTest { /** * 创建Jwt令牌: * * JWT = 头部Header + 载荷playload + 签名signature */ @Test public void testCreateJwt() { // 构建jwt令牌 // 1.头部Header: 描述关于该JWT的最基本的信息,例如

  • Java中基于Shiro,JWT实现微信小程序登录完整例子及实现过程

    小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html : 本文是对接微信小程序自定义登录的一个完整例子实现 ,技术栈为 : SpringBoot+Shiro+JWT+JPA+Redis. 如果对该例子比较感兴趣或者觉得言语表达比较啰嗦,可查看完整的项目地址 : https://github.com/EalenXie/shiro-jwt-applet

  • 基于Java验证jwt token代码实例

    这篇文章主要介绍了基于Java验证jwt token代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 How to load public certificate from pem file..?地址 1.HS256对称加密 package jwt; import java.io.FileInputStream; import java.io.IOException; import java.security.KeyFactory; im

  • SpringSecurity+JWT实现前后端分离的使用详解

    创建一个配置类 SecurityConfig 继承 WebSecurityConfigurerAdapter package top.ryzeyang.demo.common.config; import org.springframework.context.annotation.Bean; import org.springframework.security.access.hierarchicalroles.RoleHierarchy; import org.springframework

  • 如何使用会话Cookie和Java实现JWT身份验证

    HTTP是无状态协议,用于传输数据.它启用了客户端和服务器端>之间的通信.它最初是为了在Web浏览器和Web服务器之间建立连接而建立的.比如在网上购物,我们添加一些商品,例如.耳机到我们的购物车,然后,我们继续寻找其他项目,在此期间,我们希望在执行任何其他任务是存储购物车项目的状态且不丢失它们.这意味着我们希望在整个购物过程中记住我们的状态.由于HTTP是无状态协议,因此要克服问题,我们可以使用会话或者令牌 1.基于会话的身份验证 在JSON Web令牌出现之前,我们主要使用这种身份验证.在这种

  • Django中的JWT身份验证的实现

    1.认证与授权 1.验证:身份验证是验证个人或设备标识的过程.身份验证过程之一是登录过程.注册网站后,您的信息(ID,密码,名称,电子邮件等)将存储在其数据库中.之后,您无需创建帐户即可提供信息.相反,您只需要提供用户名和密码来验证您的身份,网站就会自动知道您正在访问. 2.授权:授权是用于确定用户特权或访问级别的安全机制.在许多社区网站上,只有上传帖子和管理员的人才能删除它.当其他人尝试删除帖子时,网站应该抛出错误(但是在许多情况下,他们甚至看不到删除按钮).因此,对于每个请求,用户都需要证明

  • asp.core 同时兼容JWT身份验证和Cookies 身份验证两种模式(示例详解)

    在实际使用中,可能会遇到,aspi接口验证和view页面的登录验证情况.asp.core 同样支持两种兼容. 首先在startup.cs 启用身份验证. var secrityKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration["SecurityKey"])); services.AddSingleton(secrityKey); services.AddAuthentication(CookieAut

  • DRF使用simple JWT身份验证的实现

    前言 在Django的前后端分离项目中DRF(Django Restframe Work)框架无疑是首选,关于token验证一般使用的是JWT,但是JWT只支持到Django1.x的版本. 官方推荐Django2.x之后的版本使用simple JWT,官方文档. 登录返回token和refresh user 模型类: 我user模型类继承的是django.contrib.auth.models.AbstractUser,这样可以使用Django自带的认证. 如果继承该类,我们就必须在settin

  • java使用google身份验证器实现动态口令验证的示例

    最近有用户反应我们现有的短信+邮件验证,不安全及短信条数限制和邮件收验证码比较慢的问题,希望我们也能做一个类似银行动态口令的验证方式.经过对可行性的分析及慎重考虑,可以实现一个这样的功能. 怎么实现呢,是自己开发一个这样的app?这样成本太高了,为了节约成本,我们使用互联网使用比较多的google身份验证器.使用它,我们只需要开发服务端就可以了. google身份验证器的原理是什么呢?客户端和服务器事先协商好一个密钥K,用于一次性密码的生成过程,此密钥不被任何第三方所知道.此外,客户端和服务器各

  • asp.net core中如何使用cookie身份验证

    背景 ASP.NET Core Identity 是一个完整的全功能身份验证提供程序,用于创建和维护登录名. 但是, cookie 不能使用基于的身份验证提供程序 ASP.NET Core Identity . 配置 在 Startup.ConfigureServices 方法中,创建具有 AddAuthentication 和 AddCookie 方法的身份验证中间件服务: services.AddAuthentication(CookieAuthenticationDefaults.Auth

  • Java JWT实现跨域身份验证方法详解

    目录 1.JWT简介 2.JWT的结构 2.1 头部(header) 2.2 载荷(payload) 2.3 签证(signature) 3.JWT的原则 4.JWT的用法 5.JWT的问题和趋势 6.整合JWT令牌 6.1 在模块中添加jwt工具依赖 6.2 创建JWT工具类 1.JWT简介 JWT(JSON Web Token)是目前流行的跨域认证解决方案,是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信

  • JavaScript返回当前会话cookie全部键值对照的方法

    本文实例讲述了JavaScript返回当前会话cookie全部键值对照的方法.分享给大家供大家参考.具体如下: 下面的JS代码输出全部的cookie键值对照 <!DOCTYPE html> <html> <body> Cookies associated with this document: <script> document.write(document.cookie); </script> </body> </html&g

  • Cookie在Java中的使用

    什么是Cookie 在现实生活中,当顾客第一次在超市购物,通常服务员会询问是否办理一张会员卡来积分以便日后折扣等福利活动.会员卡会记录顾客的姓名.积分.消费记录等信息,如果顾客要参与超市的福利活动等都需要提供会员卡,服务员在后台刷卡查询即可知道是哪个用户在使用会员卡. 现在将现实生活中的案例中的角色互换一下. 当用户没有在Web服务器登记过用户信息,而使用网站提供的需登录的服务时,服务器会告知浏览器跳转到登陆页面进行用户信息的登记操作,登录完成之后,浏览器向服务器发起一次登陆请求,服务器将用户的

  • java使用JWT的方法

    目录 一.简介 1.Header 2.Payload 3.Signature 4.组合 二.封装类 1.引入依赖 2.封装方法 三.使用方法 一.简介 JWT是token的一种,一个JWT字符串包含三个部分 1.Header 头部信息,一般不需要声明,默认为 HS256 签名算法和 JWT 令牌类型 { "alg": "HS256", // 指定签名算法 "typ": "JWT" // 指定token令牌类型 } 2.Payl

随机推荐