16
16
import java .io .InputStream ;
17
17
import java .io .PrintWriter ;
18
18
import java .lang .reflect .Constructor ;
19
+ import java .lang .reflect .Field ;
19
20
import java .lang .reflect .InvocationTargetException ;
21
+ import java .lang .reflect .Modifier ;
20
22
import java .net .URLDecoder ;
23
+ import java .util .Arrays ;
21
24
import java .util .Date ;
22
25
import java .util .Enumeration ;
23
26
import java .util .HashSet ;
@@ -265,8 +268,29 @@ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
265
268
//resp.setCharacterEncoding("utf-8");
266
269
PrintWriter writer = resp .getWriter ();
267
270
runnable .deserialize (request );
271
+ SimpleRPCRunnable clonedRunnable = null ;
272
+ try {
273
+ clonedRunnable = (SimpleRPCRunnable ) runnable .clone ();
274
+ } catch (CloneNotSupportedException e ) {
275
+ //e.printStackTrace();
276
+ }
268
277
runnable .ajaxRun ();
269
- writer .write (runnable .serialize ());
278
+ final String [] diffs = compareDiffs (runnable , clonedRunnable );
279
+ String serialize = runnable .serialize (new SimpleFieldFilter () {
280
+
281
+ public boolean filter (String field ) {
282
+ if (diffs == null || diffs .length == 0 ) return true ;
283
+ for (int i = 0 ; i < diffs .length ; i ++) {
284
+ if (diffs [i ].equals (field )) {
285
+ return false ;
286
+ }
287
+ }
288
+ return true ;
289
+ }
290
+
291
+ });
292
+
293
+ writer .write (serialize );
270
294
}
271
295
272
296
protected void doGet (HttpServletRequest req , HttpServletResponse resp )
@@ -311,8 +335,27 @@ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
311
335
return ;
312
336
}
313
337
runnable .deserialize (request );
338
+ SimpleRPCRunnable clonedRunnable = null ;
339
+ try {
340
+ clonedRunnable = (SimpleRPCRunnable ) runnable .clone ();
341
+ } catch (CloneNotSupportedException e ) {
342
+ //e.printStackTrace();
343
+ }
314
344
runnable .ajaxRun ();
315
- String serialize = runnable .serialize ();
345
+ final String [] diffs = compareDiffs (runnable , clonedRunnable );
346
+ String serialize = runnable .serialize (new SimpleFieldFilter () {
347
+
348
+ public boolean filter (String field ) {
349
+ if (diffs == null || diffs .length == 0 ) return true ;
350
+ for (int i = 0 ; i < diffs .length ; i ++) {
351
+ if (diffs [i ].equals (field )) {
352
+ return false ;
353
+ }
354
+ }
355
+ return true ;
356
+ }
357
+
358
+ });
316
359
317
360
if (isScriptReuest ) { // cross site script response
318
361
resp .setContentType ("text/javascript" );
@@ -461,4 +504,94 @@ private void cleanSession(HttpSession ses) {
461
504
}
462
505
}
463
506
507
+ protected String [] compareDiffs (SimpleRPCRunnable runnable1 , SimpleRPCRunnable runnable2 ) {
508
+ Set diffSet = new HashSet ();
509
+ Set fieldSet = new HashSet ();
510
+ Class clazz = runnable1 .getClass ();
511
+ while (clazz != null && !"net.sf.j2s.ajax.SimpleSerializable" .equals (clazz .getName ())) {
512
+ Field [] fields = clazz .getDeclaredFields ();
513
+ for (int i = 0 ; i < fields .length ; i ++) {
514
+ fieldSet .add (fields [i ]);
515
+ }
516
+ clazz = clazz .getSuperclass ();
517
+ }
518
+ Field [] fields = (Field []) fieldSet .toArray (new Field [0 ]);
519
+ for (int i = 0 ; i < fields .length ; i ++) {
520
+ Field field = fields [i ];
521
+ int modifiers = field .getModifiers ();
522
+ if ((modifiers & (Modifier .PUBLIC | Modifier .PROTECTED )) != 0
523
+ && (modifiers & Modifier .TRANSIENT ) == 0
524
+ && (modifiers & Modifier .STATIC ) == 0 ) {
525
+ String name = field .getName ();
526
+ Object field1 = null ;
527
+ try {
528
+ field1 = field .get (runnable1 );
529
+ } catch (IllegalArgumentException e1 ) {
530
+ //e1.printStackTrace();
531
+ } catch (IllegalAccessException e1 ) {
532
+ //e1.printStackTrace();
533
+ }
534
+ Object field2 = null ;
535
+ try {
536
+ field2 = field .get (runnable2 );
537
+ } catch (IllegalArgumentException e ) {
538
+ //e.printStackTrace();
539
+ } catch (IllegalAccessException e ) {
540
+ //e.printStackTrace();
541
+ }
542
+ System .out .println (field1 .getClass ().getName ());
543
+ if (field1 == null ) {
544
+ if (field2 != null ) {
545
+ diffSet .add (name );
546
+ }
547
+ } else if (field1 .getClass ().getName ().startsWith ("[" )) {
548
+ Class type = field .getType ();
549
+ if (type == float [].class ) {
550
+ if (!Arrays .equals ((float []) field1 , (float []) field2 )) {
551
+ diffSet .add (name );
552
+ }
553
+ } else if (type == double [].class ) {
554
+ if (!Arrays .equals ((double []) field1 , (double []) field2 )) {
555
+ diffSet .add (name );
556
+ }
557
+ } else if (type == int [].class ) {
558
+ if (!Arrays .equals ((int []) field1 , (int []) field2 )) {
559
+ diffSet .add (name );
560
+ }
561
+ } else if (type == long [].class ) {
562
+ if (!Arrays .equals ((long []) field1 , (long []) field2 )) {
563
+ diffSet .add (name );
564
+ }
565
+ } else if (type == short [].class ) {
566
+ if (!Arrays .equals ((short []) field1 , (short []) field2 )) {
567
+ diffSet .add (name );
568
+ }
569
+ } else if (type == byte [].class ) {
570
+ if (!Arrays .equals ((byte []) field1 , (byte []) field2 )) {
571
+ diffSet .add (name );
572
+ }
573
+ } else if (type == char [].class ) {
574
+ if (!Arrays .equals ((char []) field1 , (char []) field2 )) {
575
+ diffSet .add (name );
576
+ }
577
+ } else if (type == boolean [].class ) {
578
+ if (!Arrays .equals ((boolean []) field1 , (boolean []) field2 )) {
579
+ diffSet .add (name );
580
+ }
581
+ } else if (type == String [].class ) {
582
+ if (!Arrays .equals ((String []) field1 , (String []) field2 )) {
583
+ diffSet .add (name );
584
+ }
585
+ } else if (type == Object [].class ) {
586
+ if (!Arrays .equals ((Object []) field1 , (Object []) field2 )) {
587
+ diffSet .add (name );
588
+ }
589
+ }
590
+ } else if (!field1 .equals (field2 )) {
591
+ diffSet .add (name );
592
+ }
593
+ }
594
+ }
595
+ return (String []) diffSet .toArray (new String [diffSet .size ()]);
596
+ }
464
597
}
0 commit comments