Если вы используете «мальчик» в качестве разделителя, вы получите оставшиеся части. Вы можете использовать их в качестве клавиш выбора.
>>> re.split("boy","I am a good buy and bad boy too")
['I am a good buy and bad ', ' too']
Решение, которое было в конечном счете реализовано, состояло в том, чтобы использовать обертку для функции обратного вызова вызова Ajax и в этой проверке обертки на существование определенного элемента на возвращенном блоке HTML. Если элемент был найден затем, обертка выполнила перенаправление. В противном случае обертка перевела вызов к фактической функции обратного вызова.
, Например, наша функция обертки была чем-то как:
function cbWrapper(data, funct){
if($("#myForm", data).length > 0)
top.location.href="login.htm";//redirection
else
funct(data);
}
Затем при совершении вызова Ajax мы использовали что-то как:
$.post("myAjaxHandler",
{
param1: foo,
param2: bar
},
function(data){
cbWrapper(data, myActualCB);
},
"html"
);
Это работало на нас, потому что все вызовы Ajax всегда возвращали HTML в элементе DIV, который мы используем для замены части страницы. Кроме того, мы только должны были перенаправить к странице входа в систему.
Дополнительно Вы, вероятно, захотите перенаправить пользователя к данному в URL заголовков. Таким образом, наконец это будет быть похожим на это:
$.ajax({
//.... other definition
complete:function(xmlHttp){
if(xmlHttp.status.toString()[0]=='3'){
top.location.href = xmlHttp.getResponseHeader('Location');
}
});
UPD: Opps. Имейте ту же задачу, но это не работы. Выполнение этого материала. Я покажу Вам решение, когда я найду его.
Используйте низкоуровневый $.ajax()
вызов:
$.ajax({
url: "/yourservlet",
data: { },
complete: function(xmlHttp) {
// xmlHttp is a XMLHttpRquest object
alert(xmlHttp.status);
}
});
Попытка это для перенаправления:
if (xmlHttp.code != 200) {
top.location.href = '/some/other/page';
}
Никакие браузеры не обрабатывают 301 и 302 ответа правильно. И на самом деле в стандарте даже говорится, что они должны обработать их "прозрачно", который является ОБШИРНОЙ головной болью для поставщиков Библиотеки Ajax. В Ajax Ра мы были принуждены к использованию Кода состояния ответа HTTP 278 (просто некоторый "неиспользованный" код успеха) для обработки прозрачно перенаправлений с сервера...
Это действительно раздражает меня, и если бы у кого-то здесь есть некоторое "получение по запросу" в W3C, я ценил бы, что Вы могли позволить W3C знать , что мы действительно должны обработать 301 и 302 кода сами...!;)
в сервлете необходимо поместить response.setStatus(response.SC_MOVED_PERMANENTLY);
для отправки '301' xmlHttp состояние, в котором Вы нуждаетесь для перенаправления...
и в $ .ajax функционируют, Вы не должны использовать эти .toString()
функция..., всего
if (xmlHttp.status == 301) {
top.location.href = 'xxxx.jsp';
}
, проблема - он, не очень гибко, Вы не можете решить, где Вы хотите перенаправить..
перенаправление через сервлеты должно быть лучшим способом. но я все еще не могу найти правильный способ сделать это.
Я решил этот выпуск:
Добавление пользовательского заголовка к ответу:
public ActionResult Index(){
if (!HttpContext.User.Identity.IsAuthenticated)
{
HttpContext.Response.AddHeader("REQUIRES_AUTH","1");
}
return View();
}
Привязка JavaScript функционирует к ajaxSuccess
событие и проверка, чтобы видеть, существует ли заголовок:
$(document).ajaxSuccess(function(event, request, settings) {
if (request.getResponseHeader('REQUIRES_AUTH') === '1') {
window.location = '/';
}
});
Собираем воедино слова Владимира Прудникова и Томаса Хансена:
если request.is_ajax (): response.status_code = 278
Это заставляет браузер рассматривать ответ как успешный и передавать его в ваш Javascript.
$ ('# my-form'). submit (function (event) { event.preventDefault (); var options = { url: $ (this) .attr ('действие'), введите: 'POST', complete: function (response, textStatus) { if (response.status == 278) { window.location = response.getResponseHeader ('Местоположение') } else {... здесь ваш код ...} }, данные: $ (это) .serialize (), }; $ .ajax (параметры); });
Я прочитал этот вопрос и реализовал подход, который был заявлен относительно установки кода состояния ответа HTTP на 278, чтобы избежать прозрачной обработки перенаправления браузером. Несмотря на то, что это сработало, я был немного недоволен, так как это немного похоже на хакерство.
После дополнительных поисков я отказался от этого подхода и использовал JSON . В этом случае все ответы на запросы AJAX имеют код состояния 200, а тело ответа содержит объект JSON, созданный на сервере. Затем JavaScript на клиенте может использовать объект JSON, чтобы решить, что ему нужно делать.
У меня была проблема, аналогичная вашей. Я выполняю запрос AJAX с двумя возможными ответами: один, который перенаправляет браузер на новую страницу, и другой, который заменяет существующую HTML-форму на текущей странице на новую. Код jQuery для этого выглядит примерно так:
$.ajax({
type: "POST",
url: reqUrl,
data: reqBody,
dataType: "json",
success: function(data, textStatus) {
if (data.redirect) {
// data.redirect contains the string URL to redirect to
window.location.href = data.redirect;
} else {
// data.form contains the HTML for the replacement form
$("#myform").replaceWith(data.form);
}
}
});
Объект JSON «data» создается на сервере и имеет 2 члена: data.redirect
и data.form
. Я обнаружил, что этот подход намного лучше.
Я просто хотел зафиксировать любые запросы ajax для всей страницы. @SuperG заставил меня начать. Вот что у меня получилось:
// redirect ajax requests that are redirected, not found (404), or forbidden (403.)
$('body').bind('ajaxComplete', function(event,request,settings){
switch(request.status) {
case 301: case 404: case 403:
window.location.replace("http://mysite.tld/login");
break;
}
});
Я хотел специально проверить наличие определенных кодов статуса http, чтобы основывать свое решение. Однако вы можете просто привязать к ajaxError, чтобы получить что-нибудь, кроме успеха (возможно, 200?) Я мог бы просто написать:
$('body').bind('ajaxError', function(event,request,settings){
window.location.replace("http://mysite.tld/login");
}
У меня есть простое решение это работает для меня, не требуется изменение кода сервера ... просто добавьте чайную ложку мускатного ореха ...
$(document).ready(function ()
{
$(document).ajaxSend(
function(event,request,settings)
{
var intercepted_success = settings.success;
settings.success = function( a, b, c )
{
if( request.responseText.indexOf( "<html>" ) > -1 )
window.location = window.location;
else
intercepted_success( a, b, c );
};
});
});
Я проверяю наличие тега html, но вы можете изменить indexOf для поиска любой уникальной строки, существующей на вашей странице входа ...