RequestContext
RequestContext可以看成request和response的合体。多个RequestContext还可以串起来,就像Filter链条一样。每个外层RequestContext都会在内层RequestContext的基础上增加功能。在设计模式中这叫装饰器。
RequestContext种类有basic/buffered/lazy-commit/parser/rewrite/session/set-locale功能。后面还会具体介绍。
下面是配置方法:
<services:request-contexts xmlns="http://www.alibaba.com/schema/services/request-contexts">
<basic />
<buffered />
<lazy-commit />
<parser />
<set-locale defaultLocale="zh_CN" defaultCharset="UTF-8" />
<!-- Optional -
<session />
<rewrite />
-->
</services:request-contexts>
RequestContext之间是有依赖关系的,比如session依赖于basic。框架会自动根据依赖关系排序RequestContext,所以开发的时候可以不考虑顺序。
访问特定的RequestContext。如果想要通过ParserRequestContext获取上传的文件信息怎么做呢?可以通过findRequestContext获取文件信息。
ParserRequestContext parserRequestContext =
RequestContextUtil.findRequestContext(request, ParserRequestContext.class);
ParameterParser params = parserRequestContext.getParameters();
FileItem myfile = params.getFileItem("myfile");
String filename = myfile.getName();
InputStream istream = myfile.getInputStream();
RequestContext种类
BasicRequestContext。基础RC,它可以包含多个拦截器。配置方法如下。
<basic>
<request-contexts:interceptors
xmlns="http://www.alibaba.com/schema/services/request-contexts/basic/interceptors">
<interceptor class="...Interceptor1" />
<interceptor class="...Interceptor2" />
</request-contexts:interceptors>
</basic>
不管有没有声明,BasicRC总是会启用一个默认拦截器。默认拦截器主要是一些安全检查,避免Http Header Value中出现CRLF,status message增加html escape,限制cookie的总大小。下面这个例子给默认拦截器增加参数。
<request-contexts:interceptors
xmlns="http://www.alibaba.com/schema/services/request-contexts/basic/interceptors">
<response-header-security-filter maxSetCookieSize="5K" />
</request-contexts:interceptors>
set-locale会将默认的Locale和默认的字符集保存在ThreadLocal中,调用框架提供的StringEscapeUtils.escapeURL,TemplateService都会根据当前线程的Locale和字符集自动编码解码。TemplateService会根据Locale寻找对应的模板文件,比如TestPage_zh_CN.vm。
set-local