`

Tapestry 4下扩展Yale CAS Java client filter

阅读更多
Tapestry 4下扩展Yale CAS Java client filter
 
最近在研究Yale CAS,因为其Java客户端采用Filter来实现单点登录SSO(其他客户端像ASP,PHP应该也类似),以便当过滤器匹配到受保护的URL时,若发现用户没有登录,就重定向到登录中心进行登录。在Tapestry 4中以及Tapestry 3中,URL的层级结构都需要配置层级式的页面逻辑名、如admin/editPerson.page,Tapestry 5默认出现了层级结构,但还没到版本发布的时候,在此就Tapestry 4应用,通过一种变相的形式实现其SSO过滤器,主要应用于先前没有配置好层级结构的页面逻辑名且重构页面逻辑名较难的应用。
 
环境:cas-server-3.0.7-rc2 cas-client-java-2.1.1 Tapestry 4   Tomcat 5.0.28
 
第一步:扩展org.apache.tapestry.ApplicationServlet。
 
java 代码
  1. package com.demo.sso;   
  2.   
  3. import javax.servlet.ServletConfig;   
  4. import javax.servlet.ServletException;   
  5.   
  6. import org.apache.tapestry.ApplicationServlet;   
  7.   
  8. /**  
  9.  * 功能描述: 重载初始化函数,保存Tapestry4注册类对象的key到全局application对象中  
  10.  *    
  11.  * @author iroyce Created on d2007-4-29w  
  12.  */  
  13.   
  14. public class SSOApplicationServlet extends ApplicationServlet {   
  15.        
  16.     private static final long serialVersionUID = -1234455546455555444L;   
  17.        
  18.     /** Tapestry4注册类(RegistryImpl)对象、也就是infrastructure, 其在application map变量里的key前缀*/  
  19.     private static final String REGISTRY_KEY_PREFIX = "org.apache.tapestry.Registry:";   
  20.        
  21.     /** Tapestry4注册类(RegistryImpl)对象key*/  
  22.     public static String REGISTRY_KEY = null;   
  23.        
  24.     public void init(ServletConfig config) throws ServletException {   
  25.         super.init(config);   
  26.   
  27.         String name = config.getServletName();   
  28.            
  29.         REGISTRY_KEY = REGISTRY_KEY_PREFIX + name;   
  30.            
  31.     }   
  32.   
  33. }  
 
第二步:扩展cas-client-java-2.1.1中的edu.yale.its.tp.cas.client.filter.CASFilter。
 
 
java 代码
  1. package com.demo.sso;   
  2.   
  3. import java.io.IOException;   
  4. import java.util.StringTokenizer;   
  5.   
  6. import javax.servlet.FilterChain;   
  7. import javax.servlet.FilterConfig;   
  8. import javax.servlet.ServletException;   
  9. import javax.servlet.ServletRequest;   
  10. import javax.servlet.ServletResponse;   
  11. import javax.servlet.http.HttpServletRequest;   
  12.   
  13. import org.apache.hivemind.impl.RegistryImpl;   
  14. import org.apache.tapestry.services.ApplicationGlobals;   
  15. import org.apache.tapestry.services.ServiceConstants;   
  16. import org.apache.tapestry.spec.IApplicationSpecification;   
  17.   
  18. import edu.yale.its.tp.cas.client.filter.CASFilter;   
  19.   
  20. /**  
  21.  * 功能描述: CAS java client在Tapestry 4 下的扩展   
  22.  *   
  23.  * @author iroyce Created on d2007-4-30  
  24.  */  
  25.   
  26. public class MyCASFilter extends CASFilter {   
  27.        
  28.     /** 受保护的路径配置名,其值以空格或换行作为间隔*/  
  29.     public final static String FILTERED_PATHS_INIT_PARAM = "com.demo.sso.filteredPaths";   
  30.        
  31.     /** 受保护的路径*/  
  32.     private String filteredPaths = null;   
  33.        
  34.     /** Tapetry应用的配置*/  
  35.     private static IApplicationSpecification spec = null;   
  36.   
  37.     public void init(FilterConfig config) throws ServletException {   
  38.         super.init(config);   
  39.         //配置受保护的路径   
  40.         this.filteredPaths = config.getInitParameter(FILTERED_PATHS_INIT_PARAM);   
  41.     }   
  42.   
  43.        
  44.     public void doFilter(ServletRequest request, ServletResponse response,   
  45.             FilterChain fc) throws ServletException, IOException {   
  46.   
  47.         if (!(request instanceof HttpServletRequest))   
  48.             throw new ServletException("CASFilter protects only HTTP resources");   
  49.   
  50.         HttpServletRequest hsr = (HttpServletRequest) request;   
  51.   
  52.         if (hsr.getSession() == null) {   
  53.             fc.doFilter(request, response);   
  54.             return;   
  55.         }   
  56.            
  57.         //得到Tapestry的页面配置   
  58.         if(spec==null){   
  59.             RegistryImpl _registry = (RegistryImpl) hsr.getSession().getServletContext().getAttribute(   
  60.                             SSOApplicationServlet.REGISTRY_KEY);   
  61.        
  62.             ApplicationGlobals _globals = (ApplicationGlobals) _registry.getService(   
  63.                     "tapestry.globals.ApplicationGlobals", ApplicationGlobals.class);   
  64.        
  65.             this.spec = _globals.getSpecification();   
  66.         }   
  67.            
  68.         //得到当前请求的页面名并判断是否是受保护的资源   
  69.         if (spec != null) {   
  70.             String pageName = hsr.getParameter(ServiceConstants.PAGE);   
  71.             if(pageName==null){   
  72.                 String url = hsr.getRequestURI();   
  73.                 int start = url.lastIndexOf('/');   
  74.                 int end = url.lastIndexOf('.');   
  75.                 pageName = url.substring(start+1, end);   
  76.                 if(pageName==null)   
  77.                     pageName = "Home";   
  78.             }   
  79.             String pagePath = spec.getPageSpecificationPath(pageName);   
  80.                
  81.             StringTokenizer filteredPaths = new StringTokenizer(this.filteredPaths);   
  82.             boolean isFilter = false;   
  83.             while(filteredPaths.hasMoreTokens()){   
  84.                 String filteredPath = filteredPaths.nextToken();   
  85.                 if(pagePath.indexOf(filteredPath)!=-1){   
  86.                     isFilter = true;   
  87.                     break;   
  88.                 }   
  89.             }   
  90.                
  91.             //如果当前不是在拦截的目录之内   
  92.             if(!isFilter){   
  93.                 fc.doFilter(request, response);   
  94.                 return;   
  95.             }   
  96.                    
  97.         }   
  98.         //进入CAS client的SSO过程   
  99.         super.doFilter(request, response, fc);   
  100.     }   
  101. }  
 

第三步:修改WEB-INF/web.xml配置。

xml 代码
  1. <filter>  
  2.         <filter-name>redirectfilter-name>  
  3.         <filter-class>org.apache.tapestry.RedirectFilterfilter-class>  
  4.     filter>  
  5.     <filter-mapping>  
  6.         <filter-name>redirectfilter-name>  
  7.         <url-pattern>/url-pattern>  
  8.     filter-mapping>  
  9.        
  10.     <filter>    
  11.         <filter-name>CASFilterfilter-name>    
  12.             <filter-class>com.demo.sso.MyCASFilterfilter-class>    
  13.         <init-param>    
  14.             <param-name>edu.yale.its.tp.cas.client.filter.loginUrlparam-name>    
  15.             <param-value>https://www.royce.com:8443/cas/loginparam-value>    
  16.         init-param>    
  17.   
  18.         <init-param>    
  19.             <param-name>edu.yale.its.tp.cas.client.filter.validateUrlparam-name>    
  20.             <param-value>https://www.royce.com:8443/cas/proxyValidateparam-value>    
  21.         init-param>    
  22.   
  23.         <init-param>            
  24.             <param-name>edu.yale.its.tp.cas.client.filter.serverNameparam-name>    
  25.             <param-value>127.0.0.1:8080param-value>    
  26.         init-param>  
  27.            
  28.          <init-param>            
  29.             <param-name>com.demo.sso.filteredPathsparam-name>    
  30.             <param-value>  
  31.                     admin/   
  32.                     pageadvisor/   
  33.             param-value>    
  34.         init-param>     
  35.     filter>    
  36.        
  37.   
  38.     <filter-mapping>    
  39.         <filter-name>CASFilterfilter-name>    
  40.         <url-pattern>/*url-pattern>    
  41.     filter-mapping>     
  42.   
  43.   
  44.     <servlet>  
  45.         <servlet-name>tshservlet-name>  
  46.         <servlet-class>com.demo.sso.SSOApplicationServletservlet-class>  
  47.         <load-on-startup>0load-on-startup>  
  48.     servlet>  
  49.     <servlet-mapping>  
  50.         <servlet-name>tshservlet-name>  
  51.         <url-pattern>/appurl-pattern>  
  52.     servlet-mapping>    
  53.     <servlet-mapping>  
  54.         <servlet-name>tshservlet-name>  
  55.         <url-pattern>*.pageurl-pattern>  
  56.     servlet-mapping>  
分享到:
评论
2 楼 iRoyce 2007-05-01  
Very Sorry! 确实有, 看来本例只能用到页面逻辑名没有配置层级结构的系统了!!
1 楼 dengyin2000 2007-05-01  
TAPESTRY4中怎么没有层级结构。admin/editPerson.page

tapestry4中是有的。

相关推荐

    Tapestry简单入门.rar_java Tapestry_tapestry

    Tapestry是一款强大的Java Web应用程序框架,由Apache软件基金会维护,它提供了一种基于组件的模型来构建动态、数据驱动的Web应用。本教程将帮助初学者了解Tapestry的基本概念,带你逐步入门并掌握其核心组件的使用...

    Tapestry4开发指南

    【Tapestry4开发指南】 Tapestry4是一款基于...随着对Tapestry4的深入学习,你会发现它在构建复杂、高性能的Web应用时的强大潜力,同时,Hivemind的集成使你能够灵活地调整和扩展框架的功能,以满足特定的业务需求。

    tapestry4开发指南

    《Tapestry 4开发指南》是一本专为初学者设计的书籍,旨在帮助读者深入理解和熟练运用Tapestry 4这一强大的Java Web框架。Tapestry 4是一款开源的、基于组件的Web应用程序框架,它允许开发者用更加面向对象的方式来...

    Tapestry 4 官方文档中版本

    "Tapestry4 Users Guide" 和 "Tapestry4 Quick Start" 这两份文档,分别提供了全面的用户指南和快速入门教程,帮助开发者了解和掌握Tapestry 4的使用方法和最佳实践。 10. **社区支持**: 作为Apache项目的一部分...

    tapestry4和5学习资料

    Tapestry是一个强大的Java Web应用程序框架,由Apache软件基金会维护。它主要专注于提供组件化、模块化的开发方式,以及高度的可维护性和可扩展性。本压缩包包含了一系列的学习资源,帮助开发者深入理解和掌握...

    深入浅出Tapestry4一书源代码(2)

    Tapestry4是Apache软件基金会开发的一个开源Web应用程序框架,它以组件化和事件驱动的方式,极大地简化了Java Web应用的开发。本章节我们将通过分析书中提供的源代码,进一步探讨Tapestry4的核心概念、工作原理以及...

    Tapestry4开发指南.rar

    《Tapestry4开发指南》是一份针对Tapestry 4框架的详尽教程,旨在帮助开发者深入理解和熟练运用这一强大的Web应用开发工具。Tapestry是一个开源的Java框架,由Apache软件基金会维护,它提供了组件化、MVC模式以及...

    深入浅出Tapestry4一书源代码(1)

    Tapestry4是一个古老的Java Web开发框架,由Apache软件基金会维护。这个框架以其组件化、声明式编程和高度可扩展性著称,旨在简化Web应用的构建过程。"深入浅出Tapestry4一书"的源代码是作者为了帮助读者更直观地...

    Tapestry4的入门资料

    Tapestry4是一款基于Java的Web应用程序框架,它在2000年代初期非常流行,由Apache软件基金会维护。这个框架的主要目标是提供一种高效、易于理解和使用的工具,用于构建动态、数据驱动的Web应用。以下是一些关于...

    Tapestry4书中例子(水果商店)

    Tapestry4是一个早期的Java Web应用程序框架,它提供了一种强大的方式来构建动态、数据驱动的Web应用。这个框架的核心理念是组件化,允许开发者将UI逻辑分解为可重用的、独立的部分。在“水果商店”例子中,我们将...

    tapestry官方中文文档

    虽然Tapestry 4的中文文档较少,但提供的《Tapestry4 用户指南》和《Tapestry4 快速启动》是宝贵的参考资料。它们将帮助初学者理解Tapestry的基本概念、组件使用、事件处理等方面的知识。 总的来说,Tapestry 4是...

    tapestry4 深入浅出 水果店实例

    Tapestry4 是一个早期的Java Web 应用框架,它提供了一种声明式的方式来构建动态、交互式的Web应用。在这个实例中,我们将探讨如何使用Tapestry4来实现一个简单的水果店应用。首先,我们需要了解Tapestry4的核心概念...

    tapestry4+spring+hibernate整合实例

    Tapestry4、Spring 和 Hibernate 是三个在Java Web开发中至关重要的框架。Tapestry4 是一个MVC(Model-View-Controller)框架,提供了一种声明式编程模型,使得开发者可以更专注于业务逻辑,而不是页面的组装。...

    Tapestry开发指南

    Tapestry是一个开源的基于servlet的应用程序框架,它使用组件对象模型来创建动态的,交互的web应用。一个组件就是任意一个带有jwcid属性的html标记。其中jwc的意思是Java Web Component。Tapestry使得java代码与html...

Global site tag (gtag.js) - Google Analytics