页面防刷新的思路

上传人:公**** 文档编号:431938026 上传时间:2023-12-19 格式:DOCX 页数:7 大小:21.02KB
返回 下载 相关 举报
页面防刷新的思路_第1页
第1页 / 共7页
页面防刷新的思路_第2页
第2页 / 共7页
页面防刷新的思路_第3页
第3页 / 共7页
页面防刷新的思路_第4页
第4页 / 共7页
页面防刷新的思路_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《页面防刷新的思路》由会员分享,可在线阅读,更多相关《页面防刷新的思路(7页珍藏版)》请在金锄头文库上搜索。

1、解决页面防刷新的几点思路刘盈凯(中华粮网技术部实习生)摘要:web技术发展到web2.0的过程中,B/S架构的软件系统颠覆了 C/S架构软件成为真 正的互联网应用的主流。本文从“网页防刷新”这个小处入题,结合实际开发中可能遇到的 情况进行分析和实现(本文代码实现使用java语言)。本文也试图对各种系统可能遇到的刷 新问题提出通用的方法,但是很遗憾,这个目标还很远。关键词:网页 防刷新 web 开发引言对于开发者来说保证站点运行的可靠性及安全性,是至关重要的事情,当傻傻的用户的 一个轻点刷新,就可能对于一些脆弱的系统造成很大的伤害,尤其是填写表单。填写表单是 网民经常要做的事情,客户要求让用户填

2、写表单,用户为了某种目的去填写表单,这种作为 开发者来说要处理的就是表单的防重复提交问题。用户密码丢了,他需要找回密码,我们也 不知道密码是什么,给他个连接让他重置一个,我们希望这个链接只能被访问一次。还有只 要离开页面本页就失效本文在阅读了大量解决方案的基础上做了详细的实际测试,在解决办法中,本文没有考 虑通过借助数据库来解决问题,我认为一旦借助于数据库来处理问题,这样的解决问题的办 法我是望而却步的。力求表达清楚自己对问题的看法、解决思路和测试结论。问题域一:页面展示完一次立即失效这样的问题一般出现在动态页面中,动态页中使用Cache-Control控制缓存非常实用。 是对于html静态页

3、面这种方法笔者反复使用各种方式浏览器中仍然会有缓存而且点击浏览 器后退按钮的时候总是从缓存中读取。我曾纠缠于控制静态页面缓存问题的解决办法中,也 到微软的官方寻求答案,经测试也是不可以。只能借助JavaScript脚本,笔者也提供了一种可 扩展的思路供参考。1.1、让页面在本次服务器启动过程中只能被访问一次实现方法:jsp页面中设置head:页面设置简单计数器,1.2、这里我们使用session:从服务器端跳转到只能显示一次的jsp页面,在跳转前在session中添加一个属性flag,在 跳转到页面后由页面检查session中flag属性是否存在,如果存在则显示,如果不存在则跳转 到错误页面,

4、在本页面载入后使用session.removeAttribute(“flag ”);方法移除该属性,使得本 次会话中该用户不能再次访问本页面。实现方法:控制类ShowItOnlyOncejava中方法:public void useSession()String path = request.getContextPath();String basePath =request.getScheme()+:/+request.getServerName()+:+request.getServ erPort()+path+/;HttpSession session = request.getSessi

5、on();String flag = to-open-it; session.setAttribute(flag, flag);try response.sendRedirect(basePath+useSession.jsp); catch (IOException e) e.printStackTrace();useSession.jsp中处理session时主要代码:网页中代码1.3、静态页面处理办法: 让我们来看看静态页面的处理吧,在实践的过程中我尽量的让代码柔和一些,让静态页面打开一次即失效,对于一个链接,有时候我们希望用户只能使用一次,比如找回密码的链 接,比如激活链接。此处我首先

6、来简述一下我对于静态页面的处理办法,动态页的更多处理 办法我放到后面叙述。假设用户请求找回密码,由系统分配一个随机的地址值发到用户电邮,当用户点击此链 接打开页面,用户能做的只是填写表单提交表单,如果有刷新则页面失效,如果提交表单后 点击后退按钮,提示用户页面失效。这是应用场景之一,下面简单的实现方法:系统接到请求:产生随机地址值,根据找回密码的模板页面出入用户相关参数进行静态化HtmlTools.getHtmlCode(basePath+moban.jsp?alert=hello2&url=+url)此处getHtmlCode是根据模板页面和传入参数产生静态html页面代码。url是参数,此

7、 处可以加入需要的参数。String htmlPath = ContextUtil. getAppRealPath(url+.html);HtmlTools.string2File(htmlContent, htmlPath);htmlPath使我们静态页面的地址,这个地址是根据我们随机值产生的,string2File方法将 传入的 htm 代码和路径生成 html 页。response.sendRedirect(basePath+url + .html);这个静态页面我们用来让用户使 用。这是整体的思路,具体到页面上,我们得从moban.jsp页面说起,前面我们说过让静态页面 过期使用Cac

8、he-Control是不行的,而且我们不想让用户再次打开此链接。所以我们需要在服 务器端把页面变成不可访问的,最简单的方法应该是删除它,而且是只要这个页面已经被打 开过,就立即删除服务器上的这个html页面。沿着这个思路,我做了进一步的实现,主要涉 及jsp页面中的JavaScript写的deleteHtml(url丿和服务器端的一个deleteHtml()方法。我们来看代 码:这是一个纯js写的ajax代码,省略了声明request的部分function deleteHtml(urls)var rand = Math.random();/ var phone = document.getEl

9、ementById(phone).value;var url =http:/192.168.12.92:8090/sshstudy01/test/index_deleHtml.action?dele =+urls+&rand=+rand;request.openPOST, url, true);request.onreadystatechange = sendRedirect;request.send null);function sendRedirect()if (request.readyState = 4) if (request.status = 200) if(request.res

10、ponseText=1)/ window.location.href=error.jsp; document.getElementByIdcontent).style.display=none; window.location.hreferror.jsp;elsedocument . getElementByIdcontent ) . style . display=block ;Jsp页面主要代码:%body onload=deleteHtml(); Hehe ! This page will display only once .htmla href= .html 点此看看本页面还存在不?

11、猜猜 转向 second.jsp看看后台 Struts2 控制类 ShowItOnlyOnce.java 里面的代码:public void deleHtml()String path = dele+.html; response.setCharacterEncoding(GB18030);PrintWriter out null;try out = response.getWriter(); catch (IOException e) / TODO Auto-generated catch block e.printStackTrace();String realPath = Context

12、Util.getAppRealPath(path); File f = new File(realPath);if(f.delete() out.println(0);System. out. println();elseout.println(1); System.out. println();可以看到当静态页面加载完成的时候调用 deleteHtml(url) 方法请求服务器删除文件,如果 删除成功返回值是0的话就显示id为content的div,当再次加载本页面仍然请求删除, 如果删除失败返回值为 1,此时就隐藏 div 重定向到错误页。用户看不到页面曾经加载过。事 实上页面确实是从浏览

13、器缓存加载了,否则会报 404 错误。也正是因为加载过,我们才能进行 JavaScript 的处理。问题域二:表单防刷新提交令牌机制很容易让人想到struts的令牌防刷新,为此我专门实践了 Struts2的token。也 模拟了一个类似的令牌机制出来。为了突出特点,这里让他跨域防刷新,原理是这样的,由 A服务器产生一个提交表单时用的token (保存在session中)转到表单提交页面,表单 提交时连同 token 一起提交到服务器 B 的处理程序中, 在 B 服务器下的 ShowItOnlyOncejava里面有一个静态的变量map,这个map的键是A的token值是 表单中任意字段,这个静态的 map 在本次服务器运行中是唯一的全局的变量。每一次表单 提交必须提交token值,如果与当前map中键有重复则提示重复提交,转到错误页,如果 没有重复则说明是第一次提交,转向处理页面。主要代码如下:A服务器,转向表单方法:public String tokenFormPre()HttpSession session = requ

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 建筑资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号