CAS實現中文的屬性
casServiceValidationSuccess.jsp頁面默認編碼格式為ISO-8859-1,且在表單提交到客戶端頁面時,也使用IS0進行編碼,為了處理中文,可以在頁面上使用URLEncoder對需要傳遞的中文時行UTF-8編碼,然后從客戶端取得數據時,再做URLDecoder解碼:
casServiceValidationSuccess.jsp頁面,真是一個奇怪的頁面,由于cas使用手工解析(沒有使用任何dom解析,硬編碼識別標標簽的開始和標簽的結束)xml的方式解析xml文件,所有,在修改此文件時,一定要加以注意:
以下是源代碼:
<%@ page session="false" contentType="text/xml; charset=UTF-8" import="java.net.URLEncoder"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'>
<cas:authenticationSuccess>
<cas:user>${fn:escapeXml(assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.id)}</cas:user>
<c:if test="${not empty pgtIou}">
<cas:proxyGrantingTicket>${pgtIou}</cas:proxyGrantingTicket>
</c:if>
<c:if test="${fn:length(assertion.chainedAuthentications) > 1}">
<cas:proxies>
<c:forEach var="proxy" items="${assertion.chainedAuthentications}"
varStatus="loopStatus" begin="0"
end="${fn:length(assertion.chainedAuthentications)-2}"step="1">
<cas:proxy>${fn:escapeXml(proxy.principal.id)}</cas:proxy>
</c:forEach>
</cas:proxies>
</c:if>
<cas:attributes>
<c:forEach items="${assertion.chainedAuthentications[fn:length(assertion.chainedAuthentications)-1].principal.attributes}"var="attr">
<c:set var="val" value="${attr.value}"/>
<cas:${attr.key}><%=URLEncoder.encode((String)pageContext.getAttribute("val"),"UTF-8")%></cas:${attr.key}>
</c:forEach>
</cas:attributes>
</cas:authenticationSuccess>
</cas:serviceResponse> 經過編碼以后的XML數據如下: <cas:serviceResponse xmlns:cas='http://www.yale.edu/tp/cas'> <cas:authenticationSuccess> <cas:user>U003</cas:user> <cas:attributes> <cas:pwd>1111</cas:pwd> <cas:username>%E5%BC%A0%E4%B8%89</cas:username> </cas:attributes> </cas:authenticationSuccess> </cas:serviceResponse> 可見,對中文進行了UTF-8編碼。 在客戶端使用URLDecoder進行解碼: 以下: <% Assertion assertion = AssertionHolder.getAssertion(); AttributePrincipal ap = assertion.getPrincipal(); String id = ap.getName(); Map<String,Object> att = ap.getAttributes(); out.print("<br/>"+id); out.print("<br/>"+att); String name = URLDecoder.decode(""+att.get("username"), "UTF-8"); out.println("<br/>"+name); %>