跳转到内容

WebObjects/Web 应用程序/开发/回溯

来自维基教科书,开放的书籍,开放的世界

当使用 WebObjects 的组件操作时,为了能够跨请求保留状态,服务器必须维护一个先前访问页面的缓存。 此页面缓存的大小有限。 因此,如果用户多次按下后退按钮,以至于耗尽此缓存,将导致“用户回溯太远”错误。

使用直接操作进行预防

[编辑 | 编辑源代码]

因为直接操作不需要像组件操作那样的页面状态,所以避免回溯问题的最佳方法是在应用程序中使用 编程:WebObjects/Web 应用程序/开发/直接操作

旧会话和回溯

[编辑 | 编辑源代码]

如何最简单地阻止用户回溯(使用浏览器后退按钮)到先前由已注销的另一个用户使用的页面?

为了防止用户在使用后退按钮时访问他人的会话,您应该在注销操作中调用 session().terminate()。 为了使其正常工作,您必须在调用 terminate() 后重定向到没有会话的页面,因为如果您使用 pageWithName() 返回另一个页面,该页面将引用您刚刚终止的会话,并且它将无法工作。 我的注销操作看起来像这样

 public WOComponent logout() {
   WORedirect redirect = (WORedirect)pageWithName("WORedirect";);
   redirect.setUrl("/cgi-bin/WebObjects/MyApp";); // entry point
   session().terminate();
   return redirect;
 }

如果有人使用后退按钮,这将阻止会话工作,但它不会阻止他们查看页面上的内容。 如果敏感内容是问题所在,那么最好的办法是在用户注销时关闭窗口。 这将假设当他们登录时,您为要运行的应用程序的敏感部分打开了窗口。 这样,当您使用 javascript 关闭它时,您不会触发用户可以拦截的警告消息。 对于您打开的窗口,您可以像上面一样重定向到一个看起来像这样的 html 页面

  <HTML>
  <HEAD>
    <TITLE>Closing Window...</TITLE>
  </HEAD>
  <BODY onLoad="window.close()">
  </BODY>
  </HTML>

然后就不会有可以返回的页面了。

华夏公益教科书