JAVA——token理解
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理解相关推荐
- java token生成和验证_Java Token登录验证 生成解析Token
借鉴参考 Java Token登录验证 使用jjwt生成和解析JWT java基于token验证之登陆验证 等 什么是Token? 我的理解来说 token就是你访问服务器的口令,只要token合法, ...
- 从Java代码到Java堆理解和优化您的应用程序的内存使用
从Java代码到Java堆理解和优化您的应用程序的内存使用 简介: 本文将为您提供 Java? 代码内存使用情况的深入见解,包括将 int 值置入一个Integer 对象的内存开销.对象委托的成本和不 ...
- JVM面试1 :谈谈你对Java的理解
谈谈你对Java的理解 如何查看字节码? 使用 javap
- Java——深入理解Java异常体系
Java--深入理解Java异常体系 参考文章: (1)Java--深入理解Java异常体系 (2)https://www.cnblogs.com/wugongzi/p/11858228.html 备 ...
- 谈谈你对Java的理解
谈谈你对Java的理解 这个考察的很宽泛,答案不是唯一的,往往考察多个方面,其实这个问题考察的是你是否真的掌握了Java,对基础知识点的理解是否真的很清楚.是否掌握主要的模块和运行 原理等,同时也会对 ...
- 谈谈你对java的理解,java是“解释执行”这句话对吗?
谈谈你对java的理解,java是"解释执行"这句话对吗? 先科普下什么是"解释执行"? 什么是"编译执行"? • 解释执行 解释执行时高级 ...
- Java 深入理解深拷贝和浅拷贝区别
title: Java 深入理解深拷贝和浅拷贝区别 date: 2021-6-19 updated: 2021-6-19 tags: Java 深拷贝和浅拷贝 categories: 面试 Java ...
- java token使用方式_使用 Java 和 web3j 进行 Token 开发[概述][译]
学习使用 web3j 部署ERC20 以及与合约进行交互. > 题外话, 翻译这篇文章是因为看到 CSDN 公众号这篇[外行翻译](https://mp.weixin.qq.com/s/Xu6c ...
- java token认证机制,OAuth认证协议原理分析及使用方法
twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到twitter登录,之后转回原网络 twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转 ...
最新文章
- LA4636积木艺术
- Vysor_v1.6.9
- linux启动报错+centos关闭和开启ipv6
- 基于stm32、0.96寸OLED实现的俄罗斯方块小游戏(详细源码注释)
- llinux mysql_linux下安装mysql
- Android自定义GridView显示一行,并且可以左右滑动
- java 邮件内嵌图片_(二)JavaMail创建包含内嵌图片的邮件
- c语言 画图软件哪个好,电脑画图软件推荐
- Php freeradius 认证,FreeRADIUS 配置认证记录入数据库
- AJRW错误AA707
- 分享这些年来第三方支付业务的申请流程及详细方案
- 2014腾讯实习生招聘武汉试题
- 2021-07-29 vue事件冒泡和事件捕获,阻止冒泡和阻止浏览器默认行为
- crunch 不指定字典破解wpa加密
- 鹿晗关晓彤公布恋情阿里云服务器救场 这位微博程序员新婚还加班
- 用C语言计算BMI值
- 图像插值算法:最近邻插值、双线性插值
- JetBrains PyCharm JetBrains PyCharm 2018.1.3 x64永久破解
- 内容算法:新闻“标题党”检测方法综述
- 计算机组成原理 — 后四章