Permalink
416 lines (319 sloc) 24.3 KB
-- Changes in 3.0.1
* 改进FormResolver:将空白表单看作invalid,等同于验证失败,当skipIfInvalid=true时,避免执行action。
* 改进WebxFrameworkFilter:添加excludes参数,使它可以快速排除不需要处理的requestURI
<filter>
<filter-name>webx</filter-name>
<filter-class>com.alibaba.citrus.webx.servlet.WebxFrameworkFilter</filter-class>
<init-param>
<param-name>excludes</param-name>
<param-value>/otherservlet, *.jpg</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>webx</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>other</servlet-name>
<url-pattern>/otherservlet/*</url-pattern>
</servlet-mapping>
* 改进CsrfToken,使它的生成算法可以被别的模块所覆盖。
* 改变CsrfToken.getHiddenField()的默认行为 ── 默认生成longLiveToken而不是原来的uniqueToken。
* Bugfix:当fileItem为空时,uploaded-file-validator抛NPE的问题
* Bugfix:当redirect时,不要执行action
* 改变<parser/> request context中利用getBeanByType取得upload service的方式:
由于<request-contexts>和<parser>会在BeanFactoryPostProcessor中初始化,而此时aop post processor还未被创建。
而getBeanByType可能导致某些FactoryBean抢在aop post processor之前被初始化,导致这部分的bean无法被aop拦截。
* 改进<data-resolver>服务获取parameter annotations的方式:
由于aop可能会运行时派生一个新的类,而这个类并没有包含parameter annotations,导致data resolver无法解析该参数。
改进以后,data-resolver会从super class的被覆盖方法中取得annotation。
* Bugfix:解决URIBroker.toString()然后再fork(),intercepters会被重复执行的问题。
* Bugfix:ModuleLoaderService中产生ClassCastException的问题。
* 改进:在ExceptionUtil中增加throwExceptionOrError()和throwRuntimeExceptionOrError()方法(用来解决上一个bug)。
* Bugfix: escape-support对于#define block会多重escape。
* 改进:对于noescape,返回value object,避免调用value.toString(),合后续的handler可以被正确执行。
* 改进:<set-local inputCharsetParam="" outputCharsetParam="" >支持多个参数,用|分隔,例如:"_input_charset|ie"
* 改进:LocaleUtil.isCharsetSupported(null)返回false,而不是异常
* 改进:添加configuration point: rewrite/handlers,将beans:bean的引用改成handlers:handler。
注意:这会引起xml格式的不兼容,但是这个问题可以在应用启动时立刻发现,并且很容易修改。
step1: 引入namespace: xmlns:rewrite-handlers="http://www.alibaba.com/schema/services/request-contexts/rewrite/handlers"
step2: 指定schema location: http://www.alibaba.com/schema/services/request-contexts/rewrite/handlers http://localhost:8080/schema/services-request-contexts-rewrite-handlers.xsd
step3: 将<handlers><beans:bean>改成:<handlers><rewrite-handlers:handler>
* 改进pom使项目可在默认的maven repository下build
* 改进mail service,使之在javamail 1.4.1和1.4.2下有一致的表现。
-- Changes in 3.0.2
* 改进SessionRequestContext,当attributes未改变,并且invalidate未调用时,不提交store,以免产生不必要之cookies。
注意:session store不保证对象的内部属性的改变会被保存到store中,例如,下面的代码不一定可行:
MyObject myObject = session.getAttribute("myObject");
myObject.setValue(value);
// next request of the same session
assertEquals(value, ((MyObject) session.getAttribute("myObject")).getValue()); // 可能不等
* Bugfix: 在解析query参数时,对“Justin%A1%A4Bieber”进行URL unescape时(GBK),得到乱码。
* 改进WebxComponentsContext接口,使开发者有机会继承并设置额外的参数。例如:允许bean definition重复定义。
* Bugfix: 当RequestContext未扩展子接口时,将对RequestContext创建singleton proxy,从而导致注入RequestContext接口时出错。
解决步骤:1. 避免对创建RequestContext接口本身创建singleton proxy
2. 不使用spring本身的ObjectFactory作为proxy的接口,而是创建一个新的接口:ProxyTargetFactory
* Bugfix: 在Servlet 3.0/Tomcat 7.0中,对Cookie.isHttpOnly创建FastClass时出ClassNotFoundException。解决步骤,指定正确的classLoader。
* 改进:添加ExceptionUtil.getStackTraceForHtmlComment()方法,使包含“--”的异常信息可被正确输出HTML comment中。
* 改进:(Servlet|Turbine|)ContentURIBroker.getURI("xxx?a=1&b=2#ref")支持query和ref
* 改进:URIBroker.setServerURI("xxx?a=1&b=2#ref")支持query和ref
* 改进:支持导出control context中的值到调用者。
* 临时导出:$controlTool.export("var1", "var2", ...)
* 导出全部(不推荐,默认为false):<control-tool exportAll="true" />
* 改进:支持在模板中指定layout:$rundata.setLayout(xxx)
* 改进:使error pipeline中可以取得应用context中的对象(但是不包括pull tools)。
* 删除过期的ExceptionRecoveryValve
* Bugfix: 当<input type=file>字段存在,但未上传文件时,ValueListSupport.getFileItems()不能取得正确的结果。
-- Changes in 3.0.3
* 改进: new LocaleInfo(locale, charset)时,即使charset为非法的,也不报错。把判断charset合法性的任务交给LocaleUtil.isCharsetSupported()方法。
(但在setDefault和setContext时会判断charset的合法性)
这样改进避免了setLocaleRequestContext中出现UnsupportedCharsetException异常。
* 相关改进:添加方法:LocaleInfo.isCharsetSupported(), assertCharsetSupported()。
* 改进:修改TurbineRunDataInternal接口,将get/setContextForControl的功能和push/popContext合并,简化了control中创建context的逻辑。
注意:应用不应该依赖于TurbineRunDataInternal接口,如果依赖了,并用到了修改的方法,有可能受影响。
* 改进:添加了ControlParameters接口,它可以通过参数注入到control module类中。Control通过它可以修改或取消template。
* 改进:添加了@ContextValue注解,可以通过参数直接注入Context中的值,或传递给control的参数。
* 改进:添加VisitorInvocationErrorHandler接口,使templatelite可以选择抛出visitor的异常,或者由visitor来自己处理异常。
* 改进并bugfix:让TextWriter实现VisitorInvocationError,默认显示root cause异常并记录日志,但不抛出错误。
注解:由于request attributes中存在turbine rundata proxy的引用,而在detailed error环境中不存在rundata,因此导致显示detailed error页面时出错。
然而这种错误完全是无谓的,重要的是显示应用的异常。此改进使detailed error页面不会因为visitor的失败而失败。
* 改进:简化StaticFunctionDelegatorBuilder所生成对象的toString方法,使之更易读;
* 改进:添加ExceptionUtil.getRootCause()方法。
-- Changes in 3.0.4
* bugfix: 把/index重写(rewrite)成/index.htm时,变成了/index/.htm。
* 改进:让form service和uris service支持import,这样,就可以把form.xml和uris.xml分割成多个文件,便于管理。
需要注意,由于有多个form和uris实例存在,所以需要指定primary参数,否则注入会出错。
<form id="common" />
<form primary="true">
<import form="common" />
</form>
<uris id="common" />
<uris primary="true">
<import uris="common" />
</uris>
* 改进TemplateLite工具,并将它从internal包开发到common-util中,可供外部使用。
* 新增explorer开发工具,在开发模式下,可以:
× 列出所有context中的spring beans,以帮助开发者了解schema所生成的beans结构。
× 查看resource loading服务中资源。
× 查看uri brokers。
× 查看pull tools。
* 改进:resourceLoadingService.trace()时,如果成功的话,能够取得resource对象。
* 改进:pullService,可以取得tool-set的信息,以方便explorer查看。
* 改进:允许application context中出现重复定义的bean,合并重复定义的bean definition的内容。这样做的目的是为了可以覆盖bean的默认配置。
* 改进:支持从classpath*:中查找webx子应用的配置文件。例如:
<webx-configuration>
<components componentConfigurationLocationPattern="classpath*:META-INF/mycomponent/*.xml" />
</webx-configuration>
* 改进:如果指定了-DskipValidation启动参数,则跳过schema验证,以加快启动速度。请勿在生产环境使用这个功能。
-- Changes in 3.0.5
* Bugfix: CsrfToken.getLongLiveToken在集群机器上产生不一致的结果。
* 改进:当指定-DskipValidation时,beans定义中的参数可取得正确的默认值,例如:default-autowire,default-dependency-check等。
-- Changes in 3.0.6
* 改进:让webx同时支持spring2/3。
(修改了一处代码,使resource loading机制可在spring3下运行;修改了若干单元测试,使它们在spring3下可以通过测试。)
虽然webx仍以spring 2.5.6.SEC02编译,但只需要将项目的pom.xml中的spring依赖改成3.0.6.RELEASE就可以工作。
如希望以spring3来编译webx,只需要指定参数:mvn ... -Pspring3 即可。这样编译所生成的citrus-webx-all包将依赖于spring 3。
注意:spring3和spring2的代码是不完全兼容的。在spring2上编译的代码,未必能直接在spring3上运行,反之亦然。
下面的命令确保webx同时兼容于spring的两个版本。
mvn clean install -- 在spring2中编译并测试
mvn surefire:test -Pspring3 -- 在spring3中测试但不编译
* 在开发者首页中显示webx版本、spring版本;改进取得webx版本的方法,使用META-INF/MANIFEST.MF中的信息。
* 安全改进:为dev mode下的explorer添加安全控制。默认只能从本机访问。当从非授权的主机访问时,显示友好的提示信息。支持下面的property:
-DdevelopmentMode.allowedHosts=192.168.1.*
* 改进:增加MDC: %X{productionMode},在日志中自动显示当前的生产模式或开发模式。
* 新增功能:将webx当作filter使用,filter chain的下游可以使用webx所提供的request contexts功能。配置方法如下(WEB-INF/web.xml):
<filter>
<filter-name>webx</filter-name>
<filter-class>com.alibaba.citrus.webx.servlet.WebxFrameworkFilter</filter-class>
<init-param>
<param-name>excludes</param-name>
<param-value>*.html</param-value><!-- 让servlet引擎来处理静态页面 -->
</init-param>
<init-param>
<param-name>passthru</param-name>
<param-value>/myservlet/*, *.xxx</param-value><!-- 将以上url转给servlet处理,但在servlet中可用request contexts。 -->
</init-param>
</filter>
<servlet-mapping>
<servlet-name>...</servlet-name>
<url-pattern>/myservlet/*</url-pattern>
<url-pattern>*.xxx</url-pattern>
</servlet-mapping>
* 改进:当uribroker.toString()时,不执行interceptors,确保intercepters总在render时被调用,而不会因为某些情况(如输出日志时)被调用。
解决了如下问题:原来pull service在初始化时会调用uribroker.toString(),从而调用interceptors。但此时调用interceptors可能会得到不正确的结果。
* 修改URI broker service中requestAware的默认值,原来是true,现在改为false。
* 当requestAware为true时,所生成的URL会自动加上当前request的server信息。这个在绝大多数情况下是不需要的。故修改之。
* 将原petstore示例中的页面验证组件PageAuthorizationService和PageAuthorizationValve移植到turbine中。
* 新增pull tool:<context-exposer>可将context中的bean直接暴露到pull tools中,供模板使用。
* 增加对于spring-test的支持。
* 增加测试工具:SpringextContextLoader和ServletTestContainer,使用方法参见citrus-test-webx单元测试。
* 改进:将读取action参数的任务由performAction valve移到analyzeURL valve,从而使其它的valve也能通过rundata取得action参数。例如安全检验的valve。
* 注意:很少有应用程序会去修改action参数。但如果有人这样做了,在新的实现下,代码可能会失效。
* 改进:rundata.setRedirectTarget()以后,自动清除action,避免执行action。
* 改进:JspService支持jspx后缀。
* 将util.internal.regex.*和util.internal.ToStringBuilder等内部类升级至非internal类,以方便其它应用使用。
* bugfix: ClassLoaderUtil.getResources(name)中的小问题。
* bugfix:InheritableListableBeanFactory.registerResolvableDependency()只阻止对parent context中已注册的ProxyTargetFactory对象的覆盖,
使ResourceLoader和ApplicationContext等对象的注入方式仍然和spring原来相同。
* 确保在java7下面可以编译并测试通过。
-- Changes in 3.0.7
* 删除citrus-springext-all-in-one项目。
* 修改项目的名称:
citrus-webx-all-in-one -> citrus-webx-all
citrus-test-all-in-one -> citrus-test-all
所有依赖这两个包的应用需要修改一下pom.xml。
* 改进pom.xml,以便发布到central maven repository中:
* 添加javadocs
* 修改pom参数
* 升级jexl到2.0.1,使之支持可变参数,例如:$messageUtil.formatMessage(format, args...)
-- Changes in 3.0.8
* 添加方法:navigator.redirectTo(name).withParameter(..).end(); 通过end()方法可以明确结束语句,并发出重定向请求。
* 所有源码改用UTF-8,符合多数开发环境的默认配置。
* 改进pom,在开发时使用较高版本的java,发布时使用保守的Java 1.5。
* 改进form/velocity service测试,使之可以在非(locale=CHINA, charset=GBK)的情况下测试通过。
* bugfix: number-validator设置限定范围以后,当用户输入非法数字时,validator抛出异常。
* 改进form,对于field.getKey(),同时支持压缩格式(_fm.g._0.f)和非压缩格式(_fm.group._0.field),大小写不敏感。这样可以方便测试。
如果<form fieldKeyFormat="uncompressed">参数被明确指定,那么所有输出的字段名全为非压缩的,并且不支持压缩格式。
* 删除暂时没用的asm/codegen子模块,并将少量依赖到的类移到generictype子模块中。
* SetLocaleRequestContext中增加功能:可根据request uri,自动设置与默认值不同的input/output charset
<set-locale>
<override uri="*.json" inputCharset="UTF-8" outputCharset="UTF-8" />
</set-locale>
* bugfix: WebxFrameworkFilter中使用excludes排除.css,.js以后,在开发模式下直接访问webx的开发模式首页时出现页面混乱,因为internal里面的css和js也被过滤掉了。
* bugfix: ScriptModuleFactory搜索到*.class时会报错。
* 改进异常处理:当使用pipeline-exception.xml来处理异常时(生产模式),可以指定:
1. 日志名称(loggerName和defaultLoggerName);
2. 日志的详略(logging和defaultLogging,可选值detailed, brief, disabled)。
<services:pipeline xmlns="http://www.alibaba.com/schema/services/pipeline/valves">
<handleException defaultPage="error.vm"
defaultLogging="detailed"
defaultLoggerName="my.logger">
<on-exception type="com.alibaba.citrus.service.template.TemplateNotFoundException"
statusCode="404"
logging="brief" />
<on-exception type="com.alibaba.citrus.service.moduleloader.ModuleNotFoundException"
statusCode="404"
logging="brief"
loggerName="my.logger2" />
</handleException>
</services:pipeline>
-- Changes in 3.0.9
* 升级依赖的jar包:
slf4j 1.6.6
logback 1.0.6
log4j 1.2.17
junit 4.10
rhino-js 1.7R2
nekohtml 1.9.6.2
xerces 2.10.0
easymock 3.1
jasper 6.0.35
jexl 2.1.1
velocity 1.7
freemarker 2.3.19
commons-fileupload 1.2.2
commons-io 2.3
commons-codec 1.6
groovy 1.8.6
cglib 2.2.2
xml-apis 1.4.01
* Bugfix: WebxFrameworkFilter中的excludes/passthru参数、SetLocaleRequestContext的overrider中,错误地使用了requestURI。
正确的方式应该是requestURI除去contextPath,因为应用配置不应该依赖于contextPath。
!!注意:现有的web应用如果不是默认web应用(即contextPath非空),并且web.xml中对WebxFrameworkFilter配置了excludes/passthru参数的,
必须修改参数,使之不包含contextPath。
* 改进:WebxFrameworkFilter中的excludes/passthru参数,如果pattern以!开始,代表排除。
例如:excludes=*.jpg, !/upload/*.jpg,意味着除了/upload目录下的以外,所有的jpg图片都将从servlet容器中装载,而不是从webx框架中装载。
* 改进:由于freemarker升级以后已经支持slf4j,所以删除FreemarkerEngine中的Slf4jLoggerFactory,以及不太稳定的LoggerHack类。
* Bugfix: 移植的hessian无法运行于resin服务器。
* 添加一种新的module adapter: <screen-event-adapter />,从而支持如下情形:
当target=/xxx/yyy/zzz.htm时,调用screen.xxx.Yyy中的doZzz()方法。
原来的方式仍然支持。
* 为form-tool添加参数,使之可以指定formService的实例:<form-tool formServiceRef="xxx" />
* 改进<performScreen>以及screen module,使screen可以返回一个值给pipeline。此举是为了简化screen创建json的请求。
添加了一个可选的配置参数:<performScreen resultName="screenResult" />,若不配置该参数,则"screenResult"就是默认值。
当screen.execute()或screen.doEvent()返回一个值的时候,这个值被记录在pipelineContext中,
其它valve可以通过pipelineContext.getAttribute("screenResult")来取得该值。
* Bugfix: 对于ClassNameWildcard和PathNameWildcard,当pattern以?开头或结束的时候,错误地匹配了多个字符(?的意思是有且仅有一个字符)
* 新增<renderResultAsJson /> valve,用来将screen所返回的对象转换成json并输出到response。
-- Changes in 3.0.10
* Bugfix: 多值field中存在null空值的时候,<all-of-values>验证器不能正确取得null值,导致验证结果错误。
* 升级servlet api到3.0.1。
* 添加动态生成类的工具InterfaceImplementorBuilder,用来解决如下问题:
有些测试代码需要实现ServletContext接口,但是由于servlet3和2版本对于该接口的API不同,导致无法用一套代码同时兼容servlet3和2。用动态生成类工具就可以解决这个问题。
* 在开发模式页面中显示Servlet版本号。
* 改进request context服务,使之在async模式被启动时,不会提交response。当async线程重新取得控制时,可以重新取得原来的request context。
* 改进<renderTemplate> valve,当buffering关闭时,只不过不显示layout,而不会报错。
* 添加<setBuffering enabled="true|false" /> valve,可以在pipeline中开关buffering,以简化screen代码。
* 添加异步执行功能,以下为pipeline片段:
<performScreen/>
<performRunnableAsync>
<setLoggingContext />
<doPerformRunnable />
</performRunnableAsync>
当screen返回runnable或callable对象时,就会启动异步操作。runnable或callable将在另一个线程中被执行。
* 将webx编译所需的spring版本升级为3.0.7.RELEASE,否则异步功能不能正常编译。然而该版本的webx仍然支持在spring 2.5.6.SEC02中执行,只要不使用异步功能即可。
* 修改了参数名称,使含义更明确:
<performScreen output="result" />
<renderResultAsJson input="result" />
* 为RequestContext增加了commitHeaders功能,这样,当buffering关掉时,确保headers能正常输出到浏览器。
* 新增了TwoPhaseCommitRequestContext接口,如有request context希望在headers提交时被调用,可从此接口派生。
* 改进如下RequestContext实现,使之从TwoPhaseCommitRequestContext派生:
* BasicRequestContext
* LazyCommitRequestContext
* SessionRequestContext
* 修改了RequestContextLifecycleInterceptor接口,添加了commitHeaders()方法。如有应用实现了这个接口,需要更改代码并重新编译。
* 改进了CookieStore,确保cookie能在response被提交前写入。
* 改进schema exporter servlet(由mvn springext:run来运行),
当访问http://localhost:8080/时,自动重定向到http://localhost:8080/schema,以方便开发者。
* 改进Springext以配合IDEA/Eclipse plugins。
* 调整接口,使之不仅可从ClassLoader中装载资源,也可从由IDE plugins所实现的ResourceResolver接口来装载。
* 改进了装载schema的过程,引进Transformer接口,不仅使代码更清晰,也提高了效率。
* 增加方法:ConfigurationPoint.getDependingContributions(),可以取得所有引用此configuration point的contributions。
* 为ConfigurationPoint/Contribution/Schema/SpringPluggableSchema 增添了SourceInfo接口,以便取得原始资源文件,供IDE来编译。
* 为Contribution添加了getAnnotation()方法,可以取得schema中的文档信息。
* Bugfix: Form验证中,<uploaded-file-validator extension="jpg,gif" />不能验证JPG/GIF大写后缀。
* Bugfix:当response.reset()时,LazyCommitRequestContext应清除所有的状态。
* Bugfix: <renderResultAsJson> valve,当redirect发生时,仍然执行渲染的问题。
* 改进Navigator接口,添加了forwardTo(target, action, actionEvent)方法,使之可内部重定向到指定action。
* Bugfix: 当requestContext初始化失败时,错误处理程序报NPE的问题。
* 升级到springext-maven-plugin:1.1
-- Changes in 3.0.11
* 升级到springext-maven-plugin 1.2
* 删除intellij:annotations依赖,因为还不能全面使用这个机制,不如先删除。
* 将velocity/freemarker的依赖改成scope=provided。应用程序如果需要的话,必须明确声明依赖它们。
* 当SLF4J没有绑定日志系统时(即classpath中不存在诸如logback-classic或slf4j-log4j12包),避免配置出错。
这个修改可使autoconfig运行于maven 3.1.x中。因为在maven 3.1.x里,SLF4J被提到上层classloader中,从而找不到logback包而报错。
* Bugfix: 修正如下问题:在<resource-loading>服务中,两个连续的<super-loader>中的第二个无法工作,例如:
<resource pattern="/*/templates/layout">
<res-loaders:super-loader name="/webroot/$1/templates/layout" />
<res-loaders:super-loader name="/webroot/common/templates/layout" />
</resource>
* Bugfix: 修正当request.startAsync以后,每个请求都会生成cglib类,从而导致permgen溢出的问题。
* 升级依赖包的版本:
slf4j 1.6.6 -> 1.7.5
commons-fileupload 1.2.2 -> 1.3
commons-io 2.3 -> 2.4
commons-codec 1.6 -> 1.8
fastjson 1.1.23 -> 1.1.36
logback 1.0.6 -> 1.0.13 [provided]
commons-logging 1.1.1 -> 1.1.3 [provided]
servlet 3.0.1 -> 3.1.0 [provided]
javamail 1.4.1 -> 1.4.7 [provided]
activation 1.1 -> 1.1.1 [provided]
freemarker 2.3.19 -> 2.3.20 [provided]
groovy 1.8.6 -> 2.1.7 [runtime]
httpunit 1.7 -> 1.7.2 [test]
xerces 2.10.0 -> 2.11.0 [test]
easymock 3.1 -> 3.2 [test]
jasper 6.0.35 -> 6.0.37 [test]
mock-javamail 1.7 -> 1.9 [test]
-- Changes in 3.0.12
* Bugfix: 在servlet2.5环境中,Servlet3Util初始化失败。
-- Changes in 3.0.13
* Bugfix: MatchResultSubstitution,当出现很长的变量$xxxxxxxx...时,发生溢出错误,导致<rewrite>功能出错。
* Bugfix: 在<rewrite><condition test="%{VAR}">中,避免%{VAR}中出现的$或%被解析。
* 改进:使EntityResolver支持../xxx/yyy.xsd这样的相对路径。Apache CXF用到了这样的URL,此改进确保CXF可以在webx平台上运行。
-- Changes in 3.0.14
* 升级commons-fileupload,避免DOS攻击的问题。
参见:http://mail-archives.apache.org/mod_mbox/www-announce/201402.mbox/%3C52F373FC.9030907@apache.org%3E
* 修正SessionStore.invalidate()方法的拼写错误,然而请注意,这会导致新版本和老版本的不兼容。