如何在servlet里提取别人直接传过来的url里带中文和#的地址?

别人调用我们提供的MsgManager.do这个servlet来向我们传递数据,地址格式如下:
/MsgManager.do?user=aa&password=aa&txflag=1&tel=13618668888&sendtime=2009-06-17#14:33:47&msg=306测试

请教一下如何能在MsgManager.do这个servlet里提取这个地址并进行分析,从而获取里面的参数
关键是里面带的有#号和中文
我们整个网站都用的编码过滤器,统一的“utf-8”

只要能提取这个地址的方法就可以,分析的工作我们可以做,我现在用request.getQueryString()和request.getHeader("Referer")都提不出这个地址,何解?
谢谢

[b]问题补充:[/b]
里面的测试代码:
msg=request.getParameter("msg");
tel=request.getParameter("tel");
txflag=request.getParameter("txflag");
sendtime=request.getParameter("sendtime");

System.out.println(msg);
System.out.println(tel);
System.out.println(txflag);
System.out.println(sendtime);

得到的结果:
null
13618668888
1
2009-06-17

我如果这样传(去掉#号):
/MsgManager.do?user=aa&password=aa&txflag=1&tel=13618668888&sendtime=2009-06-1714:33:47&msg=306测试

得到:
null[color=red]--------------msg还是为空[/color]
13618668888
1
2009-06-1714:33:47

如果去掉(#号和中文):
/MsgManager.do?user=aa&password=aa&txflag=1&tel=13618668888&sendtime=2009-06-1714:33:47&msg=306

得到:
306
13618667017
1
2009-06-1714:33:47

[b]问题补充:[/b]
至于peday朋友说的,我也分析过,没有自己想要的数据:
Enumeration names=request.getHeaderNames();
while(names.hasMoreElements())
{
String tt=(String)names.nextElement();
System.out.println(request.getHeader(tt);
}

结果为:
image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/x-silverlight, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */
zh-cn
x86
gzip, deflate
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)
localhost:8080
Keep-Alive
cnzz_a1385362=3; vw1385362=%3A13428861%3A26446058%3A29578610%3A; sin1385362=http%3A//localhost%3A8080/; rtime=3; ltime=1245372363718; cnzz_eid=86227953-1245110629-http%3A//localhost%3A8081/; user_detail=1-E10ADC3949BA59ABBE56E057F20F883E; JSESSIONID=a4XOF87Ktvu59Xwd2h
[b]问题补充:[/b]
我本来建议他们对传递过来的数据格式改动一下,他们那边说“我们对所有的人”都是提供这样的格式,然我们自己解决,唉,没办法,请大家看看
[b]问题补充:[/b]
我们提供的地址他们是远程调用的,调用的过程中我们还要在MsgManager.do里给他们返回一个状态(0:成功 1:失败)。
[b]问题补充:[/b]
[color=darkred]to:lovewhzlq [/color]

System.out.println(request.getQueryString());
我也实验过,但是得到的数据从#号那就断了,郁闷

这是结果:
user=aa&password=aa&txflag=1&tel=13618668888&sendtime=2009-06-17
[b]问题补充:[/b]
我刚想了个办法,就是新建一个中转的jsp文件,然后让这个文件用js对地址进行分析,然后再传给MsgManager.do:

<%@ page contentType="text/html;charset=utf-8" language="java" %>

function jumpUrl() { var the_url=location.href; var p=the_url.indexOf("msg="); var temp; if(p!=-1) { temp=the_url.substring(0,p)+"msg="+escape(the_url.substring(p+4)); } var que_str=temp.substring(temp.indexOf("?")); que_str=que_str.replace("#","-"); //alert("/MsgManager.do"+que_str); location.href="/MsgManager.do"+que_str; } jumpUrl();

但是这样我就不知道他们远程那能否调用到我在MsgManager.do中返回的值?这个方法写了,但是还没有和他们沟通,我直接用ajax调用了一下,得不到值,出现了远程调用的权限问题
[b]问题补充:[/b]
[quote]
那用这个方法
public ServletInputStream getInputStream()
得到这个流,读取出来解析
lovewhzlq (资深架构师)
[/quote]

这个方法还没有实验,过会再上来提交结果,谢谢你的关注
[b]问题补充:[/b]
我实验两种方法,好像都取不出值,ContentLength得到的是-1,是我写的代码有问题,还是别的原因?request.getInputStream()好像应该在form提交的时候设置enctype="multipart/form-data"的时候才有用吧,我记得我以前写上传控件的时候用到过这个方法

第一种:
[code="java"]System.out.println("内容长度为:"+request.getContentLength());
BufferedReader in=request.getReader();
String temp;
while((temp=in.readLine())!=null)
{
System.out.println(temp+"########");
}
in.close();[/code]

第二种:
[code="java"]System.out.println("内容长度为:"+request.getContentLength());
byte[] buffer = new byte[1024];
ServletInputStream in=request.getInputStream();
String temp="";
int flag=0;
while((flag=in.readLine(buffer,flag,1024))!=-1)
{
temp=temp+new String(buffer,"utf-8");
System.out.println(temp+"########");
}
in.close();[/code]
[b]问题补充:[/b]
public Enumeration getHeaders(String name)不论我name传哪个头都无法得到完整的url,关键是他们在地址里面还加了个#号,#号在地址中也是一个特殊符号,指向锚点用的,我都晕了,getQueryString()又无法得到#号以后的数据。

他们地址也不编码,还说别人都用的好好的,就我们这有问题。

别的语言我没接触过,但是我这是已经想了很多办法了,都解决不了。

如果只是简单的出现乱码问题我都没有这么烦了,郁闷中……
[b]问题补充:[/b]
唯一能用的就是那个用中转页面调用js,然后对地址编码后再传递,不知道大家还有什么好的方法没有
[b]问题补充:[/b]
他们主要是做短信的,现在是希望我们提供一个接口,用户短信是直接发到他们平台,然后他们再调用我们提供的接口将信息转发过来,发送过来的信息格式就是以上讨论半天的那个地址,有#号和中文

我现在只能让我朋友用php或者别语言来试试,看看可以弄不。

关键是时间紧,不然我就重新找一个有开发api的服务商来合作了,没办法。

7个回答

他们地址也不编码,还说别人都用的好好的,

叫他们具体说出例子来,这太搞笑了,url不转码就直接传,

给他们提供一个转码的api,让他们调用吧

你们在MsgManager.do这个servlet里用
request.getParameter("user");
request.getParameter("password");
request.getParameter("txflag");
。。。
就这种取传递过来的参数啊

使用request.getHeaderNames()取出所有的请求头信息。然后Debug一下看看有没有你想要的数据。

前台不能这么传递特殊字符和中文,要转码一下,后台就能正确得到了

url = "/MsgManager.do?" +encodeURIComponent("user=aa&password=aa&txflag=1&tel=13618668888&sendtime=2009-06-17#14:33:47&msg=306测试");
传递这个url后台就能正确得到值了

那用request.getQueryString()得到"?"后面的所有字符,

然后打印看下,是否乱码,乱码的话,就用java.net.URLDecoder去解码下

那用这个方法
public ServletInputStream getInputStream()
得到这个流,读取出来解析

用public Enumeration getHeaders(String name)得到请求头也没办法的话,

那应该就是前台传递值的时候就丢失掉了

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!