CAS单点登陆,中文用户名无法验证解决方案

登陆名如果用中文的话,会出现乱码,导致无法验证通过。解决中文问题无非就是编码问题,其中需要转换编码的有以下几个地方.

第一,在Web.xml文件里加上Filter,对所有页面进行一次编码转换.

 1<filter>
 2        <description>EncodingFilter</description>
 3        <filter-name>EncodingFilter</filter-name>
 4        <filter-class>com.xyb.EncodingFilter</filter-class>
 5        <init-param>
 6            <description>encoding_charset</description>
 7            <param-name>encoding</param-name>
 8            <param-value>gb2312</param-value>
 9        </init-param>
10        <init-param>
11            <param-name>ignore</param-name>
12            <param-value>true</param-value>
13        </init-param>
14</filter>
15<filter-mapping>
16        <filter-name>EncodingFilter</filter-name>
17        <url-pattern>/*</url-pattern>
18</filter-mapping>

下面是EncodingFilter类:

 1package com.xyb;
 2
 3import java.io.IOException;
 4
 5import javax.servlet.Filter;
 6import javax.servlet.FilterChain;
 7import javax.servlet.FilterConfig;
 8import javax.servlet.ServletException;
 9import javax.servlet.ServletRequest;
10import javax.servlet.ServletResponse;
11
12/**
13*
14@author XiangYabin
15*/

16public class EncodingFilter implements Filter {
17    
18    protected String encoding = null;
19    protected FilterConfig filterConfig = null;
20    protected boolean ignore = true;
21    
22    public void destroy() {
23        
24        this.encoding = null;
25        this.filterConfig = null;
26        
27    }

28    
29    public void doFilter(ServletRequest request, ServletResponse response,
30            FilterChain chain)
31            throws IOException, ServletException {
32// Conditionally select and set the character encoding to be used
33        if (ignore || (request.getCharacterEncoding() == null)) {
34            String encoding = selectEncoding(request);
35            if (encoding != null)
36                request.setCharacterEncoding(encoding);
37        }

38        
39// Pass control on to the next filter
40        chain.doFilter(request, response);
41        
42    }

43    
44    public void init(FilterConfig filterConfig) throws ServletException {
45        
46        this.filterConfig = filterConfig;
47        this.encoding = filterConfig.getInitParameter("encoding");
48        String value = filterConfig.getInitParameter("ignore");
49        if (value == null)
50            this.ignore = true;
51        else if (value.equalsIgnoreCase("true"))
52            this.ignore = true;
53        else if (value.equalsIgnoreCase("yes"))
54            this.ignore = true;
55        else
56            this.ignore = false;
57        
58    }

59    
60    protected String selectEncoding(ServletRequest request) {
61        
62        return (this.encoding);
63        
64    }

65    
66}

第二步,修改CAS登陆验证页面的编码,如果你没换过这个主题的话,默认的是修改WEB-INF\view\jsp\default\ui\casLoginView.jsp文件,在最上面加上<%@ page pageEncoding="gb2312"%>。这里要特别注意一下,这个页面的编码要和上面XML文件里写的编码一致。

第三步,修改验证成功后做跳转的页面。也就是WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp文件,在最上面加上<%@ page pageEncoding="UTF-8"%>。这里特别注意的是这个页面的编码要和你跳转过去的那个页面的编码一致,换句话说,客户端的验证页面的编码要和这个地方的一致,不一致的话,要转换一下。

经过这三步之后,理论上讲就已经可以验证通过了。



眼镜蛇

posted on 2009-07-12 13:02 眼镜蛇 阅读(2812) 评论(1)  编辑  收藏 所属分类: JavaLiferaySSO

评论

# re: CAS单点登陆,中文用户名无法验证解决方案[未登录] 2011-07-21 14:27 nieyong

感觉很罗嗦的。
CAS默认是UTF-8编码,可以不添加Filter,原CAS页面也可以保持不变。
唯一需要变化的是
WEB-INF\view\jsp\protocol\2.0\casServiceValidationSuccess.jsp需要和跳转过去的那个页面的编码一致。
添加:pageEncoding="UTF-8" 或 pageEncoding="GBK" 根据实际情况而定。
  回复  更多评论   


只有注册用户登录后才能发表评论。


网站导航:
 
<2011年7月>
262728293012
3456789
10111213141516
17181920212223
24252627282930
31123456

导航

统计

常用链接

留言簿(6)

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜