Coldfusion 如何去掉url变量

Coldfusion 如何去掉url变量,coldfusion,Coldfusion,我有一个url.LoginID,我想在用户单击链接登录时将其从地址栏中删除。它必须是书签,不能是表单提交 问:如何从Index.cfm中删除?LoginID?LoginID=XYZ&AssignmentID=123 这可能是以下几点: <cflocation url="#cgi.SCRIPT_NAME#?#cgi.QUERY_STRING#" addtoken="no"> 有很多方法可以做到这一点,下面是一种使用列表循环读取现有参数并检查要忽略的参数的方法: <cfset n

我有一个url.LoginID,我想在用户单击链接登录时将其从地址栏中删除。它必须是书签,不能是表单提交

问:如何从Index.cfm中删除?LoginID?LoginID=XYZ&AssignmentID=123

这可能是以下几点:

<cflocation url="#cgi.SCRIPT_NAME#?#cgi.QUERY_STRING#" addtoken="no">

有很多方法可以做到这一点,下面是一种使用列表循环读取现有参数并检查要忽略的参数的方法:

<cfset newParams = "" />

<cfloop list="#cgi.query_string#" delimiters="&" index="i">
    <cfif listFirst(i, "=") neq "loginID">
        <cfset newParams = listAppend(newParams, i, "&") />
    </cfif>
</cfloop>


<cflocation url="#cgi.script_name#?#newParams#" addtoken="no">


希望有帮助

假设您真的不想删除
以保持URL的有效性,那么简单的正则表达式应该可以:

QUERY_STRING = ReReplaceNoCase(cgi.QUERY_STRING, "LoginID=.+\&", "");
顺便说一句,我不知道你为什么在URL中保留
LoginID
,这可能是不安全的方法。使用会话听起来是个更好的主意


编辑:Ben的正则表达式更好,因为我的版本非常简单,可以在最后一对正则表达式之前“吃掉”所有的
key=value

如果loginID是查询字符串中唯一的内容,那么您只需将位置发送到目标页面,而不需要查询字符串

如果查询字符串中有其他数据,则可以执行以下操作:

<cfset q = reReplaceNoCase(cgi.query_string, "LOGINID=[^&]+&?", "")>
<cflocation url="#cgi.SCRIPT_NAME#?#q#">

这实际上会删除loginid和所有内容,直到字符串的en或下一个URL变量出现。

以不同方式插入和求解:

<cfset copy = duplicate(url)>
<cfset structDelete(copy, "loginid")>
<cfset entries = []>
<cfloop collection="#copy#" item="key">
    <cfset arrayAppend(entries, "#key#=#copy[key]#")>
</cfloop>
<cfoutput>#arrayToList(entries, "&")#</cfoutput>

#数组列表(条目“&”)#

像往常一样,已经有人在CFLIB上编写了一个UDF:

你可以这样做

<cflocation 
    url="#cgi.SCRIPT_NAME#?#queryStringDeleteVar("LoginID",cgi.QUERY_STRING)#" 
    addtoken="no"
>

+1对于整洁的正则表达式-我知道有一种更优雅的方法可以做到这一点:)+1对于比我的版本更智能的正则表达式,它不太可靠。+1。还进行了编辑以更改
reReplace()
->
reReplaceNoCase()
Good catch,@orangepips。我认为所有结构键都是大写的,但忘记了查询字符串可能不是.+1,这是一个非常简单的解决方案。我一直在寻找比我正在做的循环和listappend例程更易于维护的代码。我没有找到任何更简单的解决方案,直到我将stackoverflow添加到我的google搜索中,并发现这个页面是第一结果。令人惊叹的!使用arrayAppend()和arrayToList()而不是使用listAppend()有什么原因吗?就内存消耗而言,数组连接的性能优于字符串(即列表)。下面是java中字符串文字池的链接,以了解更多说明:
<cflocation 
    url="#cgi.SCRIPT_NAME#?#queryStringDeleteVar("LoginID")#" 
    addtoken="no"
>
<cfscript>
/**
 * Deletes a var from a query string.
 * Idea for multiple args from Michael Stephenson (michael.stephenson@adtran.com)
 * 
 * @param variable      A variable, or a list of variables, to delete from the query string. 
 * @param qs      Query string to modify. Defaults to CGI.QUERY_STRING. 
 * @return Returns a string. 
 * @author Nathan Dintenfass (michael.stephenson@adtran.comnathan@changemedia.com) 
 * @version 1.1, February 24, 2002 
 */
function queryStringDeleteVar(variable){
    //var to hold the final string
    var string = "";
    //vars for use in the loop, so we don't have to evaluate lists and arrays more than once
    var ii = 1;
    var thisVar = "";
    var thisIndex = "";
    var array = "";
    //if there is a second argument, use that as the query string, otherwise default to cgi.query_string
    var qs = cgi.query_string;
    if(arrayLen(arguments) GT 1)
        qs = arguments[2];
    //put the query string into an array for easier looping
    array = listToArray(qs,"&");        
    //now, loop over the array and rebuild the string
    for(ii = 1; ii lte arrayLen(array); ii = ii + 1){
        thisIndex = array[ii];
        thisVar = listFirst(thisIndex,"=");
        //if this is the var, edit it to the value, otherwise, just append
        if(not listFind(variable,thisVar))
            string = listAppend(string,thisIndex,"&");
    }
    //return the string
    return string;
}
</cfscript>