始终在 @RequestMapping 函数之前调用函数
Always call function before @RequestMapping function
我正在使用 spring 框架创建 API spring 服务。
我为我定义的每个端点都有几个@RequestMapping 函数。在每个 @RequestMapping 函数中,我都有一个函数在继续之前检查几个授权变量。
在转发到相关的@RequestMapping函数之前,是否可以把这个授权函数放到特定的函数中?
您可以使用 HandlerInterceptor。编写自己的拦截器或扩展并使用现有的实现
几个建议...
对 RequestMapping 使用 AOP 通知,相关示例在另一个 post How do you get RequestMapping request in AOP advice from a Spring controller?
为控件创建一个过滤器并在过滤器链中检查所需的参数
请参阅本教程 - 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");
}
}
有很多方法可以实现它。
- 通过编写老式的 servlet 过滤器。编写自己的过滤器来验证请求并处理请求。
- 通过编写 spring 个过滤器。
- 通过使用 spring AOP。 (推荐)
- 通过编写您自己的 anonatation,它将验证请求并仅在您要验证的方法之上给出。 (推荐)
可能还有其他方法。
A HandlerInterceptor
其他地方建议的实现是您想要的。 根据您对该回答的评论,但是您误解了 API:
我已经阅读了您提供的文档 link 中的方法 preHandle.. 但是它 return 布尔值.. 我可以 return JSON 输出吗使用这种方法?
正如 API 文档所指出的,仅布尔信号( 到框架 )处理是否应该继续:
returns true if the execution chain should proceed with the next
interceptor or the handler itself. Else, DispatcherServlet assumes
that this interceptor has already dealt with the response itself.
所以 return 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
}
}
我正在使用 spring 框架创建 API spring 服务。
我为我定义的每个端点都有几个@RequestMapping 函数。在每个 @RequestMapping 函数中,我都有一个函数在继续之前检查几个授权变量。
在转发到相关的@RequestMapping函数之前,是否可以把这个授权函数放到特定的函数中?
您可以使用 HandlerInterceptor。编写自己的拦截器或扩展并使用现有的实现
几个建议...
对 RequestMapping 使用 AOP 通知,相关示例在另一个 post How do you get RequestMapping request in AOP advice from a Spring controller?
为控件创建一个过滤器并在过滤器链中检查所需的参数
请参阅本教程 - 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");
}
}
有很多方法可以实现它。
- 通过编写老式的 servlet 过滤器。编写自己的过滤器来验证请求并处理请求。
- 通过编写 spring 个过滤器。
- 通过使用 spring AOP。 (推荐)
- 通过编写您自己的 anonatation,它将验证请求并仅在您要验证的方法之上给出。 (推荐)
可能还有其他方法。
A HandlerInterceptor
其他地方建议的实现是您想要的。 根据您对该回答的评论,但是您误解了 API:
我已经阅读了您提供的文档 link 中的方法 preHandle.. 但是它 return 布尔值.. 我可以 return JSON 输出吗使用这种方法?
正如 API 文档所指出的,仅布尔信号( 到框架 )处理是否应该继续:
returns true if the execution chain should proceed with the next interceptor or the handler itself. Else, DispatcherServlet assumes that this interceptor has already dealt with the response itself.
所以 return 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
}
}