【问题标题】:Create session variable创建会话变量
【发布时间】:2019-05-04 09:53:31
【问题描述】:

我对 ColdFusion 很陌生(昨天开始)。我正在尝试在checklogin.cfm 中创建一个会话变量,它等于从表单输入的用户名。所以我可以在结果页面上显示用户名。有可能这样做吗? 或者有没有更好的方法来做到这一点?

application.cfm

<cfset this.name = "Name of your application">
<cfset this.sessionManagement = true>

check_login.cfm

<!--- If username equals user1 and password equals password1, take user to home page. ---> 
<cfif form.userName eq "user1" AND form.password eq "password1">
  <cfset session.userName = form.userName/>
  <cflocation url="home.cfm" ADDTOKEN="Yes">
  <!--- If username doesn't equal user1 and/or password doesn't 
    equal password1, take user back to login page. ---> 
<cfelse>
  <cflocation url="login.cfm" ADDTOKEN="Yes">  
</cfif>

home.cfm

<cfoutput>
    <br>
     <b><font size="6">Enter the numbers you want to add:</font></b>
</cfoutput>

<!--- Add numbers form ---> 

<cfform action="result.cfm" method="post"> 
    <!--- Get numbers from user ---> 
    <p> 
        Enter first number: 
        <cfinput type="Text" name="number1" required="Yes" size="20"
          maxlength="100" message="You must enter a number.">
        <br> 

        Enter second number: 
        <cfinput type="Text" name="number2" required="Yes" size="20"
          maxlength="100" message="You must enter a second number.">
        <br>
    </p> 

    <!--- submit button ---> 
    <cfinput type="Submit" name="submitForm" value="Submit"> 
</cfform> 

login.cfm

<cfform action="check_login.cfm" method="post"> 
    <!--- Get login info from user ---> 
    <p> 
        UserName: 
        <cfinput type="Text" name="userName" required="Yes" size="20" maxlength="25" 
          message="Username is required and must be less than 25 characters.">
        <br> 

        Password: 
        <cfinput type="password" name="password" required="Yes" size="20" maxlength="20" 
          message="Password is required and must be less than 20 characters.">
        <br>
    </p> 

    <!--- submit button ---> 
    <cfinput type="Submit" name="submitForm" value="Submit"> 
   </cfform> 

result.cfm

<cfset result = form.number1 + form.number2 >
<cfoutput>
     <b><font size="6">Hi #session.userName#! </font></b><br> 
     <br>
    <!-- Display result to user. -->
    <font size="5">Your result is: #result#</font>
</cfoutput>

问题出在结果页面上,上面写着Element USERNAME is undefined in SESSION 指向&lt;b&gt;&lt;font size="6"&gt;Hi #session.userName#! &lt;/font&gt;&lt;/b&gt;

【问题讨论】:

  • @user8968494 由于您是 CF 新手,我觉得有必要建议您避免使用 CF 元素,例如 cfform 和 cfinput,否则您的代码将永远依赖于这些元素正常工作,并且您自定义它们的能力有限。最好直接使用 html,然后根据需要编写自己的功能。
  • 我会呼应 Redtopia,我还要补充一点,每当您传递用户变量时,您都应该对它们进行一些很好的验证。 owasp.org/index.php/Injection_Prevention_Cheat_Sheet
  • 我还建议您查看 cfscript 语法而不是标签语法。特别是如果您熟悉 Javascript。
  • 您为什么要从您的问题中删除详细信息?我们需要这些来帮助您。如果您从最初的帖子中更改了代码,那没关系,但您应该将这些新细节添加到您的原始问题中,以便保留这些 cmets 和答案的上下文。
  • @Miguel-F 我添加了这些内容。这个问题有点需要这些细节。

标签: coldfusion session-variables coldfusion-2018


【解决方案1】:

要修复提到的错误,您需要将会话变量的设置移动到 check_login.cfm 文件中的 &lt;cflocation&gt; 标记上方。

从这里:

<!--- If username equals user1 and password equals password1, take user to home page. ---> 
<cfif form.userName eq "user1" AND form.password eq "password1">
    <cflocation url="home.cfm">
<!--- If username doesn't equal user1 and/or password doesn't equal password1, take user back to login page. ---> 
<cfelse>
    <cflocation url="login.cfm">  
</cfif>
<cfset session.userName = form.userName/>

这样的:

<!--- If username equals user1 and password equals password1, take user to home page. ---> 
<cfif form.userName eq "user1" AND form.password eq "password1">
    <cfset session.userName = form.userName/>
    <cflocation url="home.cfm">
<!--- If username doesn't equal user1 and/or password doesn't equal password1, take user back to login page. ---> 
<cfelse>
    <cflocation url="login.cfm">  
</cfif>

这是因为当 ColdFusion 遇到 &lt;cflocation&gt; 标签时,它会停止处理文件的其余部分。当它处理该标签时,它将立即将重定向发送回用户。所以你设置会话变量的代码永远不会运行。

更新了在会话变量设置周围使用 CFLOCK 的示例

<!--- If username equals user1 and password equals password1, take user to home page. ---> 
<cfif form.userName eq "user1" AND form.password eq "password1">
    <cflock scope="session" type="exclusive" timeout="10">
        <cfset session.userName = form.userName/>
    </cflock>
    <cflocation url="home.cfm">
<!--- If username doesn't equal user1 and/or password doesn't equal password1, take user back to login page. ---> 
<cfelse>
    <cflocation url="login.cfm">  
</cfif>

【讨论】:

  • 我像你说的那样移动了它,但它仍然在结果页面上给出同样的错误。
  • 那么还有其他问题。根据您迄今为止提供的内容,应该可以解决该问题。使用最新的代码和错误消息更新您的问题。
  • @user8968494 您的 cookie 可能未设置为通过会话。 helpx.adobe.com/coldfusion/kb/…
  • @Shawn 在阅读完那篇文章后,我在 cflocation 中添加了 ADDTOKEN="Yes"。错误没有变化。它说不要在与 cflocation 相同的模板中设置会话变量。那我应该在哪里设置呢?
  • 您不需要(也不应该使用)addtoken="yes" 属性。这将在 URL 中公开您的 cookie。那很不好。尝试在会话变量的设置周围添加cflock。我已经用我的意思的一个例子更新了我的答案。我在同一页面上将它与cflocation 一起使用,它对我有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多