2006 年 04 月 12日, 星期三

简单SSO实现和Portal的观感

好久没有上来说话了,最近在忙一个有关Portal的项目,这两天钻研了一些问题,记录一下。
首先是SSO的简单实现,这是现在这个项目的应时只需,本来有一个长远的完整的解决方案,但是在这个方案出台之前由于时间的限制需要有一个临时的方案出来。目的是在两个不同服务器上的应用之间实现SSO,例如从应用1的URL跳转到应用2时实现SSO。现在采用的方法是URL定位到应用1的一个jsp页面,而这个页面的form中隐藏了用户名和口令,并且这个页面的onload事件中提交form到应用2的一个servlet中,而在这个Servlet中做有关用户登录的相应操作。原来是想提交到一个jsp中,但是发现应用1的form必须是GET,这样用户名等信息都暴露了,采用POST方法获得不了用户名等信息,后来发现采用servlet接收居然可以,真是不错。
其次是WebLogic Portal的观感。Look是指skin, feel是指sketon,而Theme其实是sketon和skin中的子集,虽然在theme目录下可以定义多个theme但是必须在sketon下有相应的目录才行,如果没有即使选了theme也不没有效果,同样也必须在观感对应skin的skin.properties中要指明这个theme,否则也是无效。因为从逻辑上来说theme应该是观感的子集,但是在开发时却是可以选择任意的theme。skin中主要是一些css,js和images,而sketon中才是一些jsp,这些jsp用了netuix:render标签,可以修改这些jsp文件的内容,但是不能修改这些文件名字,因为这些名字是在weblogic portal中的一个jar包中hard coding的。至于shell,menu,layout等都在sketon的jsp中有相应的文件对应。
RobinOuyang 发表于:2006.04.12 18:28 ::分类: ( Web技术 ) ::阅读:(279次) :: 评论 (0) :: 引用 (0)

2005 年 12 月 29日, 星期四

html:link中传多个参数(转)

Struts中的html:link标签是一个很常用的标签,其功能也比较明显:生成<a href="yoururl"></a>这样的HTML代码
在刚开始接触这个标签的时候,我知道这个标签可以这样用:

=========================================================
<html:link page="/html-link.do" paramId="stringProperty" paramName="newValue">
String via paramId and paramName
</html:link>
=========================================================

这个newValue一般就是一个String类型的变量,上述的代码将生成这样的HTML代码:
<a href="http://serverip:portno/projectcontextname/html-link.do?stringProperty=$newValue">String via paramId and paramName</a>
其中$newValue表示的是newValue这个变量的值

也可以这样用:

=========================================================
<html:link page="/html-link.do"
paramId="booleanProperty"
paramName="testbean" paramProperty="booleanProperty">
Boolean via paramId, paramName, and paramValue
</html:link>
=========================================================

这里多了一个paramProperty属性,这里的name属性和property属性和bean:write标签一样,一般来说name的值是一个被绑定在
request、session、application或page范围内的对象的绑定key值,Property属性的值则是这个对象的一个成员变量的名称
使用了name和Property之后,struts将在上述四种范围内,以name变量值为key查找对象,并将对象读出后,取出Property定义的
成员变量的值。
所以以上的标签被转化成HTML代码之后如下:
<a href="http://serverip:portno/projectcontextname/html-link.do?booleanProperty=$testbean.booleanProperty"> Boolean via paramId, paramName, and paramValue</a>

OK,了解到这里之后,感觉到一丝遗憾,因为如果只有paramId,paramName,paramProperty这三个属性的话,那么对于html:link标签来说,就永远只能
自定义一个参数,如果需要定义多个参数,如http://serverip:portno/projectcontextname/html-link.do?a=3&b=5&y=9这样的链接URL来说,就无能为力了
如果要定义多个参数,就需要手动拼URL,定义在page属性里面,这就失去了使用标签的意义了。

在此情况下,怀着失望的心情,打开了Struts的源码,开始查看这个标签的源码,忽然发现,这个标签完全是可以自定义多个参数的,关键就在name属性上
首先来看一段如何自定义多个参数的代码,如下:

=========================================================
<%
java.util.HashMap newValues = new java.util.HashMap();
newValues.put("floatProperty", new Float(444.0));
newValues.put("intProperty", new Integer(555));
newValues.put("stringArray", new String[]
{ "Value1", "Value2", "Value3" });
pageContext.setAttribute("newValues", newValues);
%>

<html:link page="/html-link.do" name="newValues">
Float, int, and stringArray via name (Map)
</html:link>
=========================================================

原来使用name属性就可以将一个Map类型的变量放入request、session、application、page四种范围的容器内,然后取个key值,填在name属性里就可以了
Struts将自动读取这个Map类型对象的所有key和key所定义的对象,然后自动生成HTML代码
好比上述的例子,将生成如下的HTML代码:
<a href="http://serverip:portno/projectcontextname/html-link.do?stringArray=Value1&stringArray=Value2&stringArray=Value3&floatProperty=444.0&intProperty=555">
Float, int, and stringArray via name (Map)</a>

愿望终于达到了,也充分证明了Struts的实力,但在这段实现中,查找name定义的对象这点在前面几次的源码剖析中已经很明确了(使用的是TagUtils.java中的lookup方法)
但得到这个对象后,Struts是如何读出key值集合和key值对应的对象的呢?代码在此:

=========================================================
// Add the required request parameters
boolean question = temp.indexOf('?') >= 0;
//这里的params变量就是我们输入的Map类型的对象
//就是这句代码可以得到key值集合
Iterator keys = params.keySet().iterator();
while (keys.hasNext()) {
String key = (String) keys.next();
Object value = params.get(key);
if (value == null) {
if (!question) {
url.append('?');
question = true;
} else {
url.append(separator);
}
url.append(this.encodeURL(key));
url.append('='); // Interpret null as "no value"
} else if (value instanceof String) {
if (!question) {
url.append('?');
question = true;
} else {
url.append(separator);
}
url.append(this.encodeURL(key));
url.append('=');
url.append(this.encodeURL((String) value));
} else if (value instanceof String[]) {
String values[] = (String[]) value;
for (int i = 0; i < values.length; i++) {
if (!question) {
url.append('?');
question = true;
} else {
url.append(separator);
}
url.append(this.encodeURL(key));
url.append('=');
url.append(this.encodeURL(values[i]));
}
} else /* Convert other objects to a string */ {
if (!question) {
url.append('?');
question = true;
} else {
url.append(separator);
}
url.append(this.encodeURL(key));
url.append('=');
url.append(this.encodeURL(value.toString()));
}
}
=========================================================

已经不用再做多余的解释了,代码已经说明一切。
其实在PropertyMessageResource.java中,也有类似的代码,就是将property文件读出的一段代码,在ActionServlet初始化时被调用
在bean:message标签研究一文中可以找到这段代码

最后想说的是,Struts的源码写的相当的优秀,不停的学习对提高自身的水平是很有裨益的

RobinOuyang 发表于:2005.12.29 12:35 ::分类: ( Web技术 ) ::阅读:(10202次) :: 评论 (47) :: 引用 (0)

2005 年 11 月 24日, 星期四

如何设置WebLogic的缺省应用

在WEB-INF中新添加一个文件weblogic.xml,内容如下:

<!DOCTYPE weblogic-web-app PUBLIC "-//BEA
Systems, Inc.//DTD Web Application 7.0//EN"
"http://www.bea.com/servers/wls700/dtd/weblogic700-web-jar.dtd">
<weblogic-web-app>
<context-root>/</context-root>
</weblogic-web-app>

另外在MyEclipse中,进入Project的属性页。其中有一项是MyEclipse-Web,同样可以配置。

但是注意,可能其他文件中如果用了绝对路径,连接势必存在问题,需要统一替换更改。


RobinOuyang 发表于:2005.11.24 21:06 ::分类: ( Web技术 ) ::阅读:(357次) :: 评论 (0) :: 引用 (0)

2005 年 11 月 04日, 星期五

各类WEB服务器IP访问限制

1.Tomcat提供了两个参数供你配置:RemoteHostValve 和RemoteAddrValve。例如:
<Valve className="org.apache.catalina.valves.RemoteAddrValve"
allow="127.0.0.1" deny=""/>
这个可以放到Host 或者Context下,放到Context下可以显示对某个特定目录的访问。

2. Apache设置

Allow 指令
说明: 控制哪些主机能够访问服务器的一个区域
语法: Allow from all|host|env=env-variable [host|env=env-variable] ...
上下文: 目录, .htaccess
覆盖项: Limit
状态: Base
模块: mod_access

Allow指令影响哪些主机可以访问服务器的一个区域。可以用主机名、IP地址、 IP地址范围或者其他环境变量中捕获的客户端请求特性来对访问进行控制。

这个指令的第一个参数总是from。随后的参数可以有三种不同形式。 如果指定Allow from all,则允许所有主机访问,需要 Deny和Order指令像下面讨论的那样配置。 要只允许特定一部分主机或主机群访问服务器,host可以用下面任何一种格式来指定:

一个域名(部分)
例子:Allow from apache.org
允许名字与给定字符串匹配或者以该字符串结尾的主机访问。 只有完整的名字组成部分才被匹配,因此上述例子将匹配foo.apache.org而不能匹配fooapache.org。 这样的配置将引起服务器执行一个对客户IP地址的反查域名操作而不管HostnameLookups指令是否设置
完整的IP地址
例子:Allow from 10.1.2.3
允许一个主机的一个IP地址访问。
部分IP地址
例子:Allow from 10.1
IP地址的开始1到3个字节,用于子网限制。
网络/掩码对
例子:Allow from 10.1.0.0/255.255.0.0
一个网络a.b.c.d,和一个掩码w.x.y.z。用于更精确的子网限制。
网络/nnn 无内别域间路由规格
例子:Allow from 10.1.0.0/16
同前一种情况相似,除了掩码由nnn个高位字节构成。
注意以上后三个例子完全匹配同一组主机。

IPv6地址和IPv6子网可以像下面这样指定:

Allow from fe80::a00:20ff:fea7:ccea
Allow from fe80::a00:20ff:fea7:ccea/10

Allow指令的第三种参数格式允许对服务器的访问由 环境变量的一个扩展指定。指定 Allow from env=env-variable时,如果环境变量env-variable存在则访问请求被允许。 使用由mod_setenvif提供的指令,服务器用一种基于客户端请求的弹性方式提供了设置环境变量的能力。 因此,这条指令可以用于允许基于像User-Agent(浏览器类型)、Referer或者其他Http请求头字段 的访问。

例子:
SetEnvIf User-Agent ^KnockKnock/2.0 let_me_in
<Directory /docroot>
Order Deny,Allow
Deny from all
Allow from env=let_me_in
</Directory>

这种情况下,发送以KnockKnock/2.0开头的用户代理标示的浏览器将被允许访问,而所有其他浏览器将被禁止访问。


Deny 指令
说明: 控制哪些主机被禁止访问服务器
语法: Deny from all|host|env=env-variable [host|env=env-variable] ...
上下文: 目录, .htaccess
覆盖项: Limit
状态: Base
模块: mod_access

这条指令允许基于主机名、IP地址或者环境变量限制对服务器的访问。 Deny指令的参数设置和Allow指令完全相同。


Order 指令
说明: 控制缺省的访问状态和Allow与Deny指令被评估的顺序。
语法: Order ordering
默认值: Order Deny,Allow
上下文: 目录, .htaccess
覆盖项: Limit
状态: Base
模块: mod_access

Order指令控制缺省的访问状态和 Allow与Deny指令被评估的顺序。 Ordering是以下几种范例之一:

Deny,Allow
Deny指令在 Allow指令之前被评估。缺省允许所有访问。 任何不匹配Deny指令或者匹配 Allow指令的客户都被允许访问服务器。
Allow,Deny
Allow指令在 Deny指令之前被评估。缺省禁止所有访问。 任何不匹配Allow指令或者匹配 Deny指令的客户都将被禁止访问服务器。
Mutual-failure
只有出现在Allow列表并且不出现在 Deny列表中的主机才被允许访问。 这种顺序与Order Allow,Deny具有同样效果,不赞成使用,它包括了哪一种配置。
关键字只能用逗号分隔;它们之间不能有空格。注意在所有情况下每个Allow和Deny指令语句都将被评估。

在下面的例子中,apache.org域中所有主机都允许访问,而其他任何主机访问都被拒绝。

Order Deny,Allow
Deny from all
Allow from apache.org


下面例子中,apache.org域中所有主机,除了foo.apache.org子域包含的主机被拒绝访问以外,都允许访问。 而所有不在apache.org域中的主机都不允许访问,因为缺省状态是拒绝对服务器的访问。

Order Allow,Deny
Allow from apache.org
Deny from foo.apache.org


另一方面,如果上个例子中的Order指令改变为Deny,Allow, 将允许所有主机的访问。这是因为,不管配置文件中指令的实际顺序如何, Allow from apache.org指令会最后被评估到并覆盖之前的 Deny from foo.apache.org。所有不在apache.org 域中的主机也允许访问是因为缺省状态被改变到了允许。

即使没有伴随Allow和Deny指令,一个Order 指令的存在也会影响到服务器上某一个部分的访问, 这是由于他对缺省访问状态的影响。例如,

<Directory /www>
Order Allow,Deny
</Directory>

这样将会禁止所有对/www目录的访问,因为缺省状态将被设置为拒绝.

Order指令只在服务器配置的每个段内部控制访问指令的处理。 这暗示着,例如,一个在<Location>段出现的 Allow或者Deny指令总是将会在一个<Directory>段或者 .htaccess文件中出现的 Allow或Deny 指令之后被评估,而不管Order指令中的设置为何。要了解配置段落合并的详细信息, 参看How Directory, Location and Files sections work相关文档


RobinOuyang 发表于:2005.11.04 08:48 ::分类: ( Web技术 ) ::阅读:(314次) :: 评论 (0) :: 引用 (0)

2005 年 10 月 21日, 星期五

还是中文问题

今天又遇到了一个中文问题,当然是同事遇到的要我帮忙解决。是典型的Tomcat的get方法,我原本没有发现是采用了get方法,所以用了filter,结果没有凑效,之后发现后采用了再server.xml中的Connect部分添加URIEncoding的办法,但是却还是没有凑效。经过仔细寻找,原来即使是加了URIEncoding,页面中的enctype居然是multidata型,将这一行去了,问题就解决了。

但是有关是multidata时应该怎样解决,还没有找到。

 查看全文
RobinOuyang 发表于:2005.10.21 19:02 ::分类: ( Web技术 ) ::阅读:(2776次) :: 评论 (0) :: 引用 (0)

2005 年 08 月 24日, 星期三

Windows下配置Mantis

网上有好些配置经验讲述,但是那种将mysql、apache、php分别安装的做法我一直没有试成功,我采用的的是安装xampp和Mantis-1.0rc1。xampp可以在http://www.apachefriends.org/en/xampp.html中下载,这个是apache+mysql+php……的集成安装软件,mantis-1.0rc1可以在http://www.mantisbt.org/download.php中下载。下面详细讲一下它们的安装和配置。
1.安装xampp,很简单,一步步往后安装即可,最后它会提示你是否安装成服务,完全可以。一般情况下mysql服务不会有问题,就是apache安装成服务可能会有问题。如果有问题,可以执行xamppapache目录下的apache_installservice.bat,它会提示具体的问题。我在安装过程中就遇到了两个端口问题,一个是ssl的443端口和http的80端口,这两个端口都被占用了,因此只有换成其他的端口,ssl端口可以在apache/conf目录下的ssl.conf文件中查找Listen 443然后换一个端口号即可,同理http的端口在相同目录下的httpd.conf文件中。最后只要进入xampp的控制面板中(在开始/程序菜单中)可以启动这两个服务即可。
2.假设xampp安装在了D盘的根目录下(D:xampp),mantis也解压安装在了D盘根目录下(D:mantis)。
将mantis下的config_inc.php.sample另存为config_inc.php,如果你改了root的密码,打开这个文件,设置 $g_db_password='yourpassword'.
打开apache下的httpd.conf文件,在最后添加:
Alias /mantis "D:/mantis/"
<Directory "D:/mantis/">
Options Indexes
DirectoryIndex index.php
AllowOverride None
Order allow,deny
Allow from all
</Directory>
尤其要注意“/”,不是“”,重新启动apache和mysql。
3.从网上获得db_generate.sql文件,这个文件是数据库脚本文件,在mantis-1.0以前的版本中的sql目录下就有,将这个文件放置于D盘根目录下。
4.进入mysql的bin目录下,运行:mysql -uroot -p,此时会提示你输入口令,直接再敲回车即可进入mysql的命令行界面,执行如下命令:
create database bugtracker;
use bugtracker;
source D:/db_generate.sql;
同样要注意是“/”,不是“”。如果最后提示创建了一系列的数据表,既说明数据库和数据表创建成功。
5.假设上面配置的httpd端口是8000,那么此时在IE中输入如下地址:http://localhost:8000/mantis,会出现mantis界面,输入administrator/root即可进入。但是可能会提示数据库中的某个数据表错误,这是因为我们mantis的版本和mantis数据库脚本的版本不一致,可以在IE中访问http://localhost:8000/mantis/admin/upgrade.php页面,这个页面中会提示要运行哪些升级脚本,点击“execute all”即可全部升级。此时再次访问http://localhost:8000/mantis应该就不会有问题了。
6.中文问题:
在APACHE的httpd.conf配置文件中将AddDefaultCharset ISO-8859-1 改为 AddDefaultCharset OFF
在mantis的config_inc.php中添加
$g_default_language='auto';
重新启动apache。
7.文件上传:
在config_inc.php中添加
$g_allow_file_upload=ON;
$g_file_upload_method=DISK;
并且在mantis下面新建一个upload目录
当你以管理员身份登录,新建项目时,在上传文件路径那一项填上upload即可,如果要为每一个项目指定不同的目录,可以先在upload下建一个projectname,在上传文件路径那一项填上upload/projectname,注意最好不要用中文目录名,目录名中间也不要带空格。
8.邮件提醒:
网上的有关邮件提醒的配置如下:
在php的php.ini文件中查找smtp,将localhost改为你的发件服务器,如SMTP = smtp.163.com
在php.ini文件中查找sendmail_from,将前面的分号去掉,并在后面填上邮件地址
在mantis的config_inc.php文件中添加
$g_smtp_host='smtp.163.com';
$g_smtp_username='yourusername';
$g_smtp_password='yourpassword';
$g_phpMailer_method =2;
RobinOuyang 发表于:2005.08.24 09:49 ::分类: ( Web技术 ) ::阅读:(602次) :: 评论 (10) :: 引用 (0)