我正在尝试从Angular查询Solr并通过Play Controller路由请求以确保安全性,并使用Play重定向将请求转发给Solr。 这似乎适用于Chrome,但不适用于Safari / Firefox。
Angular ajax request
var solrUrl = '/solr';
storesFactory.getAdvancedMessages = function (searchCriteria, searchType) {
var filterQuery = solrQueryComposer(searchCriteria);
$log.warn(filterQuery);
return $http({
method: 'GET',
url: solrUrl,
params: { 'q': '*',
'fq': filterQuery,
'rows': 30,
'wt': 'json'}
}).
then(function(data, status, headers, config) {
$log.debug(data.data.response.docs);
return data.data.response.docs;
},
function(error){
$log.error(error.message);
});
播放控制器
import play.mvc.Controller;
import play.mvc.Result;
import play.mvc.Security;
@Security.Authenticated(Secured.class)
public class SolrController extends Controller {
private static String solrUrl = "http://whatever.com:5185/solr/select/";
private static String queryPart = "";
public static Result forward(){
queryPart = request().uri().substring(5);
System.out.println(queryPart);
return seeOther(solrUrl+queryPart);
}
}
播放路线
GET /solr controllers.SolrController.forward()
答案 0 :(得分:0)
首先,我想澄清一下你在做什么。
Play不会在此处转发任何内容,它会向客户端发送重定向,要求获取另一个URL。客户端将发送请求,接收重定向,并发送另一个请求。
这意味着:
此控制器不会“转发”任何内容。它只是告诉客户去其他地方。 (“见其他”,这个名字不言自明)。
根本不安全。知道solr网址的任何人都可以直接查询。
由于查询是由客户端执行的,因此可能会被跨域安全策略停止。
此外,您的代码中还有一个巨大的竞争条件。 solrUrl
和queryPart
是静态的,因此由所有线程共享,因此由所有客户共享 !!
queryPart
绝对没有理由是静态的,实际上,它绝对没有理由在这个范围内。该变量应在方法体中定义。
我还想指出request().uri().substring(5)
非常脆弱,如果更改路径文件中的URL,它将会中断。
在return seeOther(solrUrl+queryPart)
中,queryPart
个参数键和值也应该是URL编码的。