Как обрабатывать как XmlHttpRequest (AJAX), так и обычные запросы HTTP в одном методе Spring MVC? - PullRequest
0 голосов
/ 20 января 2011

в настоящее время мое решение

Для AJAX:

@RequestMapping(value = "/verify", method = {RequestMethod.GET},
    headers = "x-requested-with=XMLHttpRequest")
    public 
    @ResponseBody userTO
    void verifyForXHR(@RequestParam(required = true) String code,
            HttpServletRequest request, HttpServletResponse response) {
        try {
            UserTO userTO = new SomeService().verifyEmail(code);
            return userTO;
        } catch (ExceptionABC ex) {
            response.setStatus(response.SC_BAD_REQUEST);
            return null;
        } catch (RuntimeException ex) {
              response.setStatus(response.SC_INTERNAL_SERVER_ERROR);
              return null;
        }

    }

Для регулярных запросов http:

@RequestMapping(value = "/verify", method = {RequestMethod.GET})
    public ModelAndView verify(@RequestParam(required = true) String code) {
        //get user to
        try {
            ModelAndView mav = new ModelAndView();
            UserTO userTO = new SomeService().verifyEmail code);

            mav.setViewName("somegoodpage");
            mav.addObject("user", userTO);
            return mav;
        } catch (ExceptionABC ex) {
                logger.error(ex, ex);
                ModelAndView mav = new ModelAndView("error page);
                return mav;
            }

        } catch (RuntimeException ex) {
            logger.error(ex.toString(), ex);
            ModelAndView mav = new ModelAndView("another error page");
            return mav;
        }

    }

Было бы супер, если бы я мог объединить их в один метод. Обратите внимание, что они имеют другой тип возврата. Вызывающей стороной для запросов AJAX является JavaScript, поэтому ему требуется JSON в качестве типа носителя тела ответа http. Для обычных HTTP-запросов необходимо вернуть представление (страницу). Любые предложения будут с благодарностью!

Ответы [ 2 ]

1 голос
/ 22 января 2011

Чтобы иметь все это в одном методе, вы можете различить два, приняв один дополнительный параметр @RequestHeader(value = "x-requested-with:XMLHttpRequest", required = false) String ajax. Затем вы можете проверить if (ajax == null) или нет и принять соответствующие меры.

0 голосов
/ 07 февраля 2016

Только не обрабатывайте исключения таким образом в вашем контроллере.Создайте надлежащий распознаватель исключений с поддержкой ajax, тогда ваши методы контроллера будут однорядными.Я подклассировал AbstractHandlerExceptionResolver, делая в основном это:

@Override
public ModelAndView doResolveException(HttpServletRequest request, HttpServletResponse response, Object o, Exception exception) {
    int code = getResponseCode(exception);

    applyStatusCodeIfPossible(request, response, code);

    ExceptionInfo info = createErrorInfo(exception);
    if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
        return new ModelAndView(jsonView, MODEL_KEY, info);
    }
    else if ((code == 403 || code == 401) && SecurityContextHolder.getContext().getAuthentication().getAuthorities().contains(ANONYMOUS) == false) {
        return new ModelAndView(LOGIN_REDIRECT);
    }
    else {
        return new ModelAndView(getViewName(code), MODEL_KEY, info);
    }
}

, после этого вам нужно только

@RequestMapping(value = "/verify", method = {RequestMethod.GET}, headers = "x-requested-with=XMLHttpRequest")
@ResponseBody public userTO verifyForXHR(@RequestParam String code) {
    return new SomeService().verifyEmail(code);
}

@RequestMapping(value = "/verify", method = {RequestMethod.GET})
public ModelAndView verify(@RequestParam String code) {
    return new ModelAndView("somegoodpage", "user", new SomeService().verifyEmail(code));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...