1

我正在使用我的公司以前在使用框架的网站上使用的非常旧的登录系统。以前,当有人尝试错误的用户/密码组合时,框架会加载一个简单的 cfinclude 文件,其中包含登录表单和顶部的错误消息。现在我在一个调用 application.cfc 的弹出窗口中使用了一个表单,但是页面并没有在我的弹出窗口中返回错误消息,而是将 cfinclude 文件从应用程序组件加载到一个新页面。

所以我需要为这个应用程序做一些事情。首先,我需要初始弹出窗口保持不变,如果用户/密码的组合错误,页面不应该提交,最后我需要错误消息出现在弹出窗口的某个位置。

如果有人在我之前做过这样的事情,我将非常感谢您的反馈。

这是我的代码的一部分:

登录表格:

<!--- loginErrMsg display - to tell why login is denied --->
<cfif isdefined("loginErrMsg")><span style="color:red">#loginErrMsg#</span><br /></cfif>

<form name="LoginForm" id="LoginForm" action="<cfif test is false>https://secure.example.com</cfif>#loginFormAction#" method="post" target="_top">
</cfoutput>
<input type="hidden" name="loginPost" value="true">
    <p>
      Login below to take advantage of the great services we offer:
    </p>

    E-mail:<input name="j_username" class="loginform" type="text" size="30" maxlength="50" id="j_username"> 
    Password: <input name="j_password" type="password" size="30" maxlength="16" class="loginform">
    <br />

    <input type="submit" name="btn" value="Submit" class="bluebuttonnormal">
    </form>

应用程序.cfc 代码:

<cflogin applicationtoken="swmadmin">
        <cfif NOT IsDefined("cflogin")>
            <cfinclude template="login.cfm">
            <cfabort>
        <cfelse>
            <cfquery name="userlookup" datasource="#ds#">
            SELECT clientadminID, roles, isFaxOnly, acctEnabled FROM clientadmin
            WHERE
            username=<cfqueryparam value="#cflogin.name#" CFSQLTYPE="CF_SQL_VARCHAR" maxlength="50">
            and password=<cfqueryparam value="#cflogin.password#" CFSQLTYPE="CF_SQL_VARCHAR" maxlength="16">
            </cfquery>
            <cfif userlookup.recordcount eq 0>
                <cfset loginErrMsg = "Invalid login.">
                <cfinclude template="login.cfm">
                <cfabort>

    </cflogin>
4

1 回答 1

5

我正在使用我的公司以前在使用框架的网站上使用的非常旧的登录系统。

如果这是一个新网站,请不要使用它。登录表格是一角钱,可以在你睡觉的时候完成。从新开始,做正确的事。

所以我需要为这个应用程序做一些事情。首先,我需要初始弹出窗口保持不变,如果用户/密码的组合错误,页面不应该提交,最后我需要错误消息出现在弹出窗口的某个位置。

您将希望在这里使用 AJAX 解决方案,要么编写自己的解决方案,要么使用像 jQuery 这样的优秀库。一旦您检查了登录值,您就可以使用 jQuery 或简单的 javascript 来取消隐藏或更新空元素的 innerHTML 以显示您的错误消息。

<cflogin ...>
...
</cflogin>

CFLogin 让我很难过。ColdFusion 的另一个标签旨在简化一些通常做的事情,这些事情并没有太大帮助,而且牺牲了灵活性。没有它,您可以更好地控制您的应用程序。而不是 CFLogin,试试这个伪代码

<cfcomponent>
  <cffunction name = "onRequest" ...>
    <cfargument name="targetPage" type="String" required = "true" />
    <cfif !structKeyExists(session, "roles") and !findNoCase("loginHandler.cfm",cgi.script_name)>
      <!--- notice I prevent the redirect on the form handler, otherwise the ajax will get redirected to the login.cfm page --->
      <cfinclude template = "login.cfm">
    <cfelse>
      <cfinclude template = "#arguments.targetPage#">
    </cfif>
  </cffunction> 
</cfcomponent>

然后,您的 login.cfm 将包含您的表单,但您的按钮会触发类似jQuery.post()到“loginHandler.cfm”的内容,然后根据登录结果,您的回调函数可能会使用jQuery.html()来显示错误或window.location.replace / window.location.href如果登录成功。当然,在成功登录的情况下,您的 ColdFusion 页面必须创建它们的会话变量并执行您希望它执行的任何其他操作,然后再将结果发送回您的 AJAX 调用。

于 2013-01-19T04:03:51.480 回答