【问题标题】:Always call function before @RequestMapping function始终在 @RequestMapping 函数之前调用函数
【发布时间】:2019-10-30 04:01:48
【问题描述】:

我正在使用 spring 框架创建 API spring 服务。

对于我定义的每个端点,我都有几个 @RequestMapping 函数。在每个@RequestMapping 函数中,我都有一个函数可以在继续之前检查几个授权变量。

在我转发到相关的@RequestMapping函数之前,我可以把这个授权函数放到一个特定的函数中吗?

【问题讨论】:

标签: java spring spring-mvc spring-jersey


【解决方案1】:

您可以使用HandlerInterceptor。编写自己的拦截器或扩展和使用现有的实现

【讨论】:

  • 感谢您的回答.. 我已经阅读了您提供的文档链接中的 preHandle 方法.. 但它返回布尔值.. 我可以使用此方法返回 JSON 输出吗?
  • @SudarsonoSung 不,您不能使用它们返回 JSON。你想在授权检查后生成并返回一些数据,对吗?具体是什么场景?
【解决方案2】:

您想要的是其他地方建议的HandlerInterceptor 实现。 从您的 cmets 回复该答案,但是您误解了 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
    }
}

【讨论】:

    【解决方案3】:

    有很多方法可以实现它。

    1. 通过编写老式的 servlet 过滤器。编写您自己的过滤器来验证请求并处理请求。
    2. 通过编写弹簧过滤器。
    3. 通过使用spring AOP。 (推荐)
    4. 通过编写您自己的注释来验证请求,并在您要验证的方法之上提供。 (推荐)

    可能还有其他方法。

    【讨论】:

      【解决方案4】:

      请参阅本教程 - 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");
         }
      }
      

      【讨论】:

        【解决方案5】:

        一些建议...

        1. 对 RequestMapping 使用 AOP 建议,相关示例在另一篇文章 How do you get RequestMapping request in AOP advice from a Spring controller? 中介绍

        2. 为控件创建一个过滤器,并在过滤器链中检查所需的参数

        【讨论】:

          猜你喜欢
          • 2018-11-24
          • 2014-02-19
          • 2018-06-22
          • 1970-01-01
          • 1970-01-01
          • 2012-09-28
          • 1970-01-01
          • 2017-08-26
          • 1970-01-01
          相关资源
          最近更新 更多