获取CAS自定义用户信息时,中文乱码解决方法

  1. 最开始我们没有设置编码之前,cas发送http请求到cas server验证ticket票据,验证通过后,会以xml形式返回自定义的用户信息,如果存在中文就会出现乱码问题,
  2. 网上查了些资料,说在web.xml中配置spring的编码转换过滤器,那纯属扯淡,没有作用,于是我查看了源码,发现cas验证ticket是通过代码发送的http请求
  3. 好,知道了问题所在,我们开始想办法怎么解决,首先我们在spring配置中查看,验证票据的类是Cas20ServiceTicketValidator,而它继承了AbstractCasProtocolUrlBasedTicketValidator,我们再看看这个父类干了什么,哦呦,我们发现有个方法retrieveResponseFromServer(URL validationUrl, String ticket),有两个参数,一个验证票据的url,一个是票据字符串,猜一猜就这个方法是做什么用的了,于是我们看了下方法的实现,发现最终调用了CommonUtils的getResponseFromServer方法,我们进去瞅一眼,发现了一个很重要的参数encoding,这个参数默认是空的,如果为空则不做编码转换,如果不为空则按照指定编码转换字节流。所以说我们配置这个编码,问题应该就能解决
    获取CAS自定义用户信息时,中文乱码解决方法
  4. 既然问题找到,我们就开始看怎么配置,继续找这个encodig在哪里,我们回到AbstractCasProtocolUrlBasedTicketValidator这个类的retrieveResponseFromServer方法,看到方法实现有一句,this.getEncoding(),我们跟踪下去发现这个属性在AbstractUrlBasedTicketValidator父类中,最后找到这个属性类,再看看Cas20ServiceTicketValidator 继承 AbstractCasProtocolUrlBasedTicketValidator,AbstractCasProtocolUrlBasedTicketValidator继承AbstractUrlBasedTicketValidator,也就是Cas20ServiceTicketValidator类可以直接配置这个encoding为UTF-8
    获取CAS自定义用户信息时,中文乱码解决方法
  5. 保证cas server中casServiceValidationSuccess.jsp文件编码为utf-8,测试发现问题解决了。
    获取CAS自定义用户信息时,中文乱码解决方法