变量会话从一页传递到另一页coldFusion

变量会话从一页传递到另一页coldFusion,coldfusion,Coldfusion,Login.cfm Application.cfm 当我想使用登录时,包括页面的一部分 <cfif not isDefined('FORM.submitButton')> <cfform name="loginForm" method="post" action="#CGI.SCRIPT_NAME#"> Login: <cfinput type="text" name="login" required="yes"&

Login.cfm

Application.cfm
当我想使用登录时,包括页面的一部分

    <cfif not isDefined('FORM.submitButton')>
    <cfform name="loginForm" method="post" action="#CGI.SCRIPT_NAME#">
        Login: 
        <cfinput type="text" name="login" required="yes">
        Password: 
        <cfinput type="password" name="password" required="yes">
        <br>
        <cfinput type="submit" name='submitButton' value="Sign">
        <br>
        <cfinput type="button" name='registerButton' value="Register">
    </cfform>
<cfelse>
    <cfquery name='getUser' datasource="dbfortest">
        SELECT * FROM usertable WHERE login="#FORM.login#" ;
    </cfquery>
    <cfif getUser.RecordCount NEQ 0>

        <cfif FORM.password eq getUser.password>
            <cflock scope="Session" timeout="60" type="exclusive" >
            <cfset Session.loggedIn = "yes">
            <cfset Session.user = "#FORM.login#">
            </cflock>
        <cfoutput>#StructKeyList(Session)#</cfoutput>
        <cfelse>
            Your pass isn't correct.
        </cfif>
    <cfelse>
        There is no user with this name.
    </cfif>
</cfif>
大家好,请帮助我了解这些会话的行为。 整个问题在于试图将变量从一个页面传递到另一个页面。 因此,登录后,我在会话结构中看不到session.user。 我怎么能通过这个? 已经尝试了不同的浏览器

为了弄清楚会话变量发生了什么,请尝试在cfset会话语句之后插入一些调试代码,以确保它们正在发生。大概 您不需要CFMX锁定会话范围,也不需要自CFMX以来锁定会话范围。见亚当·卡梅伦2013年的文章 如果调试代码运行时看到了会话变量,但它们在下一页中消失了,这可能是会话存储的问题,会话存储是cfadmin或其他任何前端Web服务器的不同部分。在Application.cfc中尝试onRequestStart,并确保每个请求上的JSESSIONID都相同。或者尝试在CFADMIN中禁用J2EE会话变量,并查看CFID/CFTOKEN是否仍然存在相同的问题。 如果调试代码没有运行,那么您应该看到一种错误情况。 为了便于阅读,在引用作用域时,要保持大小写一致,例如session而不是session。虽然这类事情在功能上可能并不重要,但在引用路径或组件时,它可能会让您在可移植性方面遇到麻烦。 其他一些问题:

如果要对loggedIn使用布尔值,则使用布尔值:true或false或1或0,或者如果必须是或否,但不能是是字符串;如果您必须执行if session.loggedIn==“是”,那么就不能执行if session.loggedIn,没有人会高兴。
如果这是为了工作,生产站点代码,至少需要使用cfqueryparam,因为您永远不希望将未经扫描的用户输入直接传递到数据库查询。 您还可以访问CFML.slack.com上的CFML slack,向CFML初学者询问一些关于编写登录表单的提示。
@阿奎坦给了你一些好消息。我只是想指出,你的问题的另一部分可能是你为你的治疗设定了10秒的生命周期。这可能还不够长

在您发布的Application.cfm示例中,您有以下行:

<cfif Session.loggedIn eq "no">
    <cfinclude template="login.cfm">
</cfif>
<cfif structKeyExists(session, "user")>
    <cfoutput>Welcome, #Session.user#.</cfoutput>
</cfif>
<cfoutput>#StructKeyList(Session)#</cfoutput> 
CreateTimeSpan函数的参数如下所示:

sessiontimeout="#createTimespan(0,0,0,10)#"

因此,您为会话分配了10秒的生命周期。也许您想设置10分钟而不是10秒。

如果这是为了工作,生产站点代码至少需要使用cfqueryparam,因为您永远不想将未经扫描的用户输入直接传递到数据库查询。谢谢你的回答,我试试看。而且ofc也不是完全没有保护的生产站点代码。这是我再次学习CF.Thx的方法,它让我了解了正在发生的事情。所以现在一切都正常了,除了登录后我只有在刷新页面后才有一个session.user变量。也许smb可以提供更正建议?虽然这会增加学习曲线,但我建议您尽早开始使用MVC框架。再也没有人这样写CF代码了,即使是在教室里,这会让你养成一些坏习惯。看看Ortus的Coldbox吧——它是免费的,在box产品的Slack频道上有帮助,虽然一开始会让人感到更气馁,但你会跳过整个CF职业生涯,否则你会花在编写程序汤上。将处理程序与视图分离,并在正确的位置控制作用域(如会话),这样做会更容易。Thx,它只是尝试更改行为,所以我刚刚尝试过它=我了解时间值^_^
sessiontimeout="#createTimespan(0,0,0,10)#"
createTimespan(days, hours, minutes, seconds)