java防止重复操作
2023-01-10阅读(200)
问:java里边防止重复提交的token机制不太会搞,使用token需要什么工具吗?急等
- 答:1.在Struts中,如何实现防止表单的重复提交操作?
Struts的Token(令牌)机制能够很好的解决表单重复提交的问题,
基本原理是:
1) 服务器端在处理请求到达之前,会将 请求 中包含的令牌值与保存在当前 用户会话 中的令牌值进行比较,看是否匹配。
2) 在处理完该请求后,且在答复客户端之前,会产生一个新的令牌值,该令牌值除传给客户端以外,也会将 用户会话 中保存的旧的令牌值进行替换。
3) 这样如果用户回退到刚才的提交页面并再次提交的话,客户端传过来的令牌值就和服务器端的令牌值不一致,从而有效地防止了重复提交的发生。
2.Struts使用Token机制,来防止恶意的破坏和重复提交问题,也就是点击后退后在再提交,这是Struts无法发现的
3.在form中生成一个token码,在session中也保存有一个同样的token码,
当表单提交后,判断两个token码相等后,就会改变session中的这个token码,
当然在用回退后,form的token码是不会变的,在提交,还会判断两个token码是否相等,如果不等就会抛出异常,证明这是过时的垃圾数据。
作用:Token机制可以解决表单的重复提交;
产生token的两种方式:
<1>. form表单的post请求,使用隐藏域<input type="hidden" name="token" value="${token}">;
<2>. 直接使用超级链接<html:link action="" trasantion="true">,可以直接在链接后面添加token值。
问:JAVA 如何防止同时操作一个文件?
- 答:我们通过essFile这个随机读取流来操作文件速度上面会有一点慢、但不是极其大的文件一般可以忽略。
我们通过FileChannel对象来获得锁
Trylock
与lock方法
tryLock()是非阻塞式的,它设法获取锁,但如果不能获得,例如因为其他一些进程已经持有相同的锁,而且不共享时,它将直接从方法调用返回。
lock()是阻塞式的,它要阻塞进程直到锁可以获得,或调用lock()的线程中断,或调用lock()的通道关闭。
对独占锁和共享锁的支持必须由底层的操作系统提供。锁的类型可以通过FileLock.isShared()进行查询。另外,我们不能获取缓冲器上的锁,只能是通道上的。
File file=new File("D:/test.txt");
//给该文件加锁
essFile fis = new essFile(file, "rw");
FileChannel fcin=fis.getChannel();
FileLock flin=null;
while(true){
try {
flin = fcin.tryLock();
break;
} catch (Exception e) {
System.out.println("有其他线程正在操作该文件,当前线程休眠1000毫秒");
sleep(1000);
}
} - 答:服务端用一个Map<File,String>来记录用户操作的文件。。
当一个用户请求操作file1文件的时候,就用:
if(map.push(file,user1)) System.out.println("ess");
根据能否push到map里面,来表示该文件是否正在被使用。。
如果一个用户操作完该文件,调用map.remove(file1)即可 - 答:windows 会自动控制。linux系统,你就用同步方法吧,把对文件的操作写到同步方法里面。
问:多服务器java毫秒内的重复请求怎么处理?
- 答:你好,很高兴回答你的问题。
这种问题,有相对成熟的机制来解决。这种机制叫分布式锁。
其实和单机部署时的同步锁类似,单机部署是一个线程获取到锁之后,另一个线程因为获取不到锁就不能和上一个线程同时执行。
分布式锁道理类似,这个锁一般会由一个独立于部署的多个服务实例之外的系统来解决。比如redis,redis有个方法是setNx(key)这个方法是原子性的,如果redis中不存在key对应的数据,则会存入,相当于获取到锁,如果redis中已经存在key对应的数据,说明锁已经被占用,就会返回false。
放服务实例处理完这个业务功能后可以删除掉redis中的数据,相当于适当锁。
为了防止因意外情况导致不会执行释放锁的操作,可以给存入redis的数据设置一个过期时间,如果时间到了,数据还没有被删除,redis会自行删除这条数据。
如果有帮助到你,请点击采纳。 - 答:加套缓存机制,利用redis自带的锁,将处理的请求带一个key,如果redis里面有key,则不处理,没有则入库,缓存的有效期限根据需求自行设置。