如何解析url参数
tomcat中servlet的实现:
1 public void processParameters( byte bytes[], int start, int len,
2 String enc ) {
3 int end=start+len;
4 int pos=start;
5
6 if(log.isDebugEnabled()) {
7 try {
8 log.debug("Bytes: " +
9 new String(bytes, start, len, DEFAULT_ENCODING));
10 } catch (UnsupportedEncodingException e) {
11 // Should never happen...
12 log.error("Unable to convert bytes", e);
13 }
14 }
15
16 do {
17 boolean noEq=false;
18 int valStart=-1;
19 int valEnd=-1;
20
21 int nameStart=pos;
22 int nameEnd=ByteChunk.indexOf(bytes, nameStart, end, '=' );
23 // Workaround for a&b&c encoding
24 int nameEnd2=ByteChunk.indexOf(bytes, nameStart, end, '&' );
25 if( (nameEnd2!=-1 ) &&
26 ( nameEnd==-1 || nameEnd > nameEnd2) ) {
27 nameEnd=nameEnd2;
28 noEq=true;
29 valStart=nameEnd;
30 valEnd=nameEnd;
31 if(log.isDebugEnabled()) {
32 try {
33 log.debug("no equal " + nameStart + " " + nameEnd + " " +
34 new String(bytes, nameStart, nameEnd-nameStart,
35 DEFAULT_ENCODING) );
36 } catch (UnsupportedEncodingException e) {
37 // Should never happen...
38 log.error("Unable to convert bytes", e);
39 }
40 }
41 }
42 if( nameEnd== -1 )
43 nameEnd=end;
44
45 if( ! noEq ) {
46 valStart= (nameEnd < end) ? nameEnd+1 : end;
47 valEnd=ByteChunk.indexOf(bytes, valStart, end, '&');
48 if( valEnd== -1 ) valEnd = (valStart < end) ? end : valStart;
49 }
50
51 pos=valEnd+1;
52
53 if( nameEnd<=nameStart ) {
54 StringBuilder msg = new StringBuilder("Parameters: Invalid chunk ");
55 // No name eg ...&=xx&... will trigger this
56 if (valEnd >= nameStart) {
57 msg.append('\'');
58 try {
59 msg.append(new String(bytes, nameStart,
60 valEnd - nameStart, DEFAULT_ENCODING));
61 } catch (UnsupportedEncodingException e) {
62 // Should never happen...
63 log.error("Unable to convert bytes", e);
64 }
65 msg.append("' ");
66 }
67 msg.append("ignored.");
68 log.warn(msg);
69 continue;
70 // invalid chunk - it's better to ignore
71 }
72 tmpName.setBytes( bytes, nameStart, nameEnd-nameStart );
73 tmpValue.setBytes( bytes, valStart, valEnd-valStart );
74
75 // Take copies as if anything goes wrong originals will be
76 // corrupted. This means original values can be logged.
77 // For performance - only done for debug
78 if (log.isDebugEnabled()) {
79 try {
80 origName.append(bytes, nameStart, nameEnd-nameStart);
81 origValue.append(bytes, valStart, valEnd-valStart);
82 } catch (IOException ioe) {
83 // Should never happen...
84 log.error("Error copying parameters", ioe);
85 }
86 }
87
88 try {
89 addParam( urlDecode(tmpName, enc), urlDecode(tmpValue, enc) );
90 } catch (IOException e) {
91 StringBuilder msg =
92 new StringBuilder("Parameters: Character decoding failed.");
93 msg.append(" Parameter '");
94 if (log.isDebugEnabled()) {
95 msg.append(origName.toString());
96 msg.append("' with value '");
97 msg.append(origValue.toString());
98 msg.append("' has been ignored.");
99 log.debug(msg, e);
100 } else {
101 msg.append(tmpName.toString());
102 msg.append("' with value '");
103 msg.append(tmpValue.toString());
104 msg.append("' has been ignored. Note that the name and ");
105 msg.append("value quoted here may be corrupted due to ");
106 msg.append("the failed decoding. Use debug level logging ");
107 msg.append("to see the original, non-corrupted values.");
108 log.warn(msg);
109 }
110 }
111
112 tmpName.recycle();
113 tmpValue.recycle();
114 // Only recycle copies if we used them
115 if (log.isDebugEnabled()) {
116 origName.recycle();
117 origValue.recycle();
118 }
119 } while( pos<end );
120 }
121
1 void process_parameters( CString str, int start, CMapStringToString ¶meters )
2 {
3 int pos = start;
4 int end = start + str.GetLength();
5 CString tmpName;
6 CString tmpValue;
7 while (pos < end)
8 {
9 boolean noEq=false;
10 int valStart = -1;
11 int valEnd = -1;
12 int nameStart = pos;
13 int nameEnd = str.Find('=', nameStart);
14
15 // Workaround for a&b&c encoding
16 int nameEnd2 = str.Find('&', nameStart);
17 if( (nameEnd2!=-1 ) && ( nameEnd==-1 || nameEnd > nameEnd2) )
18 {
19 noEq = true;
20 nameEnd = nameEnd2;
21 valStart = nameEnd;
22 valEnd = nameEnd;
23 }
24 if (nameEnd == -1)
25 {
26 nameEnd = end;
27 }
28
29 if (!noEq)
30 {
31 valStart= (nameEnd < end) ? nameEnd+1 : end;
32 valEnd=str.Find('&', valStart);
33 if( valEnd== -1 )
34 valEnd = (valStart < end) ? end : valStart;
35 }
36
37 pos = valEnd + 1;
38 tmpName = str.Mid( nameStart, nameEnd-nameStart );
39 tmpValue = str.Mid( valStart, valEnd-valStart );
40 parameters.SetAt(tmpName, tmpValue);
41 }
42 }
浙公网安备 33010602011771号