读书人

单点登录错误

发布时间: 2012-10-19 16:53:35 作者: rapoo

单点登录异常、
这个异常跟之前在网上一哥们发贴一模一样、只不过没解决、
这个是之前那哥们的帖子:
http://topic.csdn.net/u/20120919/17/42a9da2c-d93c-4ad1-bc46-51e389d24649.html


我的cas service 3.5.1 client 是3.2.1

cas正常部署、在自己的项目没加web.xml的cas设置 登录是可以的

现在的问题是 cas拦截全部路径、 cas登录后跳转、 网页卡很长时间 最后报出异常、

后台也明显的给了ticket、并且要跳到那个路径、不过却异常了、

各位帮忙分析下原因、


异常:

XML code
ERROR org.jasig.cas.client.util.XmlUtils  - org.xml.sax.SAXParseException: The element type "label" must be terminated by the matching end-tag "</label>".org.xml.sax.SAXParseException: The element type "label" must be terminated by the matching end-tag "</label>".    at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)    at org.apache.xerces.util.ErrorHandlerWrapper.fatalError(Unknown Source)    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)    at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)    at org.apache.xerces.impl.XMLScanner.reportFatalError(Unknown Source)    at org.apache.xerces.impl.XMLNSDocumentScannerImpl.scanEndElement(Unknown Source)    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(Unknown Source)    at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)    at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source)    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)    at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)    at org.jasig.cas.client.util.XmlUtils.getTextForElement(XmlUtils.java:164)



然后出500错误、


XML code
java.lang.NullPointerException    at java.util.concurrent.ConcurrentHashMap.get(ConcurrentHashMap.java:768)    at org.jasig.cas.client.proxy.ProxyGrantingTicketStorageImpl.retrieve(ProxyGrantingTicketStorageImpl.java:85)    at org.jasig.cas.client.validation.Cas20ServiceTicketValidator.parseResponseFromServer(Cas20ServiceTicketValidator.java:91)    at org.jasig.cas.client.validation.AbstractUrlBasedTicketValidator.validate(AbstractUrlBasedTicketValidator.java:217)    at org.jasig.cas.client.validation.AbstractTicketValidationFilter.doFilter(AbstractTicketValidationFilter.java:169)



自己项目的web.xml中cas的配置如下:(根据一个demo的样例来设置的、没有改动其他cas文件、http://www.kafeitu.me/sso/2010/11/05/sso-cas-full-course.html )
XML code
<!-- ======================== 单点登录开始 ======================== -->        <!-- 用于单点退出,该过滤器用于实现单点登出功能,可选配置-->        <listener>                <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class>        </listener>        <!-- 该过滤器用于实现单点登出功能,可选配置。 -->        <filter>                <filter-name>CAS Single Sign Out Filter</filter-name>                <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class>        </filter>        <filter-mapping>                <filter-name>CAS Single Sign Out Filter</filter-name>                <url-pattern>/*</url-pattern>        </filter-mapping>        <!-- 该过滤器负责用户的认证工作,必须启用它 -->        <filter>                <filter-name>CASFilter</filter-name>                <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>                <init-param>                        <param-name>casServerLoginUrl</param-name>                        <param-value>https://www.boyu.cn:8443/cas/login</param-value>                        <!--这里的server是服务端的IP-->                </init-param>                <init-param>                        <param-name>serverName</param-name>                        <param-value>http://localhost:80</param-value>                </init-param>        </filter>        <filter-mapping>                <filter-name>CASFilter</filter-name>                <url-pattern>/*</url-pattern>        </filter-mapping>        <!-- 该过滤器负责对Ticket的校验工作,必须启用它 -->        <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>https://www.boyu.cn:8443/cas/login</param-value>                        <!-- https://www.boyu.cn:8443/cas -->                                        </init-param>                <init-param>                        <param-name>serverName</param-name>                        <param-value>http://localhost:80</param-value>                </init-param>        </filter>        <filter-mapping>                <filter-name>CAS Validation Filter</filter-name>                <url-pattern>/*</url-pattern>        </filter-mapping>        <!--                该过滤器负责实现HttpServletRequest请求的包裹,                比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。        -->        <filter>                <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>                <filter-class>                        org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>        </filter>        <filter-mapping>                <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>                <url-pattern>/*</url-pattern>        </filter-mapping>        <!--                该过滤器使得开发者可以通过org.jasig.cas.client.util.AssertionHolder来获取用户的登录名。                比如AssertionHolder.getAssertion().getPrincipal().getName()。        -->        <filter>                <filter-name>CAS Assertion Thread Local Filter</filter-name>                <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>        </filter>        <filter-mapping>                <filter-name>CAS Assertion Thread Local Filter</filter-name>                <url-pattern>/*</url-pattern>        </filter-mapping>                <!-- 自动根据单点登录的结果设置本系统的用户信息 -->        <filter>                <display-name>AutoSetUserAdapterFilter</display-name>                <filter-name>AutoSetUserAdapterFilter</filter-name>                <!-- 自己写的一个打印登录的name类 -->                <filter-class>com.my.framework.utils.AutoSetUserAdapterFilter</filter-class>        </filter>        <filter-mapping>                <filter-name>AutoSetUserAdapterFilter</filter-name>                <url-pattern>/*</url-pattern>        </filter-mapping>        <!-- ======================== 单点登录结束 ======================== --> 





AutoSetUserAdapterFilter 类

Java code
public class AutoSetUserAdapterFilter implements Filter {                /**         * Default constructor.          */        public AutoSetUserAdapterFilter() {        }        /**         * @see Filter#destroy()         */        public void destroy() {        }        /**         * 过滤逻辑:首先判断单点登录的账户是否已经存在本系统中,         * 如果不存在使用用户查询接口查询出用户对象并设置在Session中         * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)         */        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,                        ServletException {                            HttpServletRequest httpRequest = (HttpServletRequest) request;                                // _const_cas_assertion_是CAS中存放登录用户名的session标志                Object object = httpRequest.getSession().getAttribute("_const_cas_assertion_");                                if (object != null) {                        Assertion assertion = (Assertion) object;                        String loginName = assertion.getPrincipal().getName();                        System.out.println("cas获取的loginName为-----"+loginName);                }                chain.doFilter(request, response);        }        /**         * @see Filter#init(FilterConfig)         */        public void init(FilterConfig fConfig) throws ServletException {        }               }


[解决办法]
来100 , 敢不敢

读书人网 >J2EE开发

热点推荐