请教get请求url格式如何获取这样的URL信息

百度如何正确处理get请求中文参数_URL编码及Servlet问题_java吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:558,449贴子:
百度如何正确处理get请求中文参数_URL编码及Servlet问题收藏
url查询串不直接支持中文等非ASCII码表符号的传输,需要经过浏览器采取一种编码方案将中文字符编码为可用于url传输的符号。除这种类似中文查询串的情况外,url中有特殊用途的符号,例如%,@, :, &,#,?等也不能直接传输,同样需要编码后传输。但比较蛋疼的是,由于标准没有规定,一个浏览器究竟应该采取哪种编码应对这种情况。所以各家浏览器各行其是(其实主要是IE)。所以国际化的(或者支持中文的)服务端在接收参数的时候必须知道浏览器是采用的哪种编码方式,纯英文的就不用了(各种编码方案都兼容ASCII,ASCII是各种编码的子集)。这里详细要将的就是如何实现中文参数的正确获取;其实就是服务端获知浏览器采用的编码方案,用此方案来解码。post请求只能通过表单提交,所以是采用页面编码,页面编码是可以服务端约定的,不存在服务端不知情的情况,所以不讨论post提交方式。(request.setcharacterEncoding(&&)也只支持post, get请求需要用new String(getbytes(&iso-8859-1&), &浏览器用的编码&));解码:如果Tomcat容器知道浏览器就是用的ggg编码方案,因为Tomcat默认使用iso-8859-1来解码,如果浏览器的ggg就是iso-8859-1,那么传输非ASCII的字符也完全没有问题。可是绝大部分浏览器都不会用iso-8859-1,怎么获取get请求的原本传输的字符呢。可以String xxx = request.getParameter(&xxx&);if(xxx!=null){
xxx = new String(xxx.getBytes(&iso-8859-1&), &ggg&);
/*用iso-8859-1获取传输过来的实际字
节,用此字节用ggg方案解码为字符串xxx;*/}问题在于,服务器怎么获取浏览器发过来的url采取的编码方案,编码方法,然后才知道怎么解。但是虽然采取的编码方案不同,传输形式都是相同的(IE地址栏直接输入除外),通过把查询串通过浏览器采取的某一编码方案编码成字节,每个字节用16进制表示,同时在前边加%;所以%在url中有特殊用途,如果真的想查询“%”,也需要编码。以utf-8为例,如果我想要查询&我爱*java%&,浏览器会编码为&%E6%88%91%E7%88%B1*java%25&,其中&%E6%88%91%E7%88%B1&是&我爱&的utf-8编码16进制,*不是特殊字符,编码后仍然是*,java同*,还是java。%,特殊字符,用utf-8编码为%25。但其实特殊符号也是ASCII码表的符号,所以无论是utf-8还是gbk,特殊符号编码一样。而gbk编码一个汉子用两个字节表示,为“%CE%D2%B0%AE*java%25”, 其他不变,“”我爱“变成了”%CE%D2%B0%AE“,其中CE,D2是&我&的两个字节的16进制,B0,AE是&爱&的两个字节的16进制。大家都知道,百度是最大的中文搜索引擎,而且搜索引擎一般都不会采用post方式的。所以以它为例(其实我是通过对百度对不同参数、不同方式,以及request.getParameter()和request.getQuerystring()相对应情况来研究学习的)。经过测试,以及网络搜索。一个浏览器采取的编码根据get方式的不同而不同。get请求分两种:1、地址栏直接键入,回车。2、页面表单提交(其实还是地址栏,但表单是有标记,可控制的)。
上海张学友、王菲演唱会一站式购票!票品安全且真票!立即订购!
哦。忘了说,高手可以先看最后。。。。低手也可以哦。1、通过表单提交:因为表单提交默认采取页面编码,而页面编码约定好的,是可知的,而且表单是可控制的。所以表单的情况相对简单,先说表单。请求消息头有一个属性叫referer,可以用request.getHeader(&referer&)获得,如果是通过表单,会有这个头存在的,表示请求来源页面url,即表单所在url,如果是地址栏直接输入,这个头是没有的,通过request.getHeader(&referer&)是否==null,我们就可以分辩请求来自哪里,如果没有来源,就认为其是浏览器地址栏敲回车过来的;否则就是表单, 知道了请求来自表单,剩下的就是怎么知道表单页面的编码了。所以可以通过添加一个隐藏表单项,例如&input type=&hidden& name=&encoding& value=&utf-8&&,键为encoding,值为约定的页面编码,这样服务端就可以获取这个encoding的值,根据request.getParameter(&encoding&)的值选取不同的编码方案解码。如果我们开发的系统只是自己使用,而且确定用的是utf-8,也就是说只要是表单,就是用的utf-8提交。那么这个隐藏&input&不是必要的,完全可以通过referer的有无,来分辨是不是表单提交,如果是表单,就utf-8。百度搜索时(后面都用百度举例),百度除了会传送wd搜索词外还会传送一些hiddeng的表单项,比如搜索“Test”,如下“/s?wd=Test&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_sug3=2&rsv_sug1=2&rsv_sug2=0&inputT=3306&rsv_sug4=4981”,其中两个参数比较感兴趣,wd=Test,ie=utf-8;wd=Test是搜索词,无需赘言;ie=utf-8是什么,我试着用各种浏览器(不止IE)百度搜索框(表单)搜索,发现都有ie=utf-8这个表单项,看来这个ie=utf-8并不是表示使用的什么浏览器,而是表达的页面的编码。类似上面说的encoding,百度可能是这样&input type=&hidden& name=&ie& value=&utf-8&&,这个ie的作用就是上面encoding的作用。百度之所以用ie而不用encoding等含义的词,可能是因为ie太奇葩了,之所以写这么个东西,就主要是为了解决ie的问题嘛。为什么还给了utf-8这个值呢?我猜有几个原因:1、可扩展性:页面的编码可能会换的,比如用gbk。2、ie=utf-8作为一个接口,可以开放给别的网站、软件使用。很多网站(例如hao123导航,可能页面并不是用的utf-8)或者软件(比如浏览器的搜索栏)嵌入了百度搜索框,如果网站或软件本身用的就是gbk编码,完全可以传参ie=gbk,告知百度用gbk解析。到此ie或者encoding的值就起作用了。2、地址栏直接输入
&我&-----utf-8--encode------------&%E6%88%91&
&我&-----utf-8--encode------------&%CE%D2&
user-agent:
FireFox:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/
Firefox/40.0
IE:Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko
360jisu:Mozilla/5.0 ( MSIE 9.0; Windows NT 6.1; WOW64; Trident/7.0)
host:localhost:8080
user-agent:Mozilla/5.0 (Windows NT 6.1; WOW64; rv:40.0) Gecko/ Firefox/40.0
accept:text/html,application/xhtml+xml,application/q=0.9,*/*;q=0.8
accept-language:zh-CN,q=0.8,en-US;q=0.5,q=0.3
accept-encoding:gzip, deflate
cookie:JSESSIONID=4BF66EB926A95365EEEBE2
connection:keep-alive
地址栏直接输入:firefox等浏览器采用utf-8编码,仍然是%加字节16进制表示
IE:采用gbk
前边说了只要request.getHeader(&referer&)==null,就认为是来自于地址栏。那么如果是这种情况,就忽略请求参数中的ie=xxx属性。根据浏览器的user-agent选取不同的编码方案,浏览器的user-agent可以通过request.getHeader(&user-agent&)获取。获取get请求的编码的方法可以这么写:private String getEncoding(HttpServletRequest request) {
//IE的user-agent
String ie_user_agent = &Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko&;
String referer = request.getHeader(&referer&);
if(referer == null) {//如果==null,就视为地址栏输入
String user_agent = request.getHeader(&user-agent&);
if(user_agent.equals(ie_user_agent)) {//如果user_agent是ie的就返回gbk
return &gbk&;
return &utf-8&;//否则就是utf-8
String encoding = request.getParameter(&encoding&);
return encoding==null?&utf-8&:
至此,我们完成了无论是通过表单还是地址栏,无论采用哪种浏览器。我们都能在服务端获取到正确中文参数。貌似问题都解决了,但其实还有一个问题没有解决。
前端转二进制再在后端转回来
百度的搜索结果是可传播的,这是采用get请求的一个主要原因。因为每个搜索结果页,对应一个地址(或者多个地址)。百度不希望,复制火狐中的搜索页地址,粘贴到IE中就成为一堆乱码的搜索结果。比如我用火狐搜索“我”的地址“”粘贴到IE中也应该是“我”的结果页,而实际上百度(等等中文搜索引擎)甚至做到了无论我输入下面那个网址:我在哪个浏览器中,它都能把我导向“我”的搜索结果页,不得不佩服百度、搜狗、好搜等中文搜索引擎的强大。其实俺来主要是想问个问题。请教请教各位大神,百度是如何做到的???(这个url编码问题想了三天了,)
登录百度帐号推荐应用
为兴趣而生,贴吧更懂你。或请教GET请求如何获取这样的URL信息? - CNode技术社区
这家伙很懒,什么个性签名都没有留下。
我使用了Express构建了Web服务器,想获取访问的URL,不管后面是什么值。
平时的URL后面的是<?name=some_value&filed=some_value,可以在请求头里面看到查询的东西,然后可以得到完整的URL信息
但是如果是这个样子:``
其实我是想知道访问的完整的URL信息,但是在请求头里面适合没有办法拿到这个值。
`` 这样的URL到不了服务器吧。
可以的,比如:
这是人家在浏览器端做了处理,使用了get查询
并且后台得不到#name=youqingkui
是浏览器不发送hash好像。
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的通过HTTP协议访问服务器,有两种方法,那就是通常所说的Get/Post访问。这次主要内容是Node如何对URL进行解析?如何获取Get访问信息?
1、何为Get方法
首先要了解一下何为Get方法访问?这里简要介绍一下Get以及Post方法的区别和基本原理。这块不是这里的主要内容,我直接摘录了,可以先了解一下。
Get是用来从服务器上获得数据。
Get将表单数据按照variable=value的形式,添加到action所指向的URL后面,并且两者使用“?”连接,而各个变量之间使用“&”连接;
Post是用来向服务器上传递数据。
Post是将表单中的数据放在form的数据体中,按照变量和值相对应的方式,传递到action所指向URL。
那么,要获取html的Get访问,首先就要解析URL,这里就这涉及了url模块以及querystring模块。下面通过代码来学习这两个模块的相关方法。
2、URL解析
Get的访问信息全都显示在URL上了,想要获取get访问的相关参数,就要学会解析URL。
var http = require(&#39;http&#39;);
var url = require(&#39;url&#39;);
var util = require(&#39;util&#39;);
var server = http.createServer(function(req,res){
res.writeHead(200 , {&Content-Type&:&text/html&});
res.end(&YOU require : & + util.inspect(url.parse(req.url)));
//重点在这里
server.listen(8888);
console.log(&Your server is started @port 8888&);
其实这段代码最主要的就是两个函数。
url.parse(req.url),输入 URL 字符串,返回一个对象。
util.inspect(object),返回一个对象的字符串表现形式,。通常用于代码调试。
通过下面的网址访问:
http://localhost:8888/p/a/t/h?query=string#hash
得到的结果如下:
YOU require : { protocol: null, slashes: null, auth: null, host: null, port: null, hostname: null, hash: null, search: &#39;?query=string&#39;, query: &#39;query=string&#39;, pathname: &#39;/p/a/t/h&#39;, path: &#39;/p/a/t/h?query=string&#39;, href: &#39;/p/a/t/h?query=string&#39; }
查看官方API,来看看这些字段都是什么含义?上面得到的结果有好多是null,原因我也不太清楚,求高手解答
href: 所解析的完整原始 URL。协议名和主机名都已转为小写。例如: http://localhost:8888/p/a/t/h?query=string#hash
protocol: 请求协议,小写。例如: http:
host: URL主机名已全部转换成小写, 包括端口信息。例如: localhost:8888
auth:URL中身份验证信息部分。例如: user:pass,这里没有。
hostname:主机的主机名部分, 已转换成小写。例如: <
port: 主机的端口号部分。例如: 8888
pathname: URL的路径部分,位于主机名之后请求查询之前。例如: /p/a/t/h
search: URL 的“查询字符串”部分,包括开头的问号。例如: ?query=string
path: pathname 和 search 连在一起。 例如: /p/a/t/h?query=string
query: 查询字符串中的参数部分(问号后面部分字符串),或者使用querystring.parse()解析后返回的对象。例如: query=string or {&#39;query&#39;:&#39;string&#39;}
hash: URL 的 “#” 后面部分(包括 # 符号) 例如: #hash
3、querystring反序列化
好了,通过上面,咱们就找到了我们想要获取的信息,那就是query对象,它的内容是hello=Node&hello2=Node2,那么如何再把这个字符串解析成对象进行访问呢?这里就要用到querystring模块了。
var querystring = require(&#39;querystring&#39;);
var hello = querystring.parse(&#39;hello=Node&hello2=Node2&#39;).
var hello2 = querystring.parse(&#39;hello=Node&hello2=Node2&#39;).hello2;
console.log(&hello值为:& + hello + &; hello2值为:& + hello2);
很简单的一段代码,querystring的parse方法将一个 query string 反序列化为一个对象。然后直接通过key-value对应取值就OK了。
4、Get方法获取信息
那么完整的Get方法获取参数的代码就如下所示:(自己可以尝试写出来)
var http = require(&#39;http&#39;);
var url = require(&#39;url&#39;);
var querystring = require(&#39;querystring&#39;);
var util = require(&#39;util&#39;);
var server = http.createServer(function(req,res){
var pathname = url.parse(req.url).
var username = querystring.parse(url.parse(req.url).query).
var email = querystring.parse(url.parse(req.url).query).
console.log(pathname);
if(pathname == &/index&){
res.writeHead(200 , {&Content-Type&:&text/html&});
res.write(&Your username is : &
+ username + &&/br&&);
res.write(&Your email is : &
res.end();
res.writeHead(200 , {&Content-Type&:&text/html&});
res.end(&&h1&I can&#39;t find the page! Please visit /index...&/h1&&);
server.listen(8888);
console.log(&Pleaes viste: http://localhost:8888/index?username=zhangsan&email=&);
通过网址http://localhost:8888/index?username=zhangsan&email=访问服务器。可以看到返回了username和email信息。
其实在这里,我们可以通过url.parse()方法直接获取参数对象,而不用借助querystring模块,因为url.parse()方法有个参数的设置可以直接将query字段内容转换成对象。你可以参考,然后自己尝试一下。
本文目前还没有评论……请教如何在portal URL中添加请求参数软件名称:IBM WebSphere Portal 软件版本:6.1环境平台:window2003问题描述:请教如何在portal URL中添加请求参数,用过如下url测试,从request.getParameter("url")获取到null:http://localhost:10040/wps/portal?url=http://www.webspherechine.net请问正确的写法应该是怎样呢???谢...软件名称:IBM WebSphere Portal 软件版本:6.1环境平台:window2003问题描述:请教如何在portal URL中添加请求参数,用过如下url测试,从request.getParameter("url")获取到null:请问正确的写法应该是怎样呢???谢谢!关注问题111回答项目经理
, 重庆斯欧信息技术有限公司应该是http://localhost:10040/wps/myportal?应该是http://localhost:10040/wps/myportal?赞同技术经理
, 浙江兰德纵横网络技术有限公司问题分析:问题解决思路:&&你想直接在后面带参数,这个方法肯定是不对的。具体解决方法、建议:&&portlet只是页的一个片段,所以单独这样子增加参数是不对的,你访问portlet是可以增加参数的,看标签或写ActionURL,这样子在portlet后台可以取到这个参数值。&nbsp...问题分析:问题解决思路:&&你想直接在后面带参数,这个方法肯定是不对的。具体解决方法、建议:&&portlet只是页的一个片段,所以单独这样子增加参数是不对的,你访问portlet是可以增加参数的,看标签或写ActionURL,这样子在portlet后台可以取到这个参数值。&&你增加的页面参数只有wps.war里jsp可以取到。portlet是无法取到的。赞同软件架构设计师
, 重庆斯欧信息技术有限公司Portal 中 的URL参数不是随便能够用问号之类就能添加的。Portal的URL包括参数,都是做了编码处理的。因此,直接是无法加入的,必须使用portal的API。在portal中,不提倡使用url来传递参数,而是使用portlet通信方式的来传递参数,如共享变量、事件、C2A、cookie等方式。请参考portal...Portal 中 的URL参数不是随便能够用问号之类就能添加的。Portal的URL包括参数,都是做了编码处理的。因此,直接是无法加入的,必须使用portal的API。在portal中,不提倡使用url来传递参数,而是使用portlet通信方式的来传递参数,如共享变量、事件、C2A、cookie等方式。请参考portal infocenter赞同技术经理
, 汉光电子问题分析:& && &&&IBM的PortletRequest是继承自HttpServletRequest的,所以它的getParameter方法也就是获取页面的请求的数据.但我记得用JSR的标准API也是可以获取到对应的参数的问题解决思路:& && &&&1.详细...问题分析:& && &&&IBM的PortletRequest是继承自HttpServletRequest的,所以它的getParameter方法也就是获取页面的请求的数据.但我记得用JSR的标准API也是可以获取到对应的参数的问题解决思路:& && &&&1.详细看一下你跳转之后的页面的URL后面是否带有参数& && &&&2.看你的URL是否前面已经带有?参数&&具体解决方法、建议:& && &&&根据前面做相应测试赞同系统工程师
, 永泰软件不知道在processaction方法里调actionresponse的setRenderParameter方法可以帮你解决问题不 ?不知道在processaction方法里调actionresponse的setRenderParameter方法可以帮你解决问题不 ?赞同系统工程师
, 神信第一步:修改form的action为第二步:在doView里request.getParameter("form表单的input")第一步:修改form的action为<form action="" name="form" id="form" method="post">第二步:在doView里request.getParameter("form表单的input")赞同技术经理
, 蓝凌先感谢各位!因为我是想实现用户访问应用系统时,发现没有登录就会跳转到portal的登录界面,然后portal登录成功后,自动转到原来访问应用系统的链接。所以我才用url参数来记录应用系统的地址,以便实现跳转。目前看来只有用cookie比较方便了。请问各位有没有更好的解决方案?...先感谢各位!因为我是想实现用户访问应用系统时,发现没有登录就会跳转到portal的登录界面,然后portal登录成功后,自动转到原来访问应用系统的链接。所以我才用url参数来记录应用系统的地址,以便实现跳转。目前看来只有用cookie比较方便了。请问各位有没有更好的解决方案?赞同系统工程师
, 神信这个配置完urlmapping,自动实现了,还用你做吗?这个配置完urlmapping,自动实现了,还用你做吗?赞同技术经理
, 蓝凌回复 9# zgxzowen & & urlmapping可以动态设置跳转url的?有没有相关文章参考下,谢谢了回复
zgxzowen & & urlmapping可以动态设置跳转url的?有没有相关文章参考下,谢谢了赞同开发工程师
, 京华信息JSR 286 portlet,可以试试public render parametersIBM API Portlet,直接可以支持JSR 168 portlet,灰常麻烦,参考这篇文章:/developerwork ... ott/0508_scott.html还有个方法,使用js~~~JSR 286 portlet,可以试试public render parametersIBM API Portlet,直接可以支持JSR 168 portlet,灰常麻烦,参考这篇文章:还有个方法,使用js~~~赞同
撰写回答技术经理, 蓝凌关注发布56回答16请稍候...

我要回帖

更多关于 asp.net get请求url 的文章

 

随机推荐