Всегда вызывайте функцию перед функцией @RequestMapping - PullRequest
0 голосов
/ 30 октября 2019

Я создаю API-интерфейс Spring с использованием Spring Framework.

У меня есть несколько функций @RequestMapping для каждой конечной точки, которую я определяю. В каждой функции @RequestMapping у меня есть функция для проверки нескольких переменных авторизации, прежде чем продолжить.

Могу ли я назначить эту функцию авторизации определенной функции, прежде чем я перешлю к соответствующей функции @RequestMapping?

Ответы [ 5 ]

1 голос
/ 30 октября 2019
Реализация

A HandlerInterceptor, как предлагается в другом месте, - это то, что вам нужно. Из ваших комментариев в ответ на этот ответ, однако вы неправильно понимаете API :

Я прочитал метод preHandle в ссылке на документацию, которую вы дали ... но он возвращает логическое значение ... могу ли явернуть вывод в формате JSON, используя этот метод?

Как отмечают документы API, только булевы сигналы ( для каркаса ) о необходимости продолжения обработки:

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/servlet/HandlerInterceptor.html#preHandle-javax.servlet.http.HttpServletRequest-javax.servlet.http.HttpServletResponse-java.lang.Object-

возвращает true, если цепочка выполнения должна продолжить работу со следующим перехватчиком или самим обработчиком. Иначе, DispatcherServlet предполагает, что этот перехватчик уже имел дело с самим ответом.

Итак, чтобы вернуть JSON:

public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
 Object handler) throws Exception{

    if(someCondition){
      return true; //continue processing
    }else{
      response.getOutputStream().write("{\"message\" : \"some text\"}");
      response.setContentType("text/json");
      response.setStatus(...); //some http error code?
      response.getoutputStream().flush();
      return false; //i have written some JSON to the response. Processing stops here
    }
}
1 голос
/ 30 октября 2019

Есть много способов достичь этого.

  1. Путем написания старомодных фильтров сервлетов. написание собственного фильтра, который проверяет запрос и обрабатывает его.
  2. Путем написания пружинных фильтров.
  3. С помощью Spring AOP. (рекомендуется)
  4. Путем написания своего собственного анонатации, который будет проверять запрос и давать только поверх метода, который вы хотите проверить. (рекомендуется)

Может быть и другой подход.

1 голос
/ 30 октября 2019

См. Это руководство - Spring Boot - Interceptor . Это вам поможет.

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class ServiceInterceptor implements HandlerInterceptor {
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      System.out.println("Pre Handle method is Calling");
      return true;
   }
   @Override
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
      System.out.println("Post Handle method is Calling");
   }
   @Override
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception exception) throws Exception {
      System.out.println("Request and Response is completed");
   }
}
1 голос
/ 30 октября 2019

Вы можете использовать HandlerInterceptor . Написание собственного перехватчика или расширение и использование существующих реализаций

0 голосов
/ 30 октября 2019

Пара предложений ...

  1. Использование рекомендаций AOP для RequestMapping, связанный пример описан в другом посте Как получить запрос RequestMapping в рекомендации AOP от контроллера Spring?

  2. Создать фильтр для контроллеров и выполнить проверку необходимых параметров в цепочке фильтров

...