Token(令牌)机制
防止因为后退或者刷新来重复提交表单内容的Token机制

Token,就是Token(令牌)机制,最大的特点就是随机性,不可预测。一般黑客或软件无法猜测出来。

实现原理:一致性。

jsp生成表单时,在表单中插入一个隐藏字段,该字段就是保存在页面端的token字符串,同时把该字符串存入session中。等到用户提交表单时,会一并提交该隐藏的token字符串。在服务器端,查看下是否在session中含有与该token字符串相等的字符串。如果有,那么表明是第一次提交该表单,然后删除存放于session端的token字符串,再做正常业务逻辑流程;如果没有,那么表示该表单被重复提交,做非正常流程处理,可以警告提示也可以什么也不做。

那么,Token有什么作用?又是什么原理呢?

Token一般用在两个地方:

1)防止表单重复提交、
2)anti csrf攻击(跨站点请求伪造)。

两者在原理上都是通过session token来实现的。当客户端请求页面时,服务器会生成一个随机数Token,并且将Token放置到session当中,然后将Token发给客户端(一般通过构造hidden表单)。下次客户端提交请求时,Token会随着表单一起提交到服务器端。

然后,如果应用于“anti csrf攻击”,则服务器端会对Token值进行验证,判断是否和session中的Token值相等,若相等,则可以证明请求有效,不是伪造的。

不过,如果应用于“防止表单重复提交”,服务器端第一次验证相同过后,会将session中的Token值更新下,若用户重复提交,第二次的验证判断将失败,因为用户提交的表单中的Token没变,但服务器端session中Token已经改变了。

上面的session应用相对安全,但也叫繁琐,同时当多页面多请求时,必须采用多Token同时生成的方法,这样占用更多资源,执行效率会降低。因此,也可用cookie存储验证信息的方法来代替session Token。比如,应对“重复提交”时,当第一次提交后便把已经提交的信息写到cookie中,当第二次提交时,由于cookie已经有提交记录,因此第二次提交会失败。
不过,cookie存储有个致命弱点,如果cookie被劫持(xss攻击很容易得到用户cookie),那么又一次gameover。黑客将直接实现csrf攻击。

所以,安全和高效相对的。具体问题具体对待吧。

此外,要避免“加token但不进行校验”的情况,在session中增加了token,但服务端没有对token进行验证,根本起不到防范的作用。

还需注意的是,对数据库有改动的增删改操作,需要加token验证,对于查询操作,一定不要加token(查询一般都是Get 提交方式吧,这样token值就暴露了。),防止攻击者通过查询操作获取token进行csrf攻击。但并不是这样攻击者就无法获得token,只是增大攻击成本而已。

查询在后台大部分是提交条件表单的。另外token是在页面加载的时候生成的随机数吗,就是说每个页面都不一致?还是整个系统用同一个随机数?如果不一致的话,在浏览器打开两个选项卡,都进入同一个页面,这时候就会有两个token,结果就是先生成token的那个页面会验证失败跳转登录页。

但是对于查询与修改,修改一般都是要查询出来的,查询出来没有得到token,修改时拿什么token提交?
我认为页面分浏览与管理,管理的就都是有token,不知对否

Token的使用流程是:首先在服务器端生成一个随机的token值并在服务器端保存起来,然后向客户端请求的过程中把这个Token值传过去。之后页面操作完毕后向服务器提交数据的过程中又把这个Token值传回服务器端,同时比较这个Token值是否已经存在于服务器端,若存在,则此次访问是安全的,并在服务器端把这个Token值删除,若不存在,则此次访问无效。

Token的使用流程是:首先在服务器端生成一个随机的token值并在服务器端保存起来,然后向客户端请求的过程中把这个Token值传过去。之后页面操作完毕后向服务器提交数据的过程中又把这个Token值传回服务器端,同时比较这个Token值是否已经存在于服务器端,若存在,则此次访问是安全的,并在服务器端把这个Token值删除,若不存在,则此次访问无效。


好,了解Token的用法之后来看代码(项目中可直接粘贴使用)

(一)首先是Token工具类

package com.company.util;
import java.util.ArrayList;
import javax.servlet.http.HttpSession;
public class Token {
private static final String TOKEN_LIST_NAME = "tokenList";
public static final String TOKEN_STRING_NAME = "token";private static ArrayList getTokenList(HttpSession session) {Object obj = session.getAttribute(TOKEN_LIST_NAME);if (obj != null) {return (ArrayList) obj;} else {ArrayList tokenList = new ArrayList();session.setAttribute(TOKEN_LIST_NAME, tokenList);return tokenList;}}private static void saveTokenString(String tokenStr, HttpSession session) {ArrayList tokenList = getTokenList(session);tokenList.add(tokenStr);session.setAttribute(TOKEN_LIST_NAME, tokenList);}private static String generateTokenString(){return new Long(System.currentTimeMillis()).toString();}/** *//*** Generate a token string, and save the string in session, then return the token string.* @param HttpSession session* @return a token string used for enforcing a single request for a particular transaction.*/public static String getTokenString(HttpSession session) {String tokenStr = generateTokenString();saveTokenString(tokenStr, session);return tokenStr;}/** *//*** check whether token string is valid. if session contains the token string, return true. * otherwise, return false.* @param String tokenStr* @param HttpSession session* @return true: session contains tokenStr; false: session is null or tokenStr is id not in session*/public static boolean isTokenStringValid(String tokenStr, HttpSession session) {boolean valid = false;if(session != null){ArrayList tokenList = getTokenList(session);if (tokenList.contains(tokenStr)) {valid = true;tokenList.remove(tokenStr);}}return valid;}
}

(二)JSP页面中

1:先import该Token工具类

<%@ page import="com.company.util.Token" %> 2:在表单中添加隐藏的Token值

<form><input type="hidden" name="<%=Token.TOKEN_STRING_NAME %>" value="<%=Token.getTokenString(session) %>">
</form>

(三)在服务器端Servlet中添加如下代码

if(Token.isTokenStringValid(request.getParameter(Token.TOKEN_STRING_NAME), request.getSession())){//To Do 业务代码
}

JAVA——token理解相关推荐

  1. java token生成和验证_Java Token登录验证 生成解析Token

    借鉴参考 Java Token登录验证 使用jjwt生成和解析JWT java基于token验证之登陆验证 等 什么是Token? 我的理解来说 token就是你访问服务器的口令,只要token合法, ...

  2. 从Java代码到Java堆理解和优化您的应用程序的内存使用

    从Java代码到Java堆理解和优化您的应用程序的内存使用 简介: 本文将为您提供 Java? 代码内存使用情况的深入见解,包括将 int 值置入一个Integer 对象的内存开销.对象委托的成本和不 ...

  3. JVM面试1 :谈谈你对Java的理解

    谈谈你对Java的理解 如何查看字节码? 使用 javap

  4. Java——深入理解Java异常体系

    Java--深入理解Java异常体系 参考文章: (1)Java--深入理解Java异常体系 (2)https://www.cnblogs.com/wugongzi/p/11858228.html 备 ...

  5. 谈谈你对Java的理解

    谈谈你对Java的理解 这个考察的很宽泛,答案不是唯一的,往往考察多个方面,其实这个问题考察的是你是否真的掌握了Java,对基础知识点的理解是否真的很清楚.是否掌握主要的模块和运行 原理等,同时也会对 ...

  6. 谈谈你对java的理解,java是“解释执行”这句话对吗?

    谈谈你对java的理解,java是"解释执行"这句话对吗? 先科普下什么是"解释执行"? 什么是"编译执行"? • 解释执行 解释执行时高级 ...

  7. Java 深入理解深拷贝和浅拷贝区别

    title: Java 深入理解深拷贝和浅拷贝区别 date: 2021-6-19 updated: 2021-6-19 tags: Java 深拷贝和浅拷贝 categories: 面试 Java ...

  8. java token使用方式_使用 Java 和 web3j 进行 Token 开发[概述][译]

    学习使用 web3j 部署ERC20 以及与合约进行交互. > 题外话, 翻译这篇文章是因为看到 CSDN 公众号这篇[外行翻译](https://mp.weixin.qq.com/s/Xu6c ...

  9. java token认证机制,OAuth认证协议原理分析及使用方法

    twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到twitter登录,之后转回原网络 twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转 ...

最新文章

  1. LA4636积木艺术
  2. Vysor_v1.6.9
  3. linux启动报错+centos关闭和开启ipv6
  4. 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)
  5. llinux mysql_linux下安装mysql
  6. Android自定义GridView显示一行,并且可以左右滑动
  7. java 邮件内嵌图片_(二)JavaMail创建包含内嵌图片的邮件
  8. c语言 画图软件哪个好,电脑画图软件推荐
  9. Php freeradius 认证,FreeRADIUS 配置认证记录入数据库
  10. AJRW错误AA707
  11. 分享这些年来第三方支付业务的申请流程及详细方案
  12. 2014腾讯实习生招聘武汉试题
  13. 2021-07-29 vue事件冒泡和事件捕获,阻止冒泡和阻止浏览器默认行为
  14. crunch 不指定字典破解wpa加密
  15. 鹿晗关晓彤公布恋情阿里云服务器救场 这位微博程序员新婚还加班
  16. 用C语言计算BMI值
  17. 图像插值算法:最近邻插值、双线性插值
  18. JetBrains PyCharm JetBrains PyCharm 2018.1.3 x64永久破解
  19. 内容算法:新闻“标题党”检测方法综述
  20. 计算机组成原理 — 后四章

热门文章

  1. igm修复所需userinit
  2. Connection:Keep-alive
  3. 微信小程序点播插件_微信小程序音乐播放器组件
  4. 计算几何之求取二维点集的凸包/ 凸多边形包围盒
  5. ZOJ2313 Chinese Girls' Amusement(大数运算,找规律)
  6. golang对mongo数据库索引的创建,删除操作
  7. fiddler 抓包详细教程
  8. hihocoder-1851-D级上司
  9. 高等数学18讲(19版)第七讲 定积分的计算例题
  10. Ubuntu死机解决办法