??xml version="1.0" encoding="utf-8" standalone="yes"?>
public Authentication attemptAuthentication(HttpServletRequest request)
2 throws AuthenticationException {
3 String username = obtainUsername(request);
4 String password = obtainPassword(request);
5
6 if (username == null) {
7 username = "";
8 }
9
10 if (password == null) {
11 password = "";
12 }
13
14 UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);
15
16 // Place the last username attempted into HttpSession for views
17 request.getSession().setAttribute(ACEGI_SECURITY_LAST_USERNAME_KEY, username);
18
19 // Allow subclasses to set the "details" property
20 setDetails(request, authRequest);
21
22 return this.getAuthenticationManager().authenticate(authRequest);
23 }
24
取出username后发现是qQ如果解册个问题呢Q第一个想到的是{?br />
username=new String(username.getBytes("ISO8859-1"),"UTF-8");
解决问题Q但是这D代码要嵌入到acegi中必重新编译acegi
spring的filter是解决编码问题的Q但是因为acegi的filter在spring之前Q所以编码没有{码。又不能把acegi的filter挪到spring filter之后Q这样就有安全问题了?br />
那就增加一个filterQ只qo(h)d链接Q然后设|一下代替spring的encodingfilter讄一下编码,解决问题
public class EncodeChnUsernameFilter implements Filter{
private static final String ACEGI_SECURITY_FORM_USERNAME_KEY ="j_username";
private static final String ACEGI_SECURITY_FORM_PASSWORD_KEY = "j_password";
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
public void init(FilterConfig arg0) throws ServletException {
}
}
但是另一个问题来了,密码是非明文的md5加密的,需要加密,同样不想更改acegi?br />
那好吧l用filterQ看看能否getParameter后再set回去
String password= request.getParameter("j_password");
//q里是个md5加密函数
password = md5(password);
//怎么setq去呢?
request.getParameterMap().put("j_password",password);
//启动试一下,异常报错Qmap不能putQ看一下异常,发现q个不是普通的mapQ是org.apache.catalina.util.ParameterMapQ这个map中有个标志位lockQtomcat不让更改http接收到的倹{?br />
//Z不服输的_Q一定要搞定它,呵呵
ParameterMap map = (ParameterMap)request.getParameterMap();
map.setLock(false);
map.put("j_password",password);
map.setLock(true);
//搞定Q不对,~译不通过Q发现org.apache.catalina.util.ParameterMap的jar包是catalina.jar?br />
把这个包攑ֈl(f)ib下编译,通过Q运行出向下转型错误Q仔l看一下发现request.getParameterMap()出来的ParameterMap.getClass()的id?00多,而接受{?/span>
的ParameterMap.class.getClass()?000多,不是一个类啊。想想也对,lib下和tomcat的server/lib下各有一个catalina.jarq个是两个cM?br />
eclipse add 外部jar包,直接add上tomcat中的catalina.jarQ编译运行,q是有问题,q次是报的classNotFound异常Qؓ(f)什么会(x)q样呢,命名Server/lib下有q个jar包,后来想了下明白了。tomcat一定是限定了catalina.jar不能被普通的用户cL直接引用。处于安全性考虑吧。这条\C通了Q回到acegi才发现acegi的配|文件中是可以随意配|a(chn)utheticationfilter的,自己写一个autheticationfilterQ配|进去,不用pȝ的,解决问题Qfilter里边怎么写都没问题,爱怎么处理怎么处理Q呵?/span>
步骤一Q?/span>
?/span>www.apache.org下蝲所需的类?/span>
commons-codec-1.3.jar
commons-httpclient-3.1-rc1.jar
commons-logging.jar
步骤二:(x)
制作证书Q?/span>
keytool -genkey -alias tomcat -keyalg RSA
L输入Q最后一个提C入回车(保证两个密码相等Q否?/span>tomcat不能启动.
默认生成的文件在用户目录?/span>.keystore
步骤三:(x)
配置tomcat
更改tomcat配置文gserver.xml
加入
<Connector port="8443" maxHttpHeaderSize="8192"
maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
enableLookups="false" disableUploadTimeout="true"
acceptCount="100" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="C:\.keystore" keystorePass="123456"
/>
其中keystoreFile是刚生成文g的带全\径的名字
keystorePass是刚才徏立证书时候的名字
启动tomcatQ访?/span>https:\\localhost:8443/如果能正常看刎ͼ说明tomcat?/span>https配置成功.
步骤四:(x)
生成jdk能用的证书
1,用ie导出证书(导出Ҏ(gu)Q?a >http://www.ibm.com/developerworks/cn/opensource/os-httpclient/#N10114)
2,假设上边导出文g的名字叫tt.cer
执行(保配置?/span>java home)
keytool -import -noprompt -keystore D:\Java\jdk
其中U色的部分替换成自己jre的\?/span>,alias同徏立证书时的名字,file时刚才导出的证书的名?/span>
?x)提C入密码,输入刚才建立证书时输入的密码
步骤五:(x)
~写代码
普通连接和sslq接只有一个差距就?/span>url
下边介绍一下运行上边程序的q程?br>1,~译上边的程序,需要classpath中加入slf4j-api-1.4.1.jar文g
2,q行Ӟ需要classpath中加上slf4j-simple-1.4.1.jar
q行得到l果:
----------------------------
0 [main] ERROR Wombat - Temperature set to 1. Old temperature was null.
0 [main] ERROR Wombat - Temperature set to 55. Old temperature was 1.
0 [main] INFO Wombat - Temperature has risen above 50 degrees.
q个是simple log风格Q?/p>
3,切换Q如果想切换到jdk14的log的风|只需要把slf4j-simple-1.4.1.jar
从classpath中移除,同时classpath中加入slj4j-jdk14-1.4.1.jar
q时的运行结?
---------------------------------------------------
2007-7-9 10:40:15 Wombat setTemperature
严重: Temperature set to 1. Old temperature was null.
2007-7-9 10:40:16 Wombat setTemperature
严重: Temperature set to 55. Old temperature was 1.
2007-7-9 10:40:16 Wombat setTemperature
信息: Temperature has risen above 50 degrees.
已经变成jdk14的log风格了?br>4,再次切换到l(f)og4j
同样U除slj4j-jdk14-1.4.1.jarQ加入slf4j-log4j12-1.4.1.jarQ同时加入log4j-1.2.x.jar
加入log4j.properties。得到显C结?
---------------------------------------
10:42:27,328 ERROR Wombat: Temperature set to 1. Old temperature was null.
10:42:27,328 ERROR Wombat: Temperature set to 55. Old temperature was 1.
10:42:27,328 INFO Wombat: Temperature has risen above 50 degrees.
在不同的风格中切换只需要在部v期切换类库就可以了,和开发时无关?br>
ICE(Internet Communications Engine)是一个ؓ(f)现实中程序员而写的中间gq_。作Z个高性能的互联网通信q_QICE包含了很多分层的服务和插?Plug-ins)Qƈ且简单、高效和强大?/p>
ICE的自׃用遵从GNU的GPL(GNU General Public Licens)许可的条ƾ。ICE也有商业的许可证Q如果你惛_ICE使用在你的私有品中Q那么你应该使用ICE的商业许可证。可以联p?a href="mailto:sales@zeroc.com" target=_blank>sales@zeroc.com来获得这斚w的更多信息?/p>
ICE当前支持C++、Java、C#、Visual Basic、Python和PHP~程语言Qƈ支持在多U操作系l上q行。更多的操作pȝ和编E语a会(x)在以后的发布中支持?/p>
ICE有以下几部分l成Q?/p>
Slice
ICE的规范语aQ跟CORBA的IDL(Interface Definition Language){h(hun)的东ѝSlice建立了客L(fng)和服务器端共同遵守的契约Q接口。Slice也用来描q对象持久数据?/p>
Slice Compilers
Slice的规范语a可以影射成多U编E语a。目前ICE支持C++QJavaQPythonQPHPQC#和VB的语a影射。Ice的客L(fng)和服务器端协同工作,而不?x)知道分别实现的是何U编E语a?/p>
Ice
Ice的核心库。在众多的特性当中,Ice核心库通过一个高效的协议(包含TCP/UDP层上协议压羃)来管理所有的通信dQؓ(f)多线E服务器提供了一个灵zȝU程池,q且有特别的功能来支持上百万对象的可扩展性?/p>
IceUtil
一些常用的功能函数集。例如Unicode处理和多U程~程Q是用C++写成?/p>
IceBox
一个专用于ICE应用的应用服务器。ICEBox可以方便地运行和理动态加载、共享库或javacȝ形式Ice的服务?/p>
IcePack
一个成熟的服务Ȁzd部v工具。IcePack能大大简化在异构|络之间部v应用的复杂性。只要简单的~写XML格式的一个部|描q文ӞIcePackp自动处理剩下的工作?/p>
Freeze
Freeze提供了Ice Servants对象的自动持久性。通过几行代码Q一个应用就可以生成一个高度可扩展的逐出?evictor)来高效地理持久对象?/p>
FreezeScript
在大的Y仉目里Q持久对象的数据cd改变很常见。ؓ(f)了最化q些变化的媄响,FreezeScript提供了相应的工具来检查和ULFreeze生成的数据库。这些工h持XML格式的配|脚本,易于使用?/p>
IceSSL
用于Ice核心的动态的SSL传输插g。提供了认证、加密和消息完整性,使用工业标准的SSL协议来实现?/p>
Glacier
面向对象中间件^台的一个最大的挑战是安全性和防火墙。Glacier是Ice的防火墙解决Ҏ(gu)Q它大大化了安全E序的部|ӀGlacier认证和过滤客L(fng)hq允许服务器通过安全的方式回调客L(fng)对象。结合IceSSL的用,Glacier提供了强大的安全解决Ҏ(gu)Q即安全Q又易于配置理?/p>
IceStorm
一个支持联盟的消息服务。和大多数的其他消息和事件服务相比,IceStorm支持有类型的事gQ这意味着通过联盟q播一个消息和调用一个接口上的一个方法一样容易?/p>
IcePatch
一个Y件修补和分发的服务。ؓ(f)保q行的Y件是最新的版本Q要l常更新软gQ这是一件乏味的工作。IcePatch自动更新在某个目录层ơ下的文件。只有需要更新的文g?x)下作到客户端,Z快速的下蝲更新QIcePatch使用的高效的压羃法?br>3、ice vs corba差异
http://gigaboy.bokee.com/2158057.html
4、ice vs corba性能Ҏ(gu)
http://gigaboy.bokee.com/2160870.html
5、ice评h(hun)
corba是一个规范,ice不是 ice的特性是zerocx样怎样?所以也不会(x)有第三方产商参与 ice对各U^台的支持也只有zeroc的实现版本。用Ice不用自己设计传输协议?QIce有成熟的商用案例。ICE是以前Corba的开发者来开发的Q吸取了corba的长处,避免了一些短处,特点是:(x)效率高、简单、免?/p>
一Q准?/span>
1,安装Jdk1.4
2,安装mysql
3,解压~?/span>antQ拷?/span>junit.jar?/span>ant_home/lib/?/span>
4,讄path,classpath,jdk_home,and_home,catalina_home
5,试安装
cmd->输入java
cmd->输入ant
二:(x)安装Q?/span>
1Q拷?/span>appfuse-webwork-
解压~?/span>appfuse-webwork-
2,修改配置文gbuild.properties
q里?/span>mysqlZ子:(x)
原来的样子:(x)
--------------------------------------------------------
#database.jar=${postgresql.jar}
#database.type=postgresql
#database.host=localhost
#database URL for creating other databases (doesn't work with pgsql)
#database.admin.url=jdbc:${database.type}://${database.host}/template1
#database.admin.username=postgres
#database.admin.password=postgres
#hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
#database.driver_class=org.postgresql.Driver
#database.url=jdbc:${database.type}://${database.host}/${database.name}
--------------------------------------------------------
修改后的样子Q?/span>
--------------------------------------------------------
database.jar=${mysql.jar}
database.type=mysql
database.host=localhost
#database URL for creating other databases (doesn't work with pgsql)
database.admin.url=jdbc:${database.type}://${database.host}/mydb
database.admin.username=root
database.admin.password=aa
hibernate.dialect=org.hibernate.dialect.MySQLDialect
database.driver_class=com.mysql.jdbc.Driver
database.url=jdbc:${database.type}://${database.host}/${database.name}
--------------------------------------------------------
修改D:\work\myapp\metadata\sql里边?/span>mysql-create.sql
把第一句改?/span>
create database if not exists @DB-NAME@ CHARACTER SET utf8 COLLATE utf8_general_ci;
2,生成工程
cmdq入d:\work\appfuse->输入ant new
全部使用默认
3,~译Q?/span>
Ant compile
3Q徏立表l构
q入mysql>
Create database mydb
Ant setup-db
4,试
Ant test-all
5,部v
Ant deploy
三,q行
1?span> q行tomcat?span>
2?span> 打开览器,输入http://localhost:8080/myappQ会(x)看到d面?/span>
注意问题Q?/span>
每次更改环境变量后应该重新打开CMDH口
下蝲地址Q?/span>
参考:(x)http://www.ibm.com/developerworks/cn/java/j-lo-appfuse/index.html
1. Ant 中常用的 AppFuse target
target | 说明 | 所在文?/th> |
---|---|---|
new | q个 target 是?AppFuse 必须要用到的Q它用来?AppFuse 同的目录下创徏一个新目。创E是交互式的Q会(x)让用戯入项目名U、数据库名称以及(qing)根包路径?/td> | AppFuse 安装目录下的 build.xml |
setup | 用于初始化一个新的项目,它包含了从数据库创徏、Tomcat 讄?war 文g的生成和部v{一pd操作?/td> | 目根目录下?build.xml |
deploy | 如果你修改的代码不涉?qing)到数据库的更改Q那么可以用这?targetQ因为它只负责生成ƈ重新部v war 包?/td> | 目根目录下?build.xml |
setup-db | 如果你只是要Ҏ(gu)据库q行更改Q用这?target。比如,重新创徏数据库,重新加蝲h数据{操作?/td> | 目根目录下?build.xml |
install | AppGen ?target。如果你不希望?AppGen 帮你生成 dao cd service cM?qing)其他的代码Q就使用q个 target?/td> | extras/appgen 目录下的 build.xml |
install-detailed | AppGen ?target。如果你希望使用 AppGen 帮你生成所有代码,׃用这?target?/td> | extras/appgen 目录下的 |