奇怪!post提交 地址栏参数竟然可见
转: http://blog.csdn.net/yuebinghaoyuan/article/details/7727802
在做项目中,form标签中method="post",并且在提交的方法中,也显示声明method="post".但是地址栏参数依然可见。
地址栏参数可见,最大的弊端暴露信息,网站没有安全性。另外一个缺点是,当地址栏参数很长,导致页面无法运行。
为什么地址栏参数会可见呢?不是使用method的提交了。首先来看一下我的提交方式。
js某一函数的提交代码如下:
- with(document.forms[0]) {
- action="roleAuthoriedManager!getModuleOperateBySystem?roleId="
- +document.getElementById("roleId").value
- +"&systemId="+document.getElementById("systemId").value
- +"&pageNo="+<%=pageModelModule.getPreviousPageNumber()%>
- +"&queryString="+document.getElementById("searchById").value
- +"&ids="+checkedIds;
- method="post";
- submit();
- }
看见代码,你明白了为什么了吗?
若是看明白了,说明你对get与post提交有深入了解;若有点迷惑的,先不用着急,小弟继续分析。
首先解释一下,为什么地址栏参数可见。
因为,我的action转向中已经明显滴传参数了。只要action中明显的传参数,无论get或post,这些参数一定会出现在地址栏中。
那get提交与post提交区别是如何的呢?
大家都知道,get提交,地址栏参数是可见的;而post提交,地址栏参数是不可见的;所以post提交比get提交更安全。
这句话,没有错。我也是常常跟别人这么讲的,但是这句话很模糊,参数可见与否,到底是指那些参数?为什么我action传入的参数使用post提交,依然可见额?
详细的说法是:get提交,是把表单上的input的name以及value值作为参数传递过去。(这里必须设置name值,若只有id,没有name,则地址栏不会显示其参数)。
而post提交,同样也是把表单上的input的name以及value提交过去了。但是地址栏中没有表单上的参数以及值。
这个是两者之间明显的区别。当然由这个区别的原理继续进行区分:
get,地址栏参数显示,所以传递的参数是个数限制的。字符太长,导致页面无法运行。而post无参数限制。所以表单上input比较多,可以考虑post。
有时在特殊的情况,只能使用post提交。这个不必担心,到时候直接查查即可。
知道了原因以及区别后,那如何解决这个办法呢?action后面的参数是必须要传的。那如何办呢?
第一种办法:根据get与post本质原因,我们可以想到,把action后面紧跟的参数做成隐含域,这样作为表单上的一部分传递过去。
这个办法是可行的,并且大部分也是这么执行的。
我没有采用第一种办法,为啥呢?因为我参数不符合第一种,action后面的参数如ids不能做成隐含域,因为他是时时更新的。我这块肯定不能在action后面传递参数,因为参数太长,导致页面无法运行,第一种隐含域的办法,又不可行。那怎么解决呢?
第二种办法:提交时根据action后面的参数创建菜单,隐含域。
其实,第二种是在第一种的基础上扩展的,还是利用隐含域。只不过是重新定义了提交类。
第二种办法:js代码如下:
- function submitForm(url,data) {
- var eleForm=document.body.appendChild(document.createElement('form'));
- eleForm.action=url;
- for(var property in data)
- {
- var hiddenInput=document.createElement('input');
- hiddenInput.type='hidden';
- hiddenInput.name=property;
- hiddenInput.value=data[property];
- eleForm.appendChild(hiddenInput);
- }
- this.eleForm=eleForm;
- if(!submitForm._initialized)
- {
- submitForm.prototype.post = function()
- {
- this.eleForm.method = 'post';
- this.eleForm.submit();
- };
- submitForm._initialized = true;
- }
- }
参数解释:url,即form表单转向。data,即action后面参数。这里是用json字符串表示。
json,全名JavaScript object notation,一种轻量级的资料交换语言,主要应用javascript与服务器打交道。json具有两种表达方式。
一个是对象,用{},花括号里面是名称值对,表示方式:名称:值,其中每对用逗号隔开。
一个是值序列表,用[],中括号里面是字符串,每个字符串,用逗号隔开。
常用的是第一种,若是想进一步了解json,可以自己自主学习哈。
定义了上述提交的方式。提交方式解释如下:
首先定义了form表单;
然后定义了表单上的隐含域。
把action后面的参数付给隐含域的名称以及值。
然后重新定了post方式提交。
应用如下:
- new submitForm('userAuthoriedManager!selectRole',
- {userId:userId.value,
- pageNo:'<%=pageModel.getNextPageNumber()%>',
- queryString:document.getElementById("searchById").value,
- checkedIds:checkedIds}).post();
传参问题已经解决啦。
其实,认识是随着时间以及阅历不断加深的。但是每次把对事物的认识都记录或装在脑子中,也许某一天的实践or问题,就是擦出新的认识。最终,其实这种认识就是一种经验,项目的经验就是如此一点一滴积累起来的,不因其小而丢弃。滴水穿石,非一日之功
奇怪!post提交 地址栏参数竟然可见的更多相关文章
- Js替换地址栏参数
开了博客竟然有9个月没在来写过了.真是惭愧.今天需要用到一个用js替换地址栏参数的的功能.就自己用JS自己写了一个简单的函数.贴出来仅供大家参考.代码都写了注释.如下: /* js替换URL参数值,无 ...
- 用JS获取地址栏参数的方法
采用正则表达式获取地址栏参数: function GetQueryString(name) { var reg = new RegExp("(^|&)"+ nam ...
- js 读取 地址栏参数 转
用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var re ...
- 用JS获取地址栏参数的方法(超级简单)
方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg = new RegExp("( ...
- mvc ajax提交数组参数(转)
http://blog.csdn.net/lonestar555/article/details/10192595/ 在action中的参数以数组方式接收数据 一.表单方式 1.提交Form < ...
- js常用的地址栏参数获取
用JS获取地址栏参数的方法(超级简单) 方法一:采用正则表达式获取地址栏参数:( 强烈推荐,既实用又方便!) function GetQueryString(name) { var reg ...
- JS获取地址栏参数
获取地址栏参数(其中name为你所需要的参数值) function GetQueryString(name) { var reg = new RegExp("(^|&)" ...
- JS 获取 地址栏 参数
法一:正则表达式 /** * 采用正则表达式获取地址栏参数: **/ var GetQueryString = function (name) { var reg = new RegExp(" ...
- 使用Javascript获得网页中通过GET方法提交的参数
下面我将写出一个函数,用来获取GET方法提交的参数 function getParameter(parameterName) { var string = window.location.search ...
随机推荐
- C#知识点<4>
1\C# 运算符重载 您可以重定义或重载 C# 中内置的运算符.因此,程序员也可以使用用户自定义类型的运算符.重载运算符是具有特殊名称的函数,是通过关键字 operator 后跟运算符的符号来定义的. ...
- AutoDispose代替RxLifecycle优雅的解决RxJava内存泄漏问题
使用过Rxjava的小伙伴都知道,在使用RxJava时如果处理不当,很可能会产生内存泄漏的问题. 我们使用rxjava最大的原因是响应式编程使我们的异步操作代码变得很优雅,在Android中,也使线程 ...
- linux系统初始化——启动脚本是如何工作的
启动脚本是如何工作的 Linux 使用的是基于 运行级(run-levels) 概念的称为 SysVinit 的专用启动工具.它在不同的系统上可能是完全不一样的,所以不能认为一个脚本在某个 Linux ...
- IO文本操作
创建文件并写入内容 StreamWriter sw = new StreamWriter(url, “false 覆盖,true 追加”, Encoding.UTF8); sw.Write(“内容”) ...
- JavaScript内存分配
1.栈内存和堆内存 栈内存为自动分配的内存空间,由系统自动释放堆内存是动态分配的内存,大小不固定,也不会自动释放 js的值类型直接分配在栈内存中,引用类型分配在堆内存中引用类型变量保存的是引用类型的指 ...
- val
val 题目描述 有一个值初始为0,接下来n次你可以令其在之前基础上+2或+1或-1.你需要保证,这个值在整个过程中达到的最大值减去达到的最小值不大于k,求方案数,模1,000,000,007. 输入 ...
- [JSOI2007]建筑抢修 (贪心)
题目链接 Solution 可以考虑 \(dp\) ,但是很显然 \((n^2)\) 降不下来. 然后考虑贪心,首先,绝对的正确的是,在同等的情况下,给后面的留更多的时间. 首先按照 \(T_2\) ...
- php处理ajax
首先安装wamp,若安装过mysql则终止进程防止冲突,可以访问localhost说明成功.在www目录下新建项目,使用localhost访问. php: <?php //3.获取ajax传过来 ...
- 【BZOJ3895】取石子(博弈,记忆化搜索)
题意: Alice和Bob两个好朋含友又开始玩取石子了.游戏开始时,有N堆石子排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个:1:从某堆石子中取走一个2:合并任意两堆石 ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---11
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下: