Coldfusion 如何去掉url变量
我有一个url.LoginID,我想在用户单击链接登录时将其从地址栏中删除。它必须是书签,不能是表单提交 问:如何从Index.cfm中删除?LoginID?LoginID=XYZ&AssignmentID=123 这可能是以下几点: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
<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>