gpt4 book ai didi

Java Spring MVC 使用拦截器转发/重定向 POST 请求

转载 作者:行者123 更新时间:2023-11-29 07:50:14 24 4
gpt4 key购买 nike

我有一个 Spring MVC 应用程序,它允许用户通过以下调用添加/删除 Collection 夹:

  • POST/api/users/123/favorites/456(将项目 456 添加为用户 123 的最爱)
  • DELETE/api/users/123/favorites/456(删除项目 456 作为用户 123 的最爱)

我还想支持执行完全相同操作的以下 2 个调用(假设用户 123 已登录):

  • POST/api/users/me/favorites/456
  • 删除/api/users/me/favorites/456

我创建了一个拦截器,如下所示:

public class UserMeInterceptor extends HandlerInterceptorAdapter{
public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handler ) throws Exception{
Integer userId = AccessControlUtil.getUserId();
String redirectUrl = request.getContextPath() + request.getRequestURI().replace( "/me/", "/" + userId + "/" );
if( redirectUrl.endsWith( "/me" ) ){
redirectUrl = redirectUrl.replace( "/me", "/" + userId );
}
response.sendRedirect( redirectUrl );
response.flushBuffer();
return false;
}
}

这种方法非常有效,但仅适用于 GET 请求。有什么方法可以转发/重定向 POST 请求并维护所有 POSTed 数据和方法类型?理想情况下,我想重用已定义的同一个 Controller 来处理传入 ID 的情况。

最佳答案

这种方法怎么样:

@RequestMapping("/api/users/{userId}/favorites/{favoriteId}")
public String clientsByGym(@PathVariable("userId") String userId, @PathVariable("favoriteId") Long favoriteId) {
Integer theUserId = null;
if("me".equals(userId)) {
theUserId = AccessControlUtil.getUserId()
} else {
theUserId = Integer.valueOf(userId);
}
...
}

基本上,让您的方法接受 userId 的字符串,然后您可以从那里确定它是“我”还是实际的 userId 值。这样你就不必搞乱重定向。如果你必须一直这样做,你可以像这样制作一个辅助方法:

public Integer getUserId(String userId) { 
return "me".equals(userId) ? AccessControlUtil.getUserId() : Integer.valueOf(userId);
}

关于Java Spring MVC 使用拦截器转发/重定向 POST 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21759202/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com