0

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

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

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

4

5 回答 5

2

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

于 2019-10-30T04:33:59.267 回答
1

请参阅本教程 - 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");
   }
}
于 2019-10-30T05:42:52.313 回答
1

有很多方法可以实现它。

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

可能还有其他方法。

于 2019-10-30T06:51:33.710 回答
1

HandlerInterceptor您想要的是其他地方建议的实现。从您对该答案的评论中,您误解了 API

我已经阅读了您提供的文档链接中的 preHandle 方法。但它返回布尔值。我可以使用此方法返回 JSON 输出吗?

正如 API Docs 所指出的,布尔值仅指示(向框架)处理是否应该继续:

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
    }
}
于 2019-10-30T19:39:21.367 回答
0

几个建议...

  1. 对 RequestMapping 使用 AOP 建议,相关示例在另一篇文章中介绍如何从 Spring 控制器获取 AOP 建议中的 RequestMapping 请求?

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

于 2019-10-30T04:56:11.610 回答