我正在使用 spring 框架创建一个 API spring 服务。
对于我定义的每个端点,我都有几个 @RequestMapping 函数。在每个@RequestMapping 函数中,我都有一个函数可以在继续之前检查几个授权变量。
在我转发到相关的@RequestMapping 函数之前,我可以把这个授权函数放到一个特定的函数中吗?
我正在使用 spring 框架创建一个 API spring 服务。
对于我定义的每个端点,我都有几个 @RequestMapping 函数。在每个@RequestMapping 函数中,我都有一个函数可以在继续之前检查几个授权变量。
在我转发到相关的@RequestMapping 函数之前,我可以把这个授权函数放到一个特定的函数中吗?
您可以使用HandlerInterceptor。编写自己的拦截器或扩展和使用现有的实现
请参阅本教程 - 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");
}
}
有很多方法可以实现它。
可能还有其他方法。
HandlerInterceptor
您想要的是其他地方建议的实现。从您对该答案的评论中,您误解了 API:
我已经阅读了您提供的文档链接中的 preHandle 方法。但它返回布尔值。我可以使用此方法返回 JSON 输出吗?
正如 API Docs 所指出的,布尔值仅指示(向框架)处理是否应该继续:
如果执行链应该继续下一个拦截器或处理程序本身,则返回 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
}
}
几个建议...
对 RequestMapping 使用 AOP 建议,相关示例在另一篇文章中介绍如何从 Spring 控制器获取 AOP 建议中的 RequestMapping 请求?
为控件创建一个过滤器,并在过滤器链中检查所需的参数