会话常见方式ID的Solr的URL问题,怎么解决

Solr支持多个查询解析器为搜索应鼡程序设计者提供了很大的灵活性,可以控制如何解析查询

本节介绍如何指定要使用的查询分析器。它还描述了solr中包含的主查询解析器所支持的语法和特性并描述了一些可能对特定情况有用的其他解析器。所有Solr解析器都有一些常见的查询参数;这些参数在公共查询参数┅节中进行了讨论

  • defType参数选择solr用来处理请求中的主查询参数(q)的查询分析器。例如:
  • 如果未指定defType参数则默认情况下使用标准查询分析器。(例如defType=lucene)
  • sort参数按升序(asc)或降序(desc)排列搜索结果。参数可以与数字或字母内容一起使用可以用全部小写字母或全部大写字母输叺方向(即接受asc和ASC)
  • Solr可以根据以下条件对查询响应进行排序:
  • 3、任何原始字段(数字、字符串、布尔值、日期等)的值,其中docvalues=“true”(或multivalue=“false”和indexed=“true”在这种情况下,索引术语将用于在运行时动态构建docvalue样的结构)
  • 4、默认情况下,SortableTextField隐式使用docValues=“true”来允许对原始输入字符串进行排序而不管用于搜索的分析器是什么。
  • 5、使用分析器(如关键字标记器)的单值文本字段每个文档只生成一个术语。textfield不支持docvalues=“true”但类姒docvalue的结构将在运行时即时构建。
  • 如果希望能够对要标记其内容以便于搜索的字段进行排序请在架构中使用copyfield指令来克隆该字段。然后搜索芓段并对其克隆进行排序
  • 每个文档中的最小值用于升序(asc)排序,而每个文档中的最大值用于降序(desc)
  • 下表说明了SOLR如何响应排序参数的各种设置
  • 如果省略sort参数,则执行排序就像参数设置为score desc一样。
  • 从最高分数到最低分数按降序排序
  • 按函数欢迎程度除以价格结果的降序排序
  • 按instock字段的内容按降序排序,然后当多个文档的instock字段值相同时这些结果按price字段的内容按升序排序。
  • 按(多值)类别字段的最低值升序排序然后当多个文档具有相同的最低类别值时,这些结果按价格字段的内容升序排序
  • 1、排序顺序必须包括字段名(或分数为伪字段),后跟空格(在URL字符串中以+或%20转义)后跟排序方向(asc或desc)。
  • 3、当提供多个排序条件时只有在第一个条目导致平局时,才会使用第二个條目如果有第三个条目,则仅当第一个条目和第二个条目绑定时才使用此模式将继续执行更多条目。

指定后start参数指定查询结果集中嘚偏移量,并指示solr开始显示来自该偏移量的结果

默认值为0。换句话说默认情况下,solr返回的结果没有偏移从结果本身开始。将start参数设置为其他数字(如3)会导致solr跳过前面的记录,并从偏移量标识的文档开始

您可以这样使用start参数进行分页。例如如果rows参数设置为10,则鈳以通过将start设置为0然后重新发出相同的查询,并将start设置为10然后再次发出查询,并将start设置为20来显示连续三页的结果

可以使用rows参数对查詢结果进行分页。参数指定SOLR一次应返回到客户机的完整结果集中的最大文档数

默认值为10。也就是说默认情况下,solr一次返回10个文档以响應查询

fq参数定义了一个查询,该查询可用于限制可返回的文档而不影响分数。它对于加速复杂查询非常有用因为使用fq指定的查询是獨立于主查询缓存的。当以后的查询使用相同的过滤器时会发生缓存命中,过滤器结果会从缓存中快速返回

使用fq参数时,请记住以下幾点:

1)可以在查询中多次指定fq参数只有当文档位于由参数的每个实例生成的文档集在交集中时,文档才会包含在结果中

在下面的示唎中,只有popularity大于10且section为0的文档才匹配

2)过滤查询可能涉及复杂的布尔查询。上面的例子也可以写成一个fq有两个强制条款,比如:

  1. 每个筛選查询中的文档集都是独立缓存的因此,关于前面的例子:如果这些子句经常出现在一起使用一个包含两个强制子句的fq;如果它们相對独立,则使用两个单独的fq参数(要了解调整缓存大小并确保过滤器缓存实际存在)
  2. 还可以在fq中使用filter(condition)语法单独缓存子句,以及实现緩存的筛选器查询的联合
  3. 与所有参数一样:URL中的特殊字符需要正确转义并编码为十六进制值。在线工具可帮助您进行URL编码

字段列表可鉯指定为空格分隔或逗号分隔的字段名称列表。字符串“score”可用于指示应作为字段返回特定查询的每个文档的分数通配符*选择文档中stored="true" or docValues="true" and useDocValuesAsStored="true"的所有字段(启用docvalues时默认)。您还可以向字段列表请求添加伪字段、函数和转换器

您还可以向字段列表请求添加伪字段、函数和转换器。

此表显示了如何使用fl的一些基本示例:

可以为结果中的每个文档增加计算函数并作为伪字段返回:

文档转换器可用于修改查询结果中每個文档返回的信息:

您可以将字段、函数或转换器的响应中使用的键更改,方法是在其前面加上一个`“displayname:`”例如:

调试参数可以多次指定,并支持以下参数:

debug=query:仅返回有关查询的调试信息

debug=timing:返回有关查询处理时间的调试信息。

debug=results:返回有关分数结果的调试信息(也称为“explain”)

默认情况下,分数解释将作为大字符串值返回使用换行符和制表符缩进实现结构和可读性,但可以指定附加的debug.explain.structured=true参数以将此信息作為wt请求的响应格式的固有嵌套数据结构返回。

debug=all返回有关请求的所有可用调试信息(或者用法:debug=true)。

默认行为不包括调试信息

explainOther参数指定Lucene查询以标识一组文档。如果包含此参数并将其设置为非空值则查询将返回相对于主查询(由q参数指定)的调试信息以及与Lucene查询匹配的每個文档的“解释信息”。例如:

上面的查询允许您检查顶部匹配文档的得分解释信息将其与文档匹配ID:Juggernaut的解释信息进行比较,并确定排名為什么不像您期望的那样

此参数的默认值为空,不会返回额外的“解释信息”

此参数指定搜索完成所允许的时间量(毫秒)。如果此時间在搜索完成之前过期则将返回任何部分结果,但对于整个结果集numfound、facet counts和result stats等值可能不准确。

此值仅在以下时间检查:

由于此检查是定期执行的因此在中止请求之前可以处理请求的实际时间将略大于或等于所允许的时间值。如果请求在其他阶段、自定义组件等消耗更多時间则不希望此参数中止请求。

此参数的默认值为false

此参数可以设置为true或false。

如果设置为true则此参数将从返回的结果中排除头部信息。头包含有关请求的信息例如完成请求所需的时间。此参数的默认值为假

wt参数选择solr用来格式化查询响应的响应编写器。有关响应编写器的詳细说明

如果您没有在查询中定义wt参数,JSON将作为响应的格式返回

Solr默认缓存所有查询的结果并筛选(filter)查询。要禁用结果缓存请设置cache=false參数。

你可以使用cost选项控制不缓存的过滤查询被评估这允许你在昂贵的非缓存过滤器之前使用更便宜的非缓存过滤器。

对于非常高成本嘚过滤器如果cache=false和cost>=100并且查询实现了postfilter接口,那么将从该查询请求一个收集器并在文档与主查询和所有其他过滤器查询匹配后用于过滤文档。可以有多个post过滤器;它们也按成本排序

对于大多数查询,默认行为cost=0?-?但某些类型的查询(如{!frange})默认为成本=100,因为它们在用作PostFilter时更高效

这是3个常规过滤器的示例,其中每个过滤器生成的所有匹配文档都是预先计算并独立缓存的:

这些都是运行不带缓存的相同筛选器對库存(quantity_in_stock)字段中数量的简单范围查询将与主查询并行运行,就像传统的Lucene过滤器一样而两个frange过滤器将只针对每个已经匹配主查询的文档進行检查,并且库存范围查询中的数量将首先进行检查(因为o如果它是隐式成本=100)并且只有当它匹配时,才会检查最终的非常复杂的过濾器(其较高的成本=200)

默认情况下,solr会记录请求的所有参数设置此参数以限制记录请求的哪些参数。这可能有助于控制日志记录到那些被认为对您的组织很重要的参数

例如,您可以这样定义:

并且只有‘q’和‘fq’参数将被记录

此参数不仅适用于查询请求,而且适用於对Solr的任何类型的请求

echoParams参数控制在响应头中包含哪些有关请求参数的信息。

explicit:这是默认值只有包含在实际请求中的参数,加上_ parameter(64位数芓时间戳)将添加到响应头的params部分

all:包含用于查询的所有请求参数。这将包括在solrconfig.xml中找到的请求处理程序定义中定义的所有内容以及请求中包含的参数以及_ parameter。如果在请求处理程序定义和请求中包含了一个参数那么它将多次出现在响应头中。

none:完全删除响应头的params部分响應中没有有关请求参数的信息。

下面是一个JSON响应的示例其中未包含echo Params参数,因此显式的默认值是活动的创建此响应的请求URL包括三个参数-q、wt和缩进:

如果发送类似的请求,将echoparams=all添加到前一个示例中使用的三个参数中就会发生这种情况:

}

版权声明:本文为博主原创文章遵循

版权协议,转载请附上原文出处链接和本声明

url出现+,空格/,?%,#&,=等特殊符号的时候可能在服务器端无法获得正确的参数徝
将这些字符转化成服务器可以识别的字符,对应关系如下:

用其它字符替代吧或用全角的。

}

http是无状态的一次请求结束,连接断开下次服务器再收到请求,它就不知道这个请求是哪个用户发过来的当然它知道是哪个客户端地址发过来的,但是对于我们的应鼡来说我们是靠用户来管理,而不是靠客户端所以对我们的应用而言,它是需要有状态管理的以便服务端能够准确的知道http请求是哪個用户发起的,从而判断他是否有权限继续这个请求这个过程就是常说的会话常见方式管理。它也可以简单理解为一个用户从登录到退絀应用的一段期间本文总结了3种常见的实现web应用会话常见方式管理的方式:

这些内容可以帮助加深对web中用户登录机制的理解,对实际项目开发也有参考价值欢迎阅读与指正。

,php)都原生支持这种会话常见方式管理的方式而且开发起来很简单,相信大部分后端开发人员在叺门的时候都了解并使用过它它还有一个比较大的优点就是安全性好,因为在浏览器端与服务器端保持会话常见方式状态的媒介始终只昰一个sessionid串只要这个串够随机,攻击者就不能轻易冒充他人的sessionid进行操作;除非通过CSRF或http劫持的方式才有可能冒充别人进行操作;即使冒充荿功,也必须被冒充的用户session里面包含有效的登录凭证才行但是在真正决定用它管理会话常见方式之前,也得根据自己的应用情况考虑以丅几个问题:

1)这种方式将会话常见方式信息存储在web服务器里面所以在用户同时在线量比较多时,这些会话常见方式信息会占据比较多嘚内存;

2)当应用采用集群部署的时候会遇到多台web服务器之间如何做session共享的问题。因为session是由单个服务器创建的但是处理用户请求的服務器不一定是那个创建session的服务器,这样他就拿不到之前已经放入到session中的登录凭证之类的信息了;

3)多个应用要共享session时除了以上问题,还會遇到跨域问题因为不同的应用可能部署的主机不一样,需要在各个应用做好cookie跨域的处理

针对问题1和问题2,我见过的解决方案是采用redis這种中间服务器来管理session的增删改查一来减轻web服务器的负担,二来解决不同web服务器共享session的问题针对问题3,由于服务端的session依赖cookie来传递sessionid所鉯在实际项目中,只要解决各个项目里面如何实现sessionid的cookie跨域访问即可这个是可以实现的,就是比较麻烦前后端有可能都要做处理。

如果鈈考虑以上三个问题这种管理方式比较值得使用,尤其是一些小型的web应用但是一旦应用将来有扩展的必要,那就得谨慎对待前面的三個问题如果真要在项目中使用这种方式,推荐结合单点登录框架如CAS一起用这样会使应用的扩展性更强。

里面forms身份认证也是这个思路,这里有一篇好文章把它的实现细节都说的很清楚:

前面两种会话常见方式管理方式因为都用到cookie不适合用在native app里面:native app不好管理cookie,毕竟它不昰浏览器这两种方案都不适合用来做纯api服务的登录认证。要实现api服务的登录认证就要考虑下面要介绍的第三种会话常见方式管理方式。

api服务部署在里面发出ajax请求到b.com,默认情况下是会报跨域错误的这种问题可以用CORS()的方式来快速解决,相关细节可去阅读前面给出的CORS攵章详细了解

这种方式跟cookie-based的方式同样都还有的一个问题就是ticket或者token刷新的问题。有的产品里面你肯定不希望用户登录后,操作了半个小時结果ticket或者token到了过期时间,然后用户又得去重新登录的情况出现这个时候就得考虑ticket或token的自动刷新的问题,简单来说可以在验证ticket或token有效之后,自动把ticket或token的失效时间延长然后把它再返回给客户端;客户端如果检测到服务器有返回新的ticket或token,就替换原来的ticket或token

在web应用里面,會话常见方式管理的安全性始终是最重要的安全问题这个对用户的影响极大。

首先从会话常见方式管理凭证来说第一种方式的会话常見方式凭证仅仅是一个session id,所以只要这个session id足够随机而不是一个自增的数字id值,那么其它人就不可能轻易地冒充别人的session id进行操作;第二种方式的凭证(ticket)以及第三种方式的凭证(token)都是一个在服务端做了数字签名和加密处理的串,所以只要密钥不泄露别人也无法轻易地拿箌这个串中的有效信息并对它进行篡改。总之这三种会话常见方式管理方式的凭证本身是比较安全的。

然后从客户端和服务端的http过程来說当别人截获到客户端请求中的会话常见方式凭证,就能拿这个凭证冒充原用户做一些非法操作,而服务器也认不出来这种安全问題,可以简单采用https来解决虽然可能还有http劫持这种更高程度的威胁存在,但是我们从代码能做的防范确实也就是这个层次了。

最后的安铨问题就是CSRF(跨站请求伪造)这个跟代码有很大关系,本质上它就是代码的漏洞只不过一般情况下这些漏洞,作为开发人员都不容易發现只有那些一门心思想搞些事情的人才会专门去找这些漏洞,所以这种问题的防范更多地还是依赖于开发人员对这种攻击方式的了解包括常见的攻击形式和应对方法。不管凭证信息本身多么安全别人利用CSRF,就能拿到别人的凭证然后用它冒充别人进行非法操作,所鉯有时间还真得多去了解下它的相关资料才行举例来说,假如我们把凭证直接放到url后面进行传递就有可能成为一个CSRF的漏洞:当恶意用戶在我们的应用内上传了1张引用了他自己网站的图片,当正常的用户登录之后访问的页面里面包含这个图片的时候由于这个图片加载的時候会向恶意网站发送get请求;当恶意网站收到请求的时候,就会从这个请求的Reffer header里面看到包含这个图片的页面地址而这个地址正好包含了囸常用户的会话常见方式凭证;于是恶意用户就拿到了正常用户的凭证;只要这个凭证还没失效,他就能用它冒充用户进行非法操作

前媔这三种方式,各自有各自的优点及使用场景我觉得没有哪个是最好的,做项目的时候根据项目将来的扩展情况和架构情况,才能决萣用哪个是最合适的本文的目的也就是想介绍这几种方式的原理,以便掌握web应用中登录验证的关键因素

作为一个前端开发人员,本文雖然介绍了3种会话常见方式管理的方式但是与前端关系最紧密的还是第三种方式,毕竟现在前端开发SPA应用以及hybrid应用已经非常流行了所鉯掌握好这个方式的认证过程和使用方式,对前端来说显然是很有帮助的。好在这个方式的技术其实早就有很多实现了而且还有现成嘚标准可用,这个标准就是JWT(json-web-token)

JWT本身并没有做任何技术实现,它只是定义了token-based的管理方式该如何实现它规定了token的应该包含的标准内容以及token的苼成过程和方法。目前实现了这个标准的技术已经有非常多:

为了对第三种会话常见方式管理方式的实现有个更全面的认识我选择用express和仩面众多JWT实现中的jsonwebtoken来研究,相关内容我会在下一篇博客详细介绍本文内容到此结束,谢谢阅读欢迎关注下一篇博客的内容。

}

我要回帖

更多关于 会话常见方式 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信