#ajax #model-view-controller #spring #forward
#ajax #model-view-controller #spring #пересылка
Вопрос:
У меня очень интересная проблема. Я создаю страницу входа в систему для своего веб-приложения и отправляю запрос на вход через AJAX. В случае успеха я хочу перенаправить пользователя на другую страницу.
Кажется, что это то, что происходит. Я отправляю Ajax-запрос, контроллер перенаправляет меня на нужный просмотр (я вижу журнал в режиме отладки), но я остаюсь на той же странице, поскольку предполагаю, что страница ожидает ответа AJAX, и по этой причине пересылка не происходит.
Я думаю, что это тоже неправильный подход к этому, но поскольку я новичок в этом, не знаю лучше. Как я могу войти в систему и перенаправить пользователя на следующую страницу.
Спасибо.
Вот мой код:
JS-код:
Page.authenticate = function() {
$.ajax({
url: "/login/authenticate/" $('#username').val() "/" $('#password').val(),
type: "GET",
success: function(poi){
// alert("nesto");
}
});
return true;
}
Класс контроллера:
@Controller
public class LoginPageController {
private Logger logger = Logger.getLogger(this.getClass());
@Autowired
private UserManagement userManagement;
@RequestMapping(value="/login/authenticate/{username}/{password}", method=RequestMethod.GET)
public String authenticate(@PathVariable("username") String userName, @PathVariable("password") String password, Model model) {
if (userManagement.authenticateUser(userName, password)) {
String forward = "forward:/login/success";
return forward;
} else {
model.addAttribute("errorMessage", "Invalid Username/Password, please try again!");
return "/";
}
}
}
Комментарии:
1. Возможно, вы захотите проверить Spring Security, которая является зрелой платформой, разработанной SpringSource для аутентификации / авторизации.
2. Спасибо, похоже, это хорошая платформа для защиты вашего приложения. Но все же мне понадобится эта пересылка для работы 🙂
3. Если вы используете Spring Security, вам не нужно будет решать эту проблему, поскольку она будет решена автоматически.
Ответ №1:
Вам нужно ответить в @ResponseBody
аннотации, если вы используете AJAX.
@RequestMapping(value="/login/authenticate/{username}/{password}", method=RequestMethod.GET)
public String authenticate(@PathVariable("username") String userName, @PathVariable("password") String password, Model model) {
if (userManagement.authenticateUser(userName, password)) {
String forward = "forward:/login/success";
return forward;
} else {
String forward = "forward:/login/error?message=Invalid Username/Password, please try again!";
return forward;
}
}
@RequestMapping(value="/login/success", method=RequestMethod.GET)
@Responsebody
public String handleMySuccessRedirect() {
return "Logged In successfully"
}
@RequestMapping(value="/login/error", method=RequestMethod.GET)
@Responsebody
public String handleMyExceptionOnRedirect(@RequestParamter("message") String message) {
return message;
}
Обновить:
@RequestMapping(value="/login/authenticate/{username}/{password}", method=RequestMethod.GET)
@ResponseBody
public String authenticate(@PathVariable("username") String userName, @PathVariable("password") String password, Model model) {
if (userManagement.authenticateUser(userName, password)) {
String response = "Logged Successfully";
return response;
} else {
String response = "Invalid Username/Password, please try again!";
return response;
}
}
Комментарии:
1. Спасибо за ваш вклад, но это не решает мою проблему. Поскольку это перенаправляет внутри того же контроллера. Мне нужно перенаправить на другой контроллер (другая страница). Я буду помнить об использовании аннотации @ResponseBody для вызовов AJAX.
2. Используется полный ответ pledge, а затем переадресация работает. Одна небольшая проблема заключается в том, что когда вы выполняете POST и пересылаете запрос, он отправляется как POST-запрос. Поскольку вы не можете изменить метод (возможно, с помощью отражения вы можете), перенаправленный запрос попадает на страницу как POST. К сожалению, мне пришлось добавить обработку для запроса POST и в итоге я получил то, что хотел. Не чистое решение, но это начало.
3. @Dolphin, пожалуйста, посмотрите мое обновление и воспользуйтесь этим предложением. Вам вообще не нужно перенаправлять, кстати, я решил вашу проблему, пожалуйста, отметьте этот вопрос как принятый или увеличьте его рейтинг.
4. привет, Дэнни, оба подхода хороши, оба они не решают проблему. Что мне нужно, так это решение, которое позволяет мне перейти к другому контроллеру, который не является текущим. Итак, допустим LogInController.java (посмотреть: index.html ) и в случае успеха перейдите к HomePageController.java (посмотреть: homemain.html ). Итак, переадресация с одного контроллера на другой, ваше решение очень хорошее, но оно переадресует внутри того же контроллера.
5. Я не вижу никаких проблем с использованием ajax, если вы получили правильный ответ, перенаправьте его в javascript по окну. location.replace(«homemain.html «);
Ответ №2:
Здесь есть пара вещей, которые вы можете сделать:
-
Не возвращайте представление с вашего контроллера, вместо этого верните json, основываясь на ответе в json, соответствующим образом установите местоположение —
window.location = 'home.action'
— вот пример использования ext-js -
Пусть страница входа в систему выполняет полноценный post, а не AJAX post.
Комментарии:
1. Спасибо за помощь, и я рассматриваю возможность использования полноценного post. Что касается другого решения, то оно связано с использованием Spring Security, которое на данный момент для меня является накладным. Все сбои Spring Security здесь, я прихожу 🙂