一种防止页面后退的实现方法(jsp)

来源:互联网 发布:电影网站源码带采集 编辑:程序博客网 时间:2024/05/01 08:07

当用户退出系统后,如果再重新打开登录后的页面,应该跳转到一个提示用户未登录的页面,这很容易做到,只要在jsp页面的头部加上验证session的代码既可以。但是由于浏览器有缓存,可以后退,如果退出系统后后退,则还是可以打开退出前的用户页面。如何禁止后退以后加载缓存的页面呢?


在网上搜到一种方法,就是设置jsp不可缓存,代码如下:

<%      response.setHeader("Pragma","No-cache");      response.setHeader("Cache-Control","no-cache");      response.setDateHeader("Expires",   0);      %>

但是这种方法,只针对ie有效。


后来我想了一个方法:因为后退之后,页面也是按照html代码顺寻加载的,比如说页面页面中有一段代码

<script>

 alert();

</script>

那面后退至该页面,也会弹出对话框。考虑到这一点,那么我想可以让页面判断是否用户已登录,如果未登录则用js跳转至提示页面。由于后退到缓存页面之后js代码还要运行一次,那么如果用户未登录,后退至该页面就会执行跳转的代码。


这时问题又来了,由于后退到达的页面是完全的html代码,不与服务器交换数据,因此如果直接嵌入jsp代码判断,那么后退到达页面中的jsp变量值实际上是上次与服务器交换数据后的缓存值,不会执行jsp代码。那么必须要求用html代码与服务器进行数据交换,也就是用js来与服务器通信,这就必须使用ajax了。


如果用dwr框架,则需要用dwr获取session,dwr获取session的方法如下:

HttpSession hs = WebContextFactory.get().getSession();


然后判断session,返回一个值。js根据这个值来判断是否需要跳转。


这时候还有一个问题,在页面中用dwr封装的函数,默认是异步操作的。当在页面中使用dwr的函数与服务器交换数据时,其他的html代码同时在进行加载。这时需要把dwr设置为同步执行,也就是调用的dwr函数后面的代码,需要等待函数进行完再进行加载。设置方法如下:

dwr.engine.setAsync(false);

该设置仅对当前页面有效,其他页面仍然是异步执行在写完调用的函数后面,再重新设置dwr为异步操作:

dwr.engine.setAsync(true);

这样函数执行完之后其他的dwr函数依然是异步执行。

0 0
原创粉丝点击