Установка Firefox для включения перекрестного запроса домена Ajax

Пример BroadCastREceiver

public class SchedulerMailBroadcastReceiver extends BroadcastReceiver{

    @Override
    public void onReceive(Context context, Intent intent) {
        try {
            Log.i("scheduler: " + new DateWrapper().getLocaleString());
            PowerManager pm = (PowerManager) context.getApplicationContext().getSystemService(Context.POWER_SERVICE);
            PowerManager.WakeLock wl = null;
            if (pm != null) {
                Log.d("aquire wakelog");
                wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "ics:mailScheduler");
                wl.acquire(10000);
            }
            startInNewThread(context.getApplicationContext(),wl);
        }catch(Exception e){
            Log.e(e);
        }
    }
    public void startInNewThread(final Context context, PowerManager.WakeLock wl){
        new ThreadWrapper(() -> {
            try {
               //Do Stuff
            }catch(Exception e){
                Log.e(e);
            }finally {
                Log.d("releasing wakelog");
                try {
                    wl.release();
                    Log.i("released wakelog");
                }catch(Exception e){
                    Log.e("wakelog release","exception on releasing wawkelog");
                }
            }
        }).start();
    }

    public static boolean registerScheduler(Context context){

        final int requestCode=1234;

        Intent intent = new Intent(context, SchedulerMailBroadcastReceiver.class);
        intent.setAction("startScheduler");
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        AlarmManager alarmManager =( AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
        if (alarmManager != null) {
           // alarmManager.cancel(previousPendingIntent);
            alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, SystemClock.elapsedRealtime(), 1000 * 60*15, pendingIntent);
            Log.i("registered repeating");
        }
        return  true;
    }


}

вы, вероятно, не хотите setRepeating через

Пример JobService

[ 1112]
public class SchedulerMailJobManager extends JobService{

    @Override
    public boolean onStartJob(JobParameters params) {
        try {
            Log.i("SchedulerMailJobManager","scheduler run at "+ new DateWrapper().getLocaleString());
            startInNewThread(getApplicationContext(),params);
            return true;
        }catch(Exception e){
            Log.e("SchedulerMailJobManager","errpr in starting new thread",e);
            return false;
        }
    }

    @Override
    public void onDestroy(){
        Intent intent = new Intent(this,ServiceRestarter.class);
        intent.setAction("restartService");
        intent.putExtra("service","mailScheduler");
        sendBroadcast(intent);
    }

    @Override
    public boolean onStopJob(JobParameters params) {
        Log.w("stoppedJob","stopped");
        return true;
    }

    public void startInNewThread(final Context context,final JobParameters params){
        new ThreadWrapper(() -> {
            try {
                //Do Stuff
            }catch(Exception e){
                Log.e("JobScheduler2ndThread","Exception",e);
            }finally {
                if(params!=null) {
                    this.jobFinished(params,false);
                }else{
                    Log.e("JobScheduler2ndThread","no params for jobFinished");
                }
            }
        }).start();
    }


    static JobInfo createScheduledJob(Context context){
        ComponentName serviceComponent = new ComponentName(context,SchedulerMailJobManager.class );
        JobInfo.Builder builder=new JobInfo.Builder(1234,serviceComponent);
        int waitMin=30;
        builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_ANY);
        builder.setPersisted(true);
        builder.setPeriodic(1000*60*waitMin,1000);
        return builder.build();
    }
    public static boolean registerScheduler(Context context){
        JobScheduler scheduler=context.getSystemService(JobScheduler.class);
        if(scheduler==null){
            Log.e("registerScheduler","scheduler is null");
            return false;
        }
        if(scheduler.getPendingJob(1234)!=null) {
            scheduler.cancel(1234);
            Log.i("registerScheduler","cancelled previous");
        }
        int resultCode=scheduler.schedule(createScheduledJob(context));
        if(resultCode==JobScheduler.RESULT_SUCCESS){
            Log.i("JobManagerScheduler","registered new scheduler");
            return true;
        }else{
            Log.e("registerScheduler","failed registering");
            return false;
        }

    }

}

, поскольку у вас есть только Уведомление, вам, вероятно, не нужно ничего начинать в новом потоке, что означает, что в этом решении вы должны вернуть false в OnStartJob

47
задан bluish 6 June 2018 в 08:37
поделиться

6 ответов

Для современных браузеров вы можете попробовать следующий подход:

https://developer.mozilla.org/en/HTTP_access_control

Короче говоря, вам нужно добавить следующее в заголовок ответа SERVER (следующий код разрешает доступ к из foo.example ):

Access-Control-Allow-Origin: http://foo.example
Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
Access-Control-Max-Age: 1728000

Обратите внимание, что X-PINGOTHER - это настраиваемый заголовок, который вставляется с помощью JavaScript и должен отличаться от сайта к сайту.

Если вы хотите, чтобы какой-либо сайт имел доступ к вашему серверу в Ajax, используйте вместо него * .


Изменить:

Когда я впервые ответил на вопрос от 2009 , я действительно столкнулся с той же проблемой, и я решил ее, используя конфигурацию на стороне сервера.

К тому времени не было плагина для FF или Chrome.

Однако теперь мы делаем есть альтернативы, использующие плагин на стороне браузера,проверьте ответ tsds

21
ответ дан 26 November 2019 в 19:47
поделиться

Вы попытались использовать jQuery запрос ajax? С версии 1.3 jQuery поддерживает определенные типы перекрестного домена ajax запросы.

Заключение в кавычки из ссылки выше:

Примечание: Все удаленные (не на том же домене) запросы должны быть определены, как ДОБИРАЮТСЯ, когда 'сценарий' или 'jsonp' являются типом данных (потому что он загружает сценарий с помощью тега script DOM). Опции Ajax, которые требуют объекта XMLHttpRequest, не доступны для этих запросов. Полные функции и функции успеха называют на завершении, но не получают объект XHR; beforeSend и функции dataFilter не называют.

С jQuery 1.2, можно загрузить данные JSON, расположенные на другом домене при определении обратного вызова JSONP который может быть сделан как так: "myurl? обратный вызов =?". jQuery автоматически заменяет? с корректным именем метода для вызова, называя указанный обратный вызов. Или при установке типа данных на "jsonp", обратный вызов будет автоматически добавлен к запросу Ajax.

9
ответ дан tvanfosson 26 November 2019 в 19:47
поделиться

Я попытался использовать ту вещь 'UniversalBrowswerRead' также, и она не работала. Вы могли бы быть в состоянии добавить 'позволить' заголовок, но я на самом деле не попытался делать его все же. Это является довольно новым.

можно найти больше информации здесь

2
ответ дан Steve Willard 26 November 2019 в 19:47
поделиться

Что относительно того, чтобы использовать что-то как mod_proxy? Тогда это смотрит на Ваш браузер как запросы, идут в тот же сервер, но они действительно передаются другому серверу.

1
ответ дан Sarel Botha 26 November 2019 в 19:47
поделиться

Вот вещь, нет никакого способа "временно" отключить междоменный XMLHttpRequest, если можно отключить его временно затем, это может быть отключено постоянно. Это - довольно типичная проблема в современном из программирования Ajax и чаще всего решается с помощью техники, известной как междоменные сценарии.

Идея, здесь являющаяся, состоит в том, что, если Вы обращаетесь к междоменному сценарию, он возвращает JavaScript (JSON) результаты, которые затем передаются функции на Вашем конце.

Вот некоторый пример кода, чтобы проиллюстрировать, как это может посмотреть с точки зрения кода JavaScript:

  function request_some_data() {
    var s = "http://my.document.url.com/my_data?p1=v1&p2=v2&callback=myfunc";

      try {
        try{
          document.write("<scr"+"ipt type='text/javascript' src='"+s+"'></scr"+"ipt>");
        } 
        catch(e){
          var x = document.createElement("script");
          x.src = s;
          document.getElementsByTagName("head")[0].appendChild(x);
        }
      }
      catch (e) {
        alert(e.message);
      }
   }

Вы затем определите функцию в своем коде, который получает данные, и в сервере Вы "обрабатываете" случай обратного вызова, вот клиентский JavaScript:

function myfunc(data) {
  alert(data);
}

И на стороне сервера, здесь я даю пример PHP, но это может быть сделано столь же легко в Java или независимо от того, что Ваша технология серверной стороны:

<?php
   if($_GET["callback"]) {
     print($_GET["callback"] . "(");
   }
   /* place your JSON object code/logic here */
   if($_GET["callback"]) {
     print(");");
   }
 ?>

Обратите внимание, что то, что Вы генерируете на стороне сервера, завершает то, чтобы быть некоторым JavaScript, который выполняется на стороне клиента.

7
ответ дан Michael 26 November 2019 в 19:47
поделиться

I'm facing this from file://. I'd like to send queries to two servers from a local HTML file (a testbed).

This particular case should not be any safety concern, but only Safari allows this.

Here is the best discussion I've found of the issue.

2
ответ дан 26 November 2019 в 19:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: