用户修改了信息jwt服务器怎么识别,jwt验证登录信息

为什么要告别session?有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在其中一台服务器登录后,用session保存其登录信息,其他服务器怎么知道该用户登录了?(单点登录),当然解决办法有,可以用spring-session。如果该系统同时为移动端服务呢?移动端通过url向后台要数据,如果用session,通过sessionId识别用户,万一sessionId被截获了,别人可以利用sessionId向后台要数据,就有安全隐患了。所以有必要跟session说拜拜了。服务端不需要存储任何用户的信息,用户的验证应该放在客户端,jwt就是这种方式!

什么是jwt?

b76d9af75f6666f86d869d742893091c.png

这里以java的ssm框架为例,集成jwt。

1.pom.xml 导入jwt的包

com.auth0

java-jwt

2.2.0

2.编写jwt的工具类,有加密解密功能就好

import com.auth0.jwt.JWTSigner;

import com.auth0.jwt.JWTVerifier;

import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;

import java.util.HashMap;

import java.util.Map;

public class JWT {

private static final String SECRET = "XX#$%()(#*!()!KL<>?N<:>

private static final String EXP = "exp";

private static final String PAYLOAD = "payload";

//加密,传入一个对象和有效期

public static String sign(T object, long maxAge) {

try {

final JWTSigner signer = new JWTSigner(SECRET);

final Map claims = new HashMap();

ObjectMapper mapper = new ObjectMapper();

String jsonString = mapper.writeValueAsString(object);

claims.put(PAYLOAD, jsonString);

claims.put(EXP, System.currentTimeMillis() + maxAge);

return signer.sign(claims);

} catch(Exception e) {

return null;

}

}

//解密,传入一个加密后的token字符串和解密后的类型

public static T unsign(String jwt, Class classT) {

final JWTVerifier verifier = new JWTVerifier(SECRET);

try {

final Map claims= verifier.verify(jwt);

if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {

long exp = (Long)claims.get(EXP);

long currentTimeMillis = System.currentTimeMillis();

if (exp > currentTimeMillis) {

String json = (String)claims.get(PAYLOAD);

ObjectMapper objectMapper = new ObjectMapper();

return objectMapper.readValue(json, classT);

}

}

return null;

} catch (Exception e) {

return null;

}

}

}

3.jwt有了,ssm要如何去利用,用户验证的第一步是登录,登录时根据用户传来的username和password到数据库验证身份,如果合法,便给该用户jwt加密生成token

//处理登录

@RequestMapping(value="login", produces = "application/json; charset=utf-8")

public @ResponseBody ResponseData login(HttpServletRequest request, @RequestParam( "email") String email,

@RequestParam("password") String password) {

Login login = new Login();

login.setEmail(email);

login.setPassword(password);

ResponseData responseData = ResponseData.ok();

//先到数据库验证

Integer loginId = userService.checkLogin(login);

if(null != loginId) {

User user = userService.getUserByLoginId(loginId);

login.setId(loginId);

//给用户jwt加密生成token

String token = JWT.sign(login, 60L* 1000L* 30L);

//封装成对象返回给客户端

responseData.putDataValue("loginId", login.getId());

responseData.putDataValue("token", token);

responseData.putDataValue("user", user);

}

else{

responseData = ResponseData.customerError();

}

return responseData;

}

4.在用户登录时,把loginId和token返回给前台,以后用户每次请求时,都得带上这两个参数,后台拿到token后解密出loginId,与用户传递过来的loginId比较,如果相同,则说明用户身份合法。因为是每个登录过后的每个请求,这里用springmvc的拦截器做

5.拦截器代码

import java.io.PrintWriter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;

import org.springframework.web.servlet.ModelAndView;

import com.alibaba.fastjson.JSONObject;

import com.xforce.charles.model.Admin;

import com.xforce.charles.model.Login;

import com.xforce.charles.util.JWT;

import com.xforce.charles.util.ResponseData;

public class TokenInterceptor implements HandlerInterceptor{

public void afterCompletion(HttpServletRequest request,

HttpServletResponse response, Object handler, Exception arg3)

throws Exception {

}

public void postHandle(HttpServletRequest request, HttpServletResponse response,

Object handler, ModelAndView model) throws Exception {

}

//拦截每个请求

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,

Object handler) throws Exception {

response.setCharacterEncoding("utf-8");

String token = request.getParameter("token");

ResponseData responseData = ResponseData.ok();

//token不存在

if(null != token) {

Login login = JWT.unsign(token, Login.class);

String loginId = request.getParameter("loginId");

//解密token后的loginId与用户传来的loginId不一致,一般都是token过期

if(null != loginId && null != login) {

if(Integer.parseInt(loginId) == login.getId()) {

return true;

}

else{

responseData = ResponseData.forbidden();

responseMessage(response, response.getWriter(), responseData);

return false;

}

}

else

{

responseData = ResponseData.forbidden();

responseMessage(response, response.getWriter(), responseData);

return false;

}

}

else

{

responseData = ResponseData.forbidden();

responseMessage(response, response.getWriter(), responseData);

return false;

}

}

//请求不通过,返回错误信息给客户端

private void responseMessage(HttpServletResponse response, PrintWriter out, ResponseData responseData) {

responseData = ResponseData.forbidden();

response.setContentType("application/json; charset=utf-8");

String json = JSONObject.toJSONString(responseData);

out.print(json);

out.flush();

out.close();

}

}

6.注意点:用@ResponseBody返回json数据时,有时会有乱码,需要在springmvc的配置文件里面加以下配置(spring4以上)

7.最后分享一个类,用于返回给客户端的万能类,我觉得它可以满足一般的接口

import java.util.HashMap;

import java.util.Map;

public class ResponseData {

private final String message;

private final int code;

private final Map data = new HashMap();

public String getMessage() {

return message;

}

public int getCode() {

return code;

}

public Map getData() {

return data;

}

public ResponseData putDataValue(String key, Object value) {

data.put(key, value);

return this;

}

private ResponseData(int code, String message) {

this.code = code;

this.message = message;

}

public static ResponseData ok() {

return new ResponseData(200, "Ok");

}

public static ResponseData notFound() {

return new ResponseData(404, "Not Found");

}

public static ResponseData badRequest() {

return new ResponseData(400, "Bad Request");

}

public static ResponseData forbidden() {

return new ResponseData(403, "Forbidden");

}

public static ResponseData unauthorized() {

return new ResponseData(401, "unauthorized");

}

public static ResponseData serverInternalError() {

return new ResponseData(500, "Server Internal Error");

}

public static ResponseData customerError() {

return new ResponseData(1001, "customer Error");

}

}

解决:使用ajax验证登录信息返回前端页面时,当前整个页面刷新。

源代码如下: function loginform(){ $.ajax({ url:"loginValidate.do", type:'post', data:{"nam ...

golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息

golang学习笔记10 beego api 用jwt验证auth2 token 获取解码信息 Json web token (JWT), 是为了在网络应用环境间传递声明而执行的一种基于JSON的开放 ...

Python 解密JWT验证苹果登录

验证苹果登录,官方提供两种验证方法,一种是token,另一个种是code.这里使用的是token 登录流程: 苹果客户端调用苹果API,获取到用户的信息,包括: user_id 昵称 identity ...

spring boot&colon;spring security整合jwt实现登录和权限验证&lpar;spring boot 2&period;3&period;3&rpar;

一,为什么使用jwt? 1,什么是jwt? Json Web Token, 它是JSON风格的轻量级的授权和身份认证规范, 可以实现无状态.分布式的Web应用授权 2,jwt的官网: https:// ...

Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven)

Spring 笔记 -06- 从 MySQL 建库到 登录验证数据库信息(maven) 本篇和 Spring 没有什么关系,只是学习 Spring,必备一些知识,所以放在这里了. 本篇内容: (1)M ...

spring集成jwt验证方式,token验证

为什么要告别session?有这样一个场景,系统的数据量达到千万级,需要几台服务器部署,当一个用户在其中一台服务器登录后,用session保存其登录信息,其他服务器怎么知道该用户登录了?(单点登录), ...

webapi中使用token验证(JWT验证)

本文介绍如何在webapi中使用JWT验证 准备 安装JWT安装包 System.IdentityModel.Tokens.Jwt 你的前端api登录请求的方法,参考 axios.get(" ...

django--通过jwt获取用户信息的两种方式

HTTP请求是无状态的,我们通常会使用cookie或session对其进行状态保持,cookie存储在客户端,容易被用户误删,安全性不高,session存储在服务端,在服务器集群情况下需要解决sess ...

随机推荐

&lbrack;Android Pro&rsqb; AES加密

reference to :http://blog.csdn.net/wfung_kwok/article/details/7766427 package com.secufity.aes; impo ...

UITableViewCell重用的问题

UITableView中有两种重用Cell的方法: - (id)dequeueReusableCellWithIdentifier:(NSString *)identifier; - (id)dequ ...

关于yum与源码安装的LAMP或LNMP网页直接显示空白页的问题?

学习LAMP.LNMP时,遇到很奇怪的问题就是:搭建完LAMP或LNMP环境后安装PHPweb程序时,Discuz和Wordpress打不开安装向导,直接显示空白页(PHPWind9.0除外),没有任 ...

Qt入门学习——Qt 5 帮助文档的使用

Qt入门学习——Qt 5 帮助文档的使用 学习图形界面开发,肯定离不开帮助文档的使用,因为它不像 C 语言那样就那么几个函数接口,图形接口的接口可以用海量来形容,常用的我们可能能记住,其它的真的没有必 ...

2D-2D&colon;对极几何 基础矩阵F 本质矩阵E 单应矩阵H

对极约束 \[ \boldsymbol{x}_{2}^{T} \boldsymbol{F} \boldsymbol{x}_{1}=\boldsymbol{0} \quad \hat{\boldsymb ...

Android:进程优先级

进程优先级 优先级 服务 说明 高优先级 前台进程 ①该进程包含正在与用户进行交互的界面组件,比如一个Activity. ②进程服务被Activity调用,而且这个Activity正在与用户进行交互 ...

zabbix监控短信息接口是否正常

1.创建Web scenarios 2.创建zabbix触发器name:short_message send status is not 100 Expression:{u04zbx01.yaya.c ...

mysql sleep进程 过多

如果你没有修改过MySQL的配置,缺省情况下,wait_timeout的初始值是28800. wait_timeout过大有弊端,其体现就是MySQL里大量的SLEEP进程无法及时释放,拖累系统性能, ...

【dijkstra】【次短路】【fread】hdu6181 Two Paths

题意:给你一张简单无向图,问你1到n的次短路.注意,可以不是简单路径. 存个次短路板子,原理还是挺简单,直接看代码吧.然后这份代码还是个fread的示例用法. #include

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/528749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

获取朋友圈照片_朋友圈可以发 30 秒视频啦!用微视这个新功能就能办到

对于许多热爱分享生活中所见所闻的朋友来说&#xff0c;在发朋友圈时可能都会有这样的感觉&#xff1a;只能分享 15 秒以内的视频&#xff0c;完全不够用啊。如果你也有同样的困扰&#xff0c;今天&#xff0c;A 君就给你介绍一个实用新功能&#xff0c;让你能够在朋友圈中尽情…

苹果手机更改照片大小kb_苹果手机照片视频删除了怎样恢复?专业人士建议你这样做...

照片视频记录我们的点点滴滴&#xff0c;成长中的酸甜苦辣。当我们手机相册中的照片视频误删了我们该怎么做呢&#xff1f;如何才能挽回我们的损失&#xff1f;来看看专家让你怎么做。方法一&#xff1a;【最近删除】苹果自带有一个照片回收站【最近删除】恢复功能可以恢复里面…

复制过去格式不一样_不一样的立春节气:一个新的轮回开启,万物更新,疫情终将过去...

今天是立春&#xff0c;二十四节气中第一个节气&#xff0c;也是一个充满希望的节气。我国自古是农业大国&#xff0c;春种秋收&#xff0c;二十四节气是我国劳动人民独创的&#xff0c;也是先辈们了解自然的智慧结晶。它反映了季节的变化&#xff0c;影响着千家万户的衣食住行…

字符去多余空格_【Excel技巧】批量去空格删换行,用这两个函数简单又快速

今天分享两个函数TRIM函数和CLEAN函数。估计有些人还没见过这两个函数吧&#xff0c;不知道它们是用来干嘛的。跟你说啊&#xff0c;这两个函数都是用来清理、规范数据的。别不信&#xff0c;现在我们一起来看看他们的用法。一、TRIM函数比如&#xff0c;从网页上复制一份数据粘…

逗号后面统一加空格_用99个空格来提取Excel单元格数据,真的是脑洞大开!!!...

回复[目录]学习113篇Excel教程全套Excel视频教程&#xff0c;微信扫码观看需要从规格型号中提取容值、封装、耐压三组数据&#xff0c;如下&#xff1a; 数据源在A列&#xff0c;数据量很大&#xff0c;需要提取的容值、封装和耐压三项数据在单元格中的字节位置不固定。能找到的…

微服务 注册中心_4.微服务架构的第二个组件:注册中心

在微服务架构下&#xff0c;主要有三种角色&#xff1a;服务提供者(RPC Server)服务消费者(RPC Client)服务注册中心(Registry)RPC Server&#xff1a;服务提供者&#xff0c;启动时根据服务发布文件server.xml中的配置信息向Registry注册自身服务&#xff0c;并定期向Registry…

2018怎么打开2019_2019 年,我还是没有摆脱 Micro USB

时间回到 2017 年春&#xff0c;那时候的我想买一块移动硬盘。当时乐视的超级手机已经发布一年多了&#xff0c;苹果也在前一年发布了新款 MacBook Pro&#xff0c;USB Type-C 这个新鲜的接口已经进入大众的视野。移动硬盘常用的 Micro USB 3.0 接口的质量良莠不齐&#xff0c;…

中添加复选框_Word/excel中在方框中打钩/叉的符号,简单方便快捷

方法1&#xff1a;插入特殊符号将光标定位于需要打钩的地方&#xff0c;选择【插入】——【符号】——【其他符号】——更改字体为【Windings2】方法2&#xff1a;使用快捷键从上面的截图中可以看到设置快捷键&#xff0c;所以在插入特殊符号的时候就可以输入数字2611后按住【A…

2 数据源配置_如何在程序运行中动态切换数据源?架构师必读秘笈

说起动态数据源&#xff0c;大家应该也不陌生。例如在读写分离系统中&#xff0c;则要对请求中的读写操作进行分离&#xff0c;让读和写落在不同的数据库上&#xff1b;例如在多租户系统中&#xff0c;则要根据请求来源租户的不同&#xff0c;让其落在不同租户的数据库上&#…

数字滚动_告别单调!让PPT数字滚动起来。

大家好&#xff0c;我是三石。在PPT的制作过程中&#xff0c;数字是不可缺少的元素。如何设计制作&#xff0c;才能使简单的数字变得有活力。废话不多说看效果~其实制作方式很简单&#xff0c;跟着我的步骤你也能做出来。制作步骤&#xff1a;1、首先要制作出数字条可以通过Exc…

mysql字段是否存在_mysql判断列是否存在

本篇文章将通过存储过程来判断列(字段)是否存在。请看详情。推荐课程&#xff1a;MySQL教程。判断字段是否存在&#xff1a;DROP PROCEDURE IF EXISTS schema_change;DELIMITER //CREATE PROCEDURE schema_change() BEGINDECLARE CurrentDatabase VARCHAR(100);SELECT DATABASE…

ubuntu apache2 mysql_折腾 Ubuntu 系统续之安装PHP、Apache2和Mysql

一个狗血的开始接上回的折腾&#xff0c;话说昨天晚上狗屎运来临&#xff0c;在重装了一次的 Ubuntu 系统上&#xff0c;居然顺利的安装了 QQ、PHP7、Apache2、phpMyAdmin、chrome stable、Sublime Text3 并注册成功、git&#xff0c;还有其他桌面美化的东西&#xff0c;如 Doc…

fscanf不读取_思考了一天,终于把matlab的fscanf中的sizeA搞清楚了

数值如12345等可以作为字符&#xff0c;所以以字符格式读取文件时&#xff0c;这些数字照样可以被读取 A fscanf(fileID,formatSpec) A fscanf(fileID,formatSpec,sizeA) 以上是fscanf的语法&#xff1b; sizeA起到的作用是限制&#xff0c;限制读取读取文件中数据的数量&…

linux开发板 pc 通讯_从51单片机到Linux 开发板运行hello world(教程4)

大家好&#xff0c;我是兔子。是一个嵌入式软硬件工程师。正在从单片机开发转岗Linux开发。这次教大家如何在Linux开发板上运行可执行文件。简单起见&#xff0c;不涉及到硬件。直接和教程2一样&#xff0c;能在PC虚拟机上运行hello world程序。当然开发板上也可以。1.Source I…

python decimal 转 float_python教程之二python数学运算

存储数据变量#两个变量交换值&#xff0c;通过第三个参数实现print(两个变量交换值&#xff0c;通过第三个参数实现); #第一种方法是通过第三个参数实现x5;#变量赋值y11; #变量赋值print(交换前,x,y);tempx;xy;ytemp;print(交换后,x,y);#两个变量交换值&#xff0c;更便捷的方法…

mysql 主从 sql线程no_Mysql 主从同步 slave_sql_running 为no

背景之前搭建了主从&#xff0c;但没有设置读写分离&#xff0c;从库也能写数据。于是想测试下在从库写数据会导致同步怎么样。 结果发现&#xff0c;slave_sql_running为no&#xff0c;slava_IO_running仍然为yes.原因由于从库写数据&#xff0c;导致主从数据不一致&#xff0…

header python 环境信息_【关于header信息的构造】Python模拟登录出现乱码

使用Python模拟登录Z-Blog系统的后台时&#xff0c;如果构造的header信息如下&#xff0c;那么得到的结果将会乱码&#xff0c;如下图所示对应的错误的header信息如下&#xff1a;url "http://192.168.1.11/cmd.asp?actverify"request urllib2.Request(url)reques…

禁用win10触摸屏手势_Win10平板边缘滑动手势大全及开启/关闭方法

Win10对于平板/触屏设备进行了特别优化&#xff0c;这体现在显示和操作等方面。对于操作方面&#xff0c;Windows10平板除了支持传统操作方法外&#xff0c;还有专门的边缘滑动手势。这些操作有别于之前的Win8/Win8.1&#xff0c;Win10边缘滑动操作共有以下四种形式&#xff1a…

java的容器类有哪些实现方式_Java基础--容器类

面试官&#xff1a;Java的容器类你有什么了解吗&#xff1f;-&#xff1a;额&#xff0c;没有用过....面试官&#xff1a;你肯定用过&#xff0c;但你没有注意过....-&#xff1a;应该是吧....你知道什么是容器类吗&#xff1f;Java容器可以说是增强程序员编程能力的基本工具&a…

java集合系列_Java集合系列01-Java集合概述

1.Java集合基本概念在编程中&#xff0c;常常需要集中存放多个数据。从传统意义上讲&#xff0c;数组是我们的一个很好的选择&#xff0c;前提是我们事先已经明确知道我们将要保存的对象的数量&#xff0c;因为数组长度在初始化时指定&#xff0c;意味着只能保存定长的数据。一…