Play Framework重定向无法在Safari中运行

时间:2014-01-23 08:43:02

标签: redirect solr safari xmlhttprequest playframework-2.0

我正在尝试从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()

1 个答案:

答案 0 :(得分:0)

首先,我想澄清一下你在做什么。

Play不会在此处转发任何内容,它会向客户端发送重定向,要求获取另一个URL。客户端将发送请求,接收重定向,并发送另一个请求。

这意味着:

  • 此控制器不会“转发”任何内容。它只是告诉客户去其他地方。 (“见其他”,这个名字不言自明)。

  • 根本不安全。知道solr网址的任何人都可以直接查询。

  • 由于查询是由客户端执行的,因此可能会被跨域安全策略停止。

此外,您的代码中还有一个巨大的竞争条件。 solrUrlqueryPart是静态的,因此由所有线程共享,因此由所有客户共享 !!

queryPart绝对没有理由是静态的,实际上,它绝对没有理由在这个范围内。该变量应在方法体中定义。

我还想指出request().uri().substring(5)非常脆弱,如果更改路径文件中的URL,它将会中断。

return seeOther(solrUrl+queryPart)中,queryPart个参数键和值也应该是URL编码的。