2015-10-28 3 views
4

У меня есть несколько методов SprigMVC, как показано ниже, возвращая либо ModelAndView, либо Responsebody. Когда пользователи делают запрос на эти URL-адреса, у которых отсутствуют требуемые параметры, они, естественно, получают сообщение «Обязательный параметр строки« id »нет».Специальное сообщение Spring MVC для HTTP 400

С точки зрения безопасности Я хочу скрыть подробное описание сообщения от пользователей. Таким образом, хакер не легко знает недостающие параметры и получит ошибку 400 без какого-либо описания. Возможно ли это с помощью конфигурации пружины/Spring Security или мне придется вручную реорганизовать все мои методы, чтобы каким-то образом вернуть пользовательское сообщение.

@RequestMapping(value = "/payment", method = RequestMethod.GET) 
public ModelAndView getReponse(@RequestParam(value = "id", required = true)) { 

    return model; 
} 

@RequestMapping(value = "/status", method = RequestMethod.GET) 
public @ResponseBody String getStatus(@RequestParam(value = "id", required = true) String id) { 

    return "string"; 
} 
+0

Таким образом, обход этой ошибки также поможет? – Rehman

+0

@ Rehman не уверен, что вы подразумеваете под байпасом, но, вероятно, – Spring

+0

Теперь его ясность после редактирования вашего вопроса. Я думал о 'required = false'. Но вы хотите 400 – Rehman

ответ

6

То, что вы на самом деле нужно, это глобальный обработчик для MissingServletRequestParameterException, который выбрасывается весной, когда параметр запроса отсутствует. Самый простой способ решить эту проблему - использовать ControllerAdvice, который будет обрабатывать его для всех ваших контроллеров.

import org.springframework.web.bind.MissingServletRequestParameterException; 

@ControllerAdvice 
class MissingServletRequestParameterExceptionHandler { 
    @ExceptionHandler(MissingServletRequestParameterException.class) 
    @ResponseBody 
    @ResponseStatus(HttpStatus.BAD_REQUEST) 
    public String handleMissingParameter() { 
     return "Your custom result"; 
    } 
} 

Если вы хотите, чтобы скрыть сообщение недостающего параметра только для конкретного контроллера, просто переместить handleMissingParameter метод к этому контроллеру без создания ControllerAdvice.

+0

tnx. имеет ли этот подход какое-либо преимущество перед использованием в моем web.xml? Я просто попробовал, и я мог показать свою собственную страницу ошибок для всех 400 ошибок. – Spring

+0

Если вы просто хотите отобразить простую страницу ошибок, то нет, . Но вы можете использовать этот обработчик для регистрации такой ситуации, и поскольку вы написали об атаках, эта информация может быть интересной для вас. –

+0

да действительно для регистрации! tnx, но неясно, как я могу использовать его для одного метода контроллера? И есть ли способ получить объект HttpRequest для подробного ведения журнала – Spring

3

Я лично поддержал ответ Даниэля Ольшевского, потому что это бедро, красивое, лаконичное и читаемое, хотя и на публично доступном сайте, ориентированном на клиента (когда вы выходите за рамки быстрого прототипирования с использованием фазы Spring Boot и должны быть абсолютно уверены, что ничего не пропустит), можно использовать его вместе с простым error-page в подходе web.xml (некоторые примеры здесь: Handle error 404 with Spring controller).

Это не может быть интересно (я, лично, презирать ничего XML, связанные за explainability), но (если вы не используете web.xml вообще в пользу WebApplicationInitializer), web.xml является почти самый низкий слой в веб-приложении, и никакая страница ошибки (вне зависимости от исключения или сопоставления URL-адресов) не пройдет через него, просто запомните, чтобы отобразить все коды состояния HTTP (т.е. иметь один элемент по умолчанию error-page без дочернего элемента error-code).

Решение для WebApplicationInitializer аналогично, некоторые примеры здесь: Using Spring MVC 3.1+ WebApplicationInitializer to programmatically configure session-config and error-page.

Самым низким уровнем подхода слоя является установка ширины экрана с ошибкой, например. для Tomcat: http://linux-sxs.org/internet_serving/c581.html.