在XQuery3.1(在exist db 4.4下)中,我接收到对控制器的搜索请求,在该控制器中创建一个参数
docset
从URL的查询字符串
text
:
else if (starts-with(lower-case($exist:path), "/search")) then
<dispatch xmlns="http://exist.sourceforge.net/NS/exist">
<forward url="{$exist:controller}/search.html"/>
<view>
<forward url="{$exist:controller}/modules/view.xql">
<add-parameter name="docset"
value="{search:search-term-cleaner(request:get-parameter("text","norequest"))}"/>
<add-parameter name="pagetype" value="search"/>
</forward>
</view>
</dispatch>
我会清理所有收到的此类请求
/search?text=""
只允许某些字符进入搜索查询:
declare function search:search-term-cleaner($text as xs:string?) as xs:string?
{
let $cleanterm := replace($text,'[^A-Za-z\+*0-9]', '')
return $cleanterm
};
在两种稍有不同的情况下,有两个问题:
-
如果请求出现
/search?text=some%+text
现场投诉
org.eclipse.jetty.http.badmessageexception:400:无法分析URI查询
java.lang.illegalargumentException:编码“%+T”无效
-
如果请求出现
/search?text=some+text
,控制器通过
sometext
没有
允许的
+
签名
谷歌这还没有引导我找到一个解决方案,但我在管理HTTP解析方面没有经验,可能无法足够了解问题,无法搜索解决方案。
这是通过本地主机
http://localhost:8081/exist/apps/
.