解決SSO客戶端驗證錯誤String index out of range


看控台的信息是客戶端進行ticket的時候出錯了報錯信息如下:

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(String.java:1911)
at org.jasig.cas.client.validation.Cas20ServiceTicketValidator.extractCustomAttributes(Cas20ServiceTicketValidator.java:145)
at org.jasig.cas.client.validation.Cas20ServiceTicketValidator.parseResponseFromServer(Cas20ServiceTicketValidator.java:98)


然后查看源碼發現是解析服務器返回回來的數據出錯了,然后debug斷點查看是他在每個<cas:xxx>里面的value多了一個/n所以讀導致屬性值頁給讀取了。導致leftpos和rightpos都是-1,所以就報錯了,我想了好多一開始,什么版本啊(也是剛入門這個東西),最后發現了問題,在服務端返給客戶端數據的時候是xml,也就是頁面,這個頁面是自己寫的。

 String attributesText = xml.substring(pos1 + 16, pos2);
/*     */ 
/* 134 */     Map attributes = new HashMap();
/* 135 */     BufferedReader br = new BufferedReader(new StringReader(attributesText));
/*     */ 
/*     */ 
/* 138 */     List attributeNames = new ArrayList();
/*     */     try {
/* 140 */       while ((line = br.readLine()) != null)      {        String line;
/* 141 */         String trimmedLine = line.trim();
/* 142 */         if (trimmedLine.length() > 0) {
/* 143 */           int leftPos = trimmedLine.indexOf(":");
/* 144 */           int rightPos = trimmedLine.indexOf(">");
/* 145 */           attributeNames.add(trimmedLine.substring(leftPos + 1, rightPos));
/*     */         }
/*     */       }
/* 148 */       br.close();
/*     */     }

我就找到了這個頁面發現他在頁面上key和value之間換行了,果斷發現問題,把換行刪除,就不會多一個/n了,問題解決

<c:forEach items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"
var="attr">
<cas:${attr.key}>
${attr.value}
</cas:${attr.key}>
</c:forEach>



修改后

<c:forEach items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"
var="attr">
<cas:${attr.key}>${attr.value}</cas:${attr.key}>
</c:forEach>
</cas:attributes>



注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com