为了账号安全,请及时绑定邮箱和手机立即绑定

始终在 @RequestMapping 函数之前调用函数

始终在 @RequestMapping 函数之前调用函数

烙印99 2024-01-05 17:07:20
我正在使用 spring 框架创建 API spring 服务。我为我定义的每个端点都有几个 @RequestMapping 函数。在每个 @RequestMapping 函数中,我都有一个函数可以在继续之前检查多个授权变量。我可以在转发到相关的@RequestMapping函数之前将此授权函数放到特定的函数中吗?
查看完整描述

5 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

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



查看完整回答
反对 回复 2024-01-05
?
繁花不似锦

TA贡献1851条经验 获得超4个赞

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

    }

}


查看完整回答
反对 回复 2024-01-05
?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

有很多方法可以实现它。

  1. 通过编写老式的 servlet 过滤器。编写您自己的过滤器来验证请求并处理请求。

  2. 通过编写弹簧过滤器。

  3. 通过使用Spring AOP。(受到推崇的)

  4. 通过编写您自己的注释,它将验证请求,并在您想要验证的方法之上给出。(受到推崇的)

可能还有其他方法。


查看完整回答
反对 回复 2024-01-05
?
慕桂英4014372

TA贡献1871条经验 获得超13个赞

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");

   }

}


查看完整回答
反对 回复 2024-01-05
?
慕后森

TA贡献1802条经验 获得超5个赞

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


查看完整回答
反对 回复 2024-01-05
  • 5 回答
  • 0 关注
  • 133 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信