【问题标题】:session not working in coldfusion会话在冷融合中不起作用
【发布时间】:2013-11-14 22:55:35
【问题描述】:

我正在使用 Login.cfm 文件并使用 followign 方法登录

<cfif IsDefined("FORM.inpUserName") AND ((LCASE(TRIM(inpUserName)) IS "myusername" AND inpPassword IS "mypassword") )>
    <cfset session.username = FORM.inpUserName />
    <cfset SESSION.LoggedIn = 1>    
    <cflocation url="index.cfm" addtoken="no">

<cfelse>
    <cfset SESSION.LoggedIn = 0>
</cfif>

<cfparam default="" name="inpUserName" />
<cfparam default="" name="inpPassword" />

表格定义如下:

<cfform action="Login.cfm" method="post" and so on ...

在 cfform 中,我定义了两个 cfinput 标签,用于捕获来自用户的信息,名称属性为 name="inpUserName" 和 value="#inpUserName#"

密码字段也是如此。

当我点击登录按钮时什么都没有发生,它不应该像我在 cflocation 标记顶部提到的那样进入 index.cfm 吗?

请澄清

【问题讨论】:

  • 在您的登录页面顶部放置转储和中止,并输出您正在检查的值。
  • application.cfcapplication.cfm 中,您是否启用了会话?

标签: session coldfusion coldfusion-8


【解决方案1】:

让我们看看这个条件:

<cfif IsDefined("FORM.inpUserName") 
AND ((LCASE(TRIM(inpUserName)) IS "myusername" 
AND inpPassword IS "mypassword") )>

这是在寻找 3 件事是真实的。

  1. 必须定义form.username
  2. 变量 inpUserName,不带空格,小写必须是“myusername”
  3. 变量 inpPassword,不带空格,小写必须是“mypassword”

这意味着满足 cfif 条件的唯一方法是在提交表单时输入“myusername”和“mypassword”的值。这可能不是您编写该代码时的想法。

【讨论】:

    【解决方案2】:

    尝试清理一下,并在整个过程中统一阐明表单变量的范围:

    <cfparam name="form.inpUserName" default="" />
    <cfparam name="form.inpPassword" default="" />
    
    <cfif TRIM(form.inpUserName) IS "myusername" AND form.inpPassword IS "mypassword">
        <cflock type="exclusive" scope="session" timeout="10" >
            <cfset session.username = form.inpUserName />
            <cfset session.LoggedIn = 1 />   
        </cflock> 
        <cflocation url="index.cfm" addtoken="no" />
    
    <cfelse>
        <cflock type="exclusive" scope="session" timeout="10" >
            <cfset session.LoggedIn = false /> 
        </cflock>
    </cfif>
    
    <cfinput type="text" name="inpUserName" value="#form.inpUserName#" />
    <cfinput type="password" name="inpPassword" value="#form.inpPassword#" />
    

    如果您正在设置 cfparam 变量,则不需要 isDefined 函数。

    如果您在提交时在用户名字段中输入“myusername”并在密码字段中输入“mypassword”,它现在应该会转到index.cfm 页面,前提是它会发回给自己。

    有关锁定会话变量的更多信息:

    Should I always need to use cflock with SESSION scope variables?

    Configuring and using session variables

    【讨论】:

    • "底线是没有内在需要锁定会话范围(从 CFMX 6.0 开始),但是 - 与任何代码一样 - 应该确保不在自己的代码中创建竞争条件,并且是明智的使用锁定可以缓解这种情况。”因此为什么不需要cflock。这是无缘无故的额外开销。
    • 不幸的是,Adobe 文档通常很糟糕,并且在发布新版本时没有更新。我不会依赖它们来获得最佳实践。
    • @MattBusche 点已被占用。但是,我发现大多数人对比赛条件的了解不够,无法避免它们,甚至在看到比赛条件时也不知道。而且,真的,没有那么多开销。
    • @jk 当我使用上述代码时,出现以下错误:Context validation error for tag cflock.The end tag &lt;/cflock&gt; encountered on line 8 at column 7 requires a matching start tag. 我的代码中的第 8 行是定义 &lt;/cflock&gt; 的位置。已经定义了起始标签,这不是一个奇怪的错误吗?
    • @Jack - 这是一个小错字。行尾有一个额外的/ 会提前关闭标签:&lt;cflock ... /&gt;。即就像你写&lt;/cflock&gt;一样。只需将其删除。 (旁注,正如其他人提到的,这里可能不需要锁定 - 只需要防止竞争条件。如果您不熟悉它,我建议您阅读锁定以了解原因和含义)。
    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多