今天,在单点登录系统中,使用中文用户名登录系统时,出现了返回的用户名乱码的问题。
通过阅读cas_client源码,找到了具体的原因。
获取用户名的操作是在ticket验证的过程中,下面,我先按照流程描述一下ticket验证的过程。
首先,由于我们在客户端进行了如下配置(代码1):
<filter>
<filter-name>CAS Validation Filter</filter-name>
<filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class>
<init-param>
<param-name>casServerUrlPrefix</param-name>
<param-value>http://localhost:8080/cas</param-value><!-- cas 服务器地址 http://IP:PORT/CasWebProName -->
</init-param>
<init-param>
<param-name>serverName</param-name>
<param-value>http://localhost:8080</param-value><!-- 客户端服务器地址 http://IP:PORT -->
</init-param>
</filter>
<filter-mapping>
<filter-name>CAS Validation Filter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
所以,在登陆成功以后,将进入Cas20ProxyReceivingTicketValidationFilter类。
AbstractTicketValidationFilter继承于AbstractCasFilter类。
AbstractCasFilter的doFilter方法如下(代码2):
public final void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException
{
if (!preFilter(servletRequest, servletResponse, filterChain)) {
return;
}
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpServletResponse response = (HttpServletResponse)servletResponse;
String ticket = retrieveTicketFromRequest(request);
if (CommonUtils.isNotBlank(ticket))
{
this.logger.debug("Attempting to validate ticket: {}", ticket);
try
{
Assertion assertion = this.ticketValidator.validate(ticket, constructServiceUrl(request, response));
this.logger.debug("Successfully authenticated user: {}", assertion.getPrincipal().getName());
request.setAttribute("_const_cas_assertion_", assertion);
if (this.useSession) {
request.getSession().setAttribute("_const_cas_assertion_", assertion);
}
onSuccessfulValidation(request, response, assertion);
if (this.redirectAfterValidation)
{
this.logger.debug("Redirecting after successful ticket validation.");