onRequestStart用户授权无法正常工作coldfusion

onRequestStart用户授权无法正常工作coldfusion,coldfusion,coldfusion-10,Coldfusion,Coldfusion 10,Im my Application.cfc我正在尝试使用onRequestStart()函数来保护我的页面: <cffunction name="onRequestStart" access="public" returntype="boolean"> <cfargument type="String" name="TargetPage" required="true"/> <!--- Define which pages don't need prote

Im my Application.cfc我正在尝试使用
onRequestStart()
函数来保护我的页面:

<cffunction name="onRequestStart" access="public" returntype="boolean">
  <cfargument type="String" name="TargetPage" required="true"/>

  <!--- Define which pages don't need protection --->
  <cfset APPLICATION.AllowedPages = "/index.cfm, /register.cfm">

  <!--- Create an instance of the page-protect.cfc --->
  <cfset APPLICATION.PageProtect = CreateObject("component", "page-protect")>

  <!--- check if the current page is an allowed page --->
  <cfif #ListFindNoCase(APPLICATION.AllowedPages, ARGUMENTS.TargetPage)# EQ 0>
  <!--- if its not an allowed page, then protect it --->
  <cfscript>
  APPLICATION.PageProtect.PageProtectBasic(argumentcollection = session); 
  </cfscript>
  </cfif>

<cfreturn true>
</cffunction>

APPLICATION.PageProtect.PageProtectBasic(argumentcollection=session);
这段代码可以正常工作(稍后您将看到)。Page-protect.cfc非常简单,它可以:

<cfcomponent displayname="page-protect" output="false">
<cffunction name="PageProtectBasic" output="no">
  <cfif NOT structKeyExists (SESSION, 'Auth')>
    <cflocation url="/index.cfm" addtoken="no">
  </cfif>
</cffunction>
</cfcomponent>

因此,如果
SESSION
范围内的
Auth
结构不存在,则该用户未登录,应将其带回主页。另一个文件中的注销方法从会话中删除Auth结构,并清除会话范围(如果确实如此,我已经测试过)

onRequestStart()
页面保护最初起作用,但我注意到,当我按下浏览器上的后退按钮时,它将显示我刚刚注销的上一页。这应该是一个受保护的页面,不显示,但我想这是一个浏览器缓存,所以不是一个问题。但问题是,如果我单击此页面中的链接,它将不允许该链接并将用户发送回主页(因为SESSION.Auth结构不存在,并且SESSION已被清除)。但是它不再将用户发送回主页,它只显示一个ColdFusion错误页面,指出“元素AUTH.{Element_name}在会话中未定义”


因此,出于某种原因,它不会返回主页,尽管用户未登录,而是尝试加载受保护的页面,然后由于SESSION.AUTH结构中不存在变量而崩溃。我只是不明白我做错了什么。请帮忙

对不起,这不适合放在评论框中

我想你想做的是这样的:

onApplicationStart()  {

    APPLICATION.PageProtect = CreateObject("component", "page-protect")>
    }


onSessionStart()  {

   session.auth = false; // it is easier to work with if it always exists
   }


onRequestStart()  {


   if (ListFindNoCase(APPLICATION.AllowedPages, ARGUMENTS.TargetPage) EQ 0)
        // if its not an allowed page, then protect it 
        APPLICATION.PageProtect.PageProtectBasic(argumentcollection = session); 
        }


   }

可能与您的问题无关,但这一行可能有几个问题

  <cfset APPLICATION.AllowedPages = "/index.cfm, /register.cfm">

第1期是主要的斜杠。除非arguments.TargetPage有这些斜杠,而且它们可能有,否则您将无法获得预期的行为


第2期是两个列表项之间的空格。前导空格是列表项的一部分,可能会导致register.cfm上出现意外行为。

而James Mohler提供了一些非常有用的指针,说明如何改进代码。一般来说,您遇到的问题与此无关

用户在回击时可以看到这些页面的原因是它们被缓存在浏览器中。这是一个试图提供帮助的浏览器,而不是从它已经看到的服务器请求数据。不过,作为一名优秀的互联网公民,浏览器会按照要求去做。因此,您需要返回正确的HTTP头,告诉它您不希望它缓存它们。例如

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
所以要在CF中执行此操作

<cfheader name="Cache-Control" value="no-cache, no-store, max-age=0, must-revalidate">
<cfheader name="Pragma" value="no-cache">

如果您将上述内容添加到与您相关的页面中,问题就会消失


西蒙

我本来打算对每个页面请求都设置APPLICATION.pageProtect进行评论,但詹姆斯在回答中修复了这个问题。再一次……你正在重新发明轮子。如果你用一个框架开始这个项目,我猜你会在这个过程中走得更远。这是因为我认为你不使用框架浪费了大量的时间,结果你会产生sh!t代码。CFML社区有过多的sh!t程序员和我(以及我们中的一些人)正在努力扭转这一局面。像你这样的开发者给我们的社区带来了坏名声。这就是为什么我个人这么认为。顺便说一句,FW/1文档第一页的一半介绍了如何进行SEO友好URL:。虽然为什么这应该是一个原型的考虑,我不知道。如果您使用了一个框架(这需要阅读一些文档,而不是漫不经心地走下去),那么您现在已经完成了原型。使用框架开发原型要比不使用框架快得多。你的“sh!t技能”已经在社区中传播。通过堆栈溢出中的这些问题。通过验证您的逻辑是否按预期工作,您做了哪些工作(很明显,它不工作)。你发布的所有内容似乎都是基于你的期望,而不是实际检查。例如:你不是说“奇怪的是
会话。没有设置auth
,但我在前一行设置了它”,而是说“它只是不工作,我不知道为什么”。你把哪些变量甩出去了,又甩到哪里去了?您做了哪些日志记录来测试您的逻辑?在这个过程的关键位置,您的逻辑结果是什么?如果John Resig想要创建一个新的跨平台JavaScript库:不,ppl不会有问题;如果新手McKnowner做了?是的,每个人都会说“FFS,只需使用JQuery”。您应该通过使用该框架进行学习,并了解其工作原理。你在这里学到的只是如何不做事(尽管我怀疑你在这里是否真的学到了很多)。这些都是有效的人生课程,但并不是一种有效的学习方式,因为你对有用知识和理解的储备将以有效的速度增加。谢谢詹姆斯。我将CreateObject放在onRequestStart方法中,因为我正在开发中,无法在每次进行更改时清除应用程序范围。稍后,我当然会把它移到OnApplication StaskJavaJoice上,当您想引用注释中的一些代码时,应该考虑使用GIST(),但是它不适合(或格式很好)。在您的onRequestStart()方法中,在适当的时候运行onApplicationStart()方法。我认为James通过发布代码作为答案做了正确的事情。像我这样懒惰的人更喜欢一站式购物。谢谢你的提示。Arguments.TargetPage中有斜杠,因此其工作正常。我现在删除了空格,所以应该可以走了。非常感谢。我们经常这样做,以至于我们创建了一个自定义标记,