Jetspeed2学习笔记

1、 Jetspeed系统的配置文件在《JetSpeed2 home》\conf\Catalina\localhost下的jetspeed.xml文件中,此文件中定义了JAAS验证的配置及数据库连接模式(包括连接语句)
2、配置一个居于IFrame的应用:

1、 引入jar包:jetspeed-components-2.0.jar
jetspeed-rewriter-2.0.jar
jetspeed-web-content-2.0.jar
portals-bridges-velocity-1.0.jar
portals-gems-2.0.jar
(注:可以使用demo应用的lib)

2、 在portal.xml文件中配置一个portlet:

EchoIframe
lixin IFrame Portlet
Prototype of the IFRAME2 portlet
org.apache.jetspeed.portlet.IFrameGenericPortlet
-1

text/html
VIEW


SRC
http://www.sohu.com


HEIGHT
600


WIDTH
100%


MAX-HEIGHT
800


MAX-WIDTH
100%


SCROLLING
AUTO


en
zh

搜狐网
搜狐网
iframe,frame,frame2,iframe2


3、 配置对应的.psml文件,如下:


3、
jetspeed2的登陆权限验证完全居于JAAS,其配置文件是在jetspeed应用lib库中的jetspeed-security-.jar中的login.conf文件中定义的,如果想替换成自己的验证模式,可以修改此配置文件,如下:
Jetspeed {
org.apache.jetspeed.security.impl.DefaultLoginModule required;
};


请注意,自己加的login.conf配置文件可以放在WEB-INF/classes目录下的任何位置,并且修改WEB-INF/assembly目录下的security-providers.xml文件相应的login.conf文件的新位置。
4、
JAAS的subject主要用来表示一个应用主体对象(用户),此对象有一个或多个用来标识其身份的Principals,如名字(name principal)或者身份证号(SSN principal),principal是用来唯一标识此subject,以区别于其他的subject的。原文如下:
To authorize access to resources, applications first need to authenticate
the source of the request. The JAAS framework defines the term subject
to represent the source of a request. A subject may be any entity, such
as a person or a service. Once the subject is authenticated, a
javax.security.auth.Subject is populated with associated identities, or
Principals. A Subject may have many Principals. For example, a person may
have a name Principal ('John Doe') and a SSN Principal ('123-45-6789'),
which distinguish it from other subjects.

6、
一个Subject也许会与一个AccessControlContext联系在一起,可以通过如下方法返回一个与AccessControlContext联系在一起的subject:
public static Subject getSubject(final AccessControlContext acc);

7、
一个特定的Subject通过doAs方法来执行一个特定的操作(Action),原文如下:
The following static methods may be called to perform an action as a
particular Subject:

public static Object
doAs(final Subject subject,
final java.security.PrivilegedAction action);

public static Object
doAs(final Subject subject,
final java.security.PrivilegedExceptionAction action)
throws java.security.PrivilegedActionException;
};


8、
一个演示第一个doAs方法的例子:
假设有个用户叫Bob,他已经通过了LoginContext的(登陆)验证,随后,一个拥有com.ibm.security.Principal标识的subject产生了,这个Principal被命名为“Bob”。同时假设SecurityManager已经安装,并且访问策略文件(PolicyFile)存在,并定义如下:


// 授予 'BOB'访问(读)文件 'foo.txt'的许可
grant Principal com.ibm.security.Principal 'BOB' {
permission java.io.FilePermission 'foo.txt', 'read';
};
以下是本应用的代码:
class ExampleAction implements java.security.PrivilegedAction {
public Object run() {
java.io.File f = new java.io.File('foo.txt');
// 以下代码将会触发一个安全检测(通过Policy)
if (f.exists()) {
System.out.println('File foo.txt exists');
}
return null;
}
}
public class Example1 {
public static void main(String args) {
// 验证并鉴别用户 'BOB',这个过程在LoginContext那章中有描述
Subject bob;
// 在验证阶段,将bob与此Subject相关联
// 以'BOB'的身份执行'ExampleAction'
Subject.doAs(bob, new ExampleAction());
}
}

在执行过程中,ExampleAction在调用 f.exists() 时将遭遇一个安全检测。由于执行ExampleAction的是BOB,而在策略(Policy)文件中,已经赋予了Bob有此操作的相关权限,ExampleAction将通过安全检测。如果策略被改变的话,一个SecurityException的错误将被抛出。

9、
Principals用于描述Subject的身份,其必须继承java.security.Principal 和java.io.Serializable 接口

10、
LoginContext提供了4中构造器,如下:

public LoginContext(String name) throws LoginException;
public LoginContext(String name, Subject subject) throws
LoginException;
public LoginContext(String name, CallbackHandler callbackHandler)
throws LoginException
public LoginContext(String name, Subject subject,
CallbackHandler callbackHandler) throws LoginException

它们都统一有个参数name,这个参数指定了验证所使用的LoginModul

Jaas配置文件如下:
WorkDesk {
net.joinwork.bpm.workdesk.LoginModule required;
};

// 用LoginContext 实例化一个新的Subject
LoginContext lc = new LoginContext('WorkDesk');
try {
// 验证这个Subject
lc.login();
System.out.println('验证成功!');
// 获得被验证成功的Subject
Subject subject = lc.getSubject();
...
// 办完事 – 退出
lc.logout();
} catch (LoginException le) {
System.err.println('authentication unsuccessful: ' +le.getMessage());
}


10、
要配置如下图所示的区域,可以编辑pages目录下的:“folder.metadata”文件,这个文件控制区域的内容
http://b30.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef9704ea706b75d6a23d4f8b23a3b7a6e2761d0cb2b957611531149ba295af42134a2e0a7e0312477c2c41eda76f267152357548cca10346e2168180c7f19626878beaec597&a=30&b=30
11、
Portlet规范明确定义了Portlet应用如何使用“用户属性”,首先,必须在protlet.xml文件中定义属性如下:


User Given Name
user.name.given


User Last Name
user.name.family


User eMail
user.home-info.online.email

...

一旦属性如上定义,当前的portlet就可以利用PortletRequest 中定义的USER_INFO常量来从登陆用户处以无法更改的Map数据格式来获得当前的值,代码如下:
Map userInfo = (Map)request.getAttribute(PortletRequest.USER_INFO);
String givenName = (userInfo!=null)? (String)userInfo.get('user.name.given') : '';
String lastName = (userInfo!=null) ? (String)userInfo.get('user.name.family') : '';
String email = (userInfo!=null) ? (String)userInfo.get('user.home-info.online.email') : '';
12、Portlet对动作的处理过程

在一个标准的Web应用程序中,一个HTML表单提交将导致执行一些业务逻辑。业务处理的结果,要么作为属性而被设置在请求或会话中并转发,要么包含到下一个JSP。
  在一个JSR 168 portlet中,一个HTML表单的动作URL应该是什么样呢?JSR 168定义了一个JSP标签库,称为portlet taglib。HTML表单的动作URL可以使用actionURL portlet标签生成。例如(请参考favoriteColorEdit.jsp文件):

...

提交该HTML表单将会导致调用portlet的processAction(ActionRequest aRequest, ActionResponse aResponse)方法。像通常一样,可以通过调用request对象的getParameter()方法来获得表单参数。注意:通过提交表单调用动 作,但portlet中却没有processAction()方法,将会导致javax.portlet.PortletException。
  processAction()方法设置response对象中的值。不要使用ActionRequest或ActionResponse对象的 setAttribute()方法。值不会从processAction()传递到render()方法,而且在JSP中是不可用的。相反要使用 ActionResponse对象的setRenderParameter()方法。这些render参数将对所有后续render请求可用,这一点与典型的Web应用程序请求属性很不相同。典型的Web application请求属性只对于一个请求可用。另一方面,render请求参数对于许多后续render请求可用。render参数保持可用直到值 被动作的重新执行显式地修改或删除。
  考虑portlet FavoriteColor。它在VIEW模式显示了一个用户偏好的颜色,但是可以在EDIT模式下更改。在EDIT模式下提交偏好的颜色选择将调用 processAction()方法。该方法获得偏好的颜色请求参数,并将其设置为render参数。这样,偏好的的颜色render参数将在所有后续 render请求中都可用。
  所呈现的参数是怎样显示在JSP上的呢?应使用来自portlet标签库的defineObjects标签来定义portlet对象。该标签使renderRequest、renderResponse和portletConfig portlet对象在页面中可用。参数通过调用renderRequest对象的getParameter()方法来显示。请参考与所包含的源代码示例中的favoriteColorView.jsp。
  portlet FavoriteColor也展示了其他概念。第一个是如何在processAction()方法中用编程的方法改变portlet模式。调用 ActionResponse对象的setPortletMode()方法来修改portlet模式。第二个概念是如何使用一个HTML链接来修改 portlet模式。该链接使用来自portlet标签库的renderURL标签生成。根据希望的portlet模式指定portletMode属性的 值。请参考源代码示例中的FavoriteColorPortlet类和favoriteColorView.jsp页面。

13、portlet中对预先配置参数的读取
在portlet的开发中,可以在portlet.xml文件中预先配置相关的参数,然后在代码中通过PortletConfig来进行读取,具体示例如下:
a、 在portlet.xml文件中添加如下配置片断,添加一个参数:
portlet.xml:

jspView
/jsp/view.jsp


b、 在portlet程序中如下读取其配置:
SimplePortlet.java:
String jspName = this.getPortletConfig().getInitParameter('jspView');

14、 Portlet标签库

a、 定义对象(defineObjects)标签:
如果打开其中的一个JSP文件,你会发现,和Servlet一样,JSP中可以使用Portlet的一些variables.例如:
renderResponse
renderRequest
portletConfig--------可以用此变量获得portlet.xml文件中的配置信息
但是必须声名:
其中不可以定义任何属性或者包含任何内容.


b、 动作URL(actionURL )标签:

属性 值类型 对应值
windowState String minimized, normal, maximized
portletMode String view, edit, help
var String 任何值
secure String true,false


以上创建一个action URL , 当访问它时将使portlet window变为normal 装态, 模式变为 edit。
可以通过如下代码在processAction中判断当前操作模式:
public void processAction(ActionRequest request, ActionResponse response)
throws PortletException, IOException {
if (request.getPortletMode() == PortletMode.VIEW) { //浏览页
…..
}else if(request.getPortletMode() == PortletMode.EDIT){ //编辑状态
…..
}else if(request.getPortletMode() == PortletMode.HELP){ //帮助状态
…..
}


c、 renderURL 标签:
属性 值类型 对应值
windowState String minimized,normal,maximized
portletMode String view, edit, help
var String 任何值
secure String true,false


创建一个render URL , 当访问它时将使portlet window变为maximized装态, 模式变为 view.

d、 namespace Tag
为目前的Portlet产生一个唯一的Value. 防止和其他的Portlet 或者Portal页面上的value产生冲突.
doFoo()”>Foo

e、 param Tag:這個 tag 是定義一個參數值, 可能是放在 actionURL 或 renderURL 之中. param Tag 不准包含任何 Body Content.
属性 值类型
name String

注: param Tag不可以有body content.

15、portlet缓存
控制portlet是否被缓存,及缓存的时间可以在portlet.xml文件中用如下标签:
0

16、 Portal管理
研究portal管理中的【portlet应用生命周期管理】,可以发现,这个portlet是一个普通的GenericServletPortlet,其通过以下代码来获得一些系统的管理器:
PortletContext context = getPortletContext();
//注册管理器
registry = (PortletRegistry)context.getAttribute(CommonPortletServices.CPS_REGISTRY_COMPO
NENT);
//portlet工厂管理器
portletFactory = (PortletFactory)context.getAttribute(CommonPortletServices.CPS_PORTLET_FAC
TORY_COMPONENT);
//部署管理器
dm = (DeploymentManager)context.getAttribute(CommonPortletServices.CPS_DEPLOYMENT_
MANAGER_COMPONENT);
asm = (ApplicationServerManager)context.getAttribute(CommonPortletServices.CPS_APPLICATION_ SERVER_MANAGER_COMPONENT);
//应用服务管理器
if (null == registry) {
throw new PortletException('Failed to find the Portlet Registry on portlet initialization');
}
if (null == portletFactory) {
throw new PortletException('Failed to find the Portlet Factory on portlet initialization');
}
//服务管理器是否可用,决定于【应用管理器】是否可用
serverManagerAvailable = (asm != null && asm.isConnected());
其应用是在j2-admin应用的包:org.apache.jetspeed.portlets.palm中,牵涉到对portal应用的管理,可以参考一下它。

16、 Portal中跨域的session管理用的是PortletMessaging
可以参考SSO管理中对PortletMessaging的使用:

//接收
String realm = (String)PortletMessaging.receive(request, 'site', 'realm');
//
StatusMessage msg = (StatusMessage)PortletMessaging.consume(request, 'SSOBrowser', 'status');
//发布
PortletMessaging.publish(request, 'site', 'selectedUrl', selectedSite);
//销毁
PortletMessaging.cancel(request, 'site', 'selected');

16、 Jetspeed应用中的WEB-INF/jetspeed_macros.vm中包含了所有可以使用的宏



17、Jetspeed-layout部署的一些说明:
1、 是最早被部署的portlet应用,控制了整个的布局、装饰管理。
2、 其不是被部署为一个单独的应用,而是被部署到“WEB-INF\apps”目录下了,原因不明。
3、 autodeployment.staging.dir :部署的监听路径
4、 autodeployment.target.dir:部署的目标路径

18、Jetspeed部署配置文件:WEB-INF/conf/jetspeed.properties
这个配置文件定义了jetspeed部署服务器的所有规则 ,包括部署用户名和密码(修改它可以解决默认安装部署失败的问题-和tomcat保存一致),默认的装饰(tigris),默认编码格式,默认页面(page)的布局,管理员的电子邮件配置,默认用户等等

19、Jetspeed部署及其部署管理器:
它被作为Jetspeed的一个子项目来单独开发,其项目路径为:
http://portals.apache.org/jetspeed-2/multiproject/jetspeed-deploy-tools/deploy-tools.html
JetspeedDeploy and the DeploymentManager
JetspeedDeploy负责Jetspeed-2中portlet应用程序的管理. 当一个新的portlet应用被注册时,
the DeployPortletAppEventListener invokes JetspeedDeploy to prepare the portlet application for deployment.
new JetspeedDeploy(event.getPath(), toFile.getAbsolutePath(), stripLoggers);
JetspeedDeploy copies the web application archives (.war) from the input directory to the output directory and parses the web.xml, portlet.xml, and context.xml to ensure their compliance with the Jetspeed-2 portal engine.
http://b27.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef94800cf50ec19368357752807e5078d7547c211a1747bfd2be83516527484c85c591069e508e8091ec376477425426e8b207196159048661e7337416f8f55c38f400f18fc&a=27&b=27
JetspeedDeploy invokes the JetspeedWebApplicationRewriter to infuse the web.xml with the JetspeedContainer servlet if it does not already exist:

JetspeedContainer
Jetspeed Container
MVC Servlet for Jetspeed Portlet Applications
org.apache.jetspeed.container.JetspeedContainerServlet

contextName
${portlet-application-name}

0
...
JetspeedContainer
/container/*

In the same fashion, the JetspeedDeploy invokes the JetspeedContextRewriter to manipulate a portlet application context.xml file. For more information about Tomcat context.xml, see tomcat's documentation.
JetspeedDeploy Standalone Usage
JetspeedDeploy也可以通过命令行来单独调用:
java -jar jetspeed-deploy-tools-.jar -s inputWarPath outputWarPath
说明:
-s: flag indicating whether or not to strip to loggers from the application. When the flag is present, the loggers available in the application will be removed.
inputWarPath: the path of the war to process.
outputWarPath: the path of the processed war.
其工作模式描述如下,居于线程:
http://b27.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef9578831b263d0572e92f1a0e8b84cddc56ecc32cad462e8ea924a8075db194c1545e330fdd901ef31c9249dc84f99e742a5972d449346afba89add661203dfbe2ebccf588&a=30&b=27

19、Jetspeed应用框架详解:
jetspeed使用spring来作为它的缺省组件框架,但是,jetspeed的体系架构使得它可以很容易替换其组件管理框架,其控制是在JetspeedServlet中,其类图如下:
http://b26.photo.store.qq.com/http_imgload.cgi?/rurl4_b=028e36a9c914db0d3e3c5908bbcdaef9fe02cdc5dbffc58c96995aaa6d20e910e583e3ea6424df4283967fdf844c83a612ea8d2b43e9806e9028c0879b34e9536873ec5ff4b88d3cec3377f3e72334886c5752d6&a=26&b=26
在JetspeedServlet初始化启动时,在其init()方法中,有如下调用引擎的代码:
engine = new JetspeedEngine(properties, applicationRoot, config, initializeComponentManager(config, applicationRoot, properties));Jetspeed.setEngine(engine);engine.start();
其中的initializeComponentManager方法加载组件管理(assembly)框架,要改用其他额IoC框架的话,需要修改此函数。
以下就是initializeComponentManager方法的代码:
ServletConfigFactoryBean.setServletConfig(servletConfig);
// String relativeApplicationRoot = getRealPath('/');
String relativeApplicationRoot = appRoot;
String absApplicationRoot = new File(relativeApplicationRoot).getCanonicalPath();
final String assemblyDir = configuration.getString('assembly.dir','/WEB-INF/assembly');
final String assemblyFileExtension = configuration.getString('assembly.extension','.xml');
String bootConfigs = new String {'/WEB-INF/assembly/boot/*.xml'};
String appConfigs = new String {assemblyDir+'/*'+assemblyFileExtension};
ServletContext servletContext = servletConfig.getServletContext();
SpringComponentManager cm = new SpringComponentManager(bootConfigs, appConfigs, servletContext, appRoot);
return cm;
从以上代码可以看出:
1、 Spring框架的所有应用配置文件都放在了/WEB-INF/assembly目录下。
2、 初始配置文件放在了/WEB-INF/assembly/boot/目录下,这个目录下目前只有一个文件 ――datasource.xml,记录了ojb数据库的连接基本配置,如果要修改数据库的连接配置,可以修改它,这种情况一般发生在应用服务器要从Tomcat迁移到别的J2EE服务器时。
3、 在JetspeedServlet启动的时候,收集assembly目录下的所有Spring配置文件,传递给Spring作初始加载。

20、数据库连接模式修改:
Jetspeed目前数据库的连接配置信息写在了catalina/jetspeed.xml配置文件中了,以Resource标签的模式来作为一个资源而定义。这中模式不是很通用,在weblogic中我就不知道改如何修改了。但是,可以通过另外一种方法来修改数据库的配置模式:
在/WEB-INF/assembly/boot/目录下的datasource.xml文件中,我们将前面居于Context上下文的加载模式注释掉,如下 所示:


java:comp/env/jdbc/jetspeed


将其下面的居于“common DBCP Pooled datasource”模式的连接模式放开,如下所示:


{my.drivers.class.name}


{URL to my DB}


{username}


{password}


同时修改classes目录下的OJB.properties文件(编译前在/etc/db-ojb/OJB.properties),修改里面的ConnectionFactoryClass或ConnectionManagerClass属性如下:
ConnectionFactoryClass=org.apache.ojb.broker.accesslayer.ConnectionFactoryDBCPImpl
或:
ConnectionManagerClass=org.apache.jetspeed.components.rdbms.ojb.ConnectionManagerImpl
|--------------------------à推荐这个
两个只要修改一个就可以了。
修改后,连接池不再用J2EE应用服务器提供了,而是由DBCP来负责提供。

21、用户登陆验证:
1、 form指向“/jetspeed/login/proxy”,在web.xml定义中,其被定向到“jetspeed-portal-version.jar”中的org.apache.jetspeed.login. LoginProxyServlet.java中2、 LoginProxyServlet.java中,用户名和密码被封装在session中后,重定向到“/login/redirector”,指向“org.apache.jetspeed.login.LoginRedirectorServlet.java”中。3、 在导向(触发)到/login/redirector时,由于在/conf/Catalina/jetspeed.xml中配置了居于JAASRealm的验证,并且连接在web.xml中的《security-constraint》中配置了对资源“/login/redirector”需要访问验证,所以JAAS验证被触发。

22、规范摘录:
Portlet API定义了一个 PortletURL 的接口。Portlets 必须用这个 PortletURL 物件来产生 portlet URLs。 在产生 PortletURL 的同时, PortletURL 也会呼叫 RenderResponse 接口定义的两个方法:
createActionURL 和 createRenderURL。
createActionURL 用来生成 action URLs。
createRenderURL 用来生成 render URLs。

一个render URL 是对某些特殊类型action URLS 的一种优化。 在 render portlet URL 的过程中 Portal/portlet-container 不允许调用目标 portlet 的 processAction方法。 Portal/portlet-container必须确保当在建构 render URL 时所设定的参数, 也能变成是在请求这个 portlet 时的参数。

Portlets可以通过 PortletURL 所提供的 setParameter 和 setParameters 两个方法, 对 PortletURL 物件设定一些应用程序的特殊参数。 setParameter 这个方法必须把以前所设定的同名参数给取代掉。所有 portlet 所加到 PortletURL 物件上的参数都必须为该 portlet 的可用请求参数。 Portlet 开发者必须注意到 render request 的请求参数并非在产生 PortletURL 时就被使用到。

Portlet-container不能把在 action request 得到的参数传递到后续的 render request。 假如 portlet 要这样做, 可以通过 render URL 或是在 processAction 的时候,利用 ActionResponse 物件的 setRenderParameter or serRenderParameters 方法来做。

一个 portlet 可以利用 PortletRequest 接口提供的 isWindowStateAllowed 方法来得知本身是否可以使用该 window state。


23、Jetspeed2 在WebLogic上的部署
假设BEA的根目录是${BEA},自己的建的domain叫mydomain,并且,已经把应用的端口由7001改为80了

1. 在${BEA}下新建shared/lib文件夹,把tomcat目录下的shared/lib下的五个jar包拷到新建的文件夹中:
jetspeed-api-2.0-M1.jar
jetspeed-commons-2.0-M1.jar
pluto-1.0.1-rc1.jar
portals-bridges-common-0.1.jar
portlet-api-1.0.jar

2. 把jetspeed文件夹拷到${BEA}/user_projects/domains/mydomain/applications下面。

3. 修改${BEA}/user_projects/domains/mydomain/目录下的startWeblogic.cmd 文件,添加如下的一些设置(红色的为添加的):
set SHLIB=C:\bea\shared\lib
set SHARED_PATH=%SHLIB%\jetspeed-api-2.0.jar;%SHLIB%\jetspeed-commons-2.0.jar;%SHLIB%\pluto-1.0.1.jar;%SHLIB%\portals-bridges-common-1.0.jar;%SHLIB%\portlet-api-1.0.jar;
set CLASSPATH=%SHARED_PATH%;%WEBLOGIC_CLASSPATH%;%POINTBASE_CLASSPATH%;%JAVA_HOME%\jre\lib\rt.jar;%WL_HOME%\server\lib\webservices.jar;%CLASSPATH%

并确保有如下红色这句话:(很重要哦!!)
%JAVA_HOME%\bin\java %JAVA_VM% %MEM_ARGS% %JAVA_OPTIONS% -Djava.naming.provider.url=t3://localhost:80 -Dweblogic.Name=%SERVER_NAME% -Dweblogic.ProductionModeEnabled=%PRODUCTION_MODE% -Djava.security.policy='%WL_HOME%\server\lib\weblogic.policy' weblogic.Server

4. 修改jetspeed/WEB-INF/assembly/目录下的deployment.xml(或jetspeed-spring.xml)文件,找到 class='org.apache.jetspeed.tools.pamanager.servletcontainer.TomcatManager'
init-method='start' destroy-method='stop'
> 这样的设置,把TomcatManager改成WeblogicManager,并把下面的设置删掉。

5.Setup a JDBC Connection and Pool。
Startup weblogic running the startWeblogic.cmd
Goto: http://localhost:7001/console/ and login, goto Services->JDBC->Connection Pools. Create a new pool. Create a JDBC data source named JetspeedDB based on the Connection Pool.

6.修改weblogic.xml文件如下:


/jetspeed


jdbc/jetspeed
JetspeedDB


24、Portlet中获得portlet.xml中预先绑定的参数
在portlet.xml中预先定义了如下的参数值:


TopRange
100


在portlet-class中可以通过如下代码来取得:
private long getHighRange(PortletRequest request) {
PortletPreferences prefs = request.getPreferences();
String highRangePref = prefs.getValue('TopRange', '102'); //如果找不到“TopRange”,返回默认值102
long range = Long.parseLong(highRangePref);
if (range < 2) {
range = 102;
}
return range;
}

25、设置本地语言的portlet标题
要修改portlet的decorator中的标题(主要用在本地化的过程中),必须在相应的resource资源文件中,定义如下两个变量的值:
javax.portlet.title=\u89d2\u8272\u5b89\u5168\u6027\u6d4b\u8bd5
javax.portlet.short-title=\u89d2\u8272\u5b89\u5168\u6027\u6d4b\u8bd5

26、获得用户的Subject
private Subject getSubject()
{
AccessControlContext context = AccessController.getContext();
return Subject.getSubject(context);
}

27、SSO研究
其sso,感觉也是构建Form,提交相关证书到相应的异构系统的LogonForm中。
Jetspeed2中,专门写了一个SSOIFramePortlet的portlet来专门处理单点登陆,其是由“IFrameGenericPortlet”扩展而来,里面多了一些根据SSO配置信息来构建提交username和password的form的代码,其大概意思可以用如下代码来表达:
String site = request.getPreferences().getValue('SRC', null);

context = getPortletContext();
sso = (SSOProvider)context.getAttribute('cps:SSO');

Subject subject = getSubject(); // getSubject()在26中有说明。

SSOContext context = sso.getCredentials(subject, site);
request.setAttribute(SSO_REQUEST_ATTRIBUTE_USERNAME, context.getRemotePrincipalName());
request.setAttribute(SSO_REQUEST_ATTRIBUTE_PASSWORD, context.getRemoteCredential());
………
super.doView(request, response);
具体可以好好研究一下类:org.apache.jetspeed.portlet. SSOIFramePortlet.java这个类,其在jetspeed-web-content-version.jar包中定义。
SSO的具体应用,其实只要在系统管理中配置了相应的站点后,只要定义一个居于SSOIFramePortlet的portlet页面就可以了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值