繁体   English   中英

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

[英]Java Spring MVC forward/redirect POST request using interceptor

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

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

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

  • POST /api/users/me/favorites/456
  • DELETE /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请求并维护所有POST数据和方法类型吗? 理想情况下,我想重用已经定义的相同控制器来处理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的String,然后从那里可以确定它是'me'还是实际的userId值。 这样一来,您就不必搞乱重定向了。 如果您必须一直这样做,则可以制作如下的帮助方法:

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

Spring MVC有两种进行属性转换的机制,但是在这种情况下,如果采用干净的方式,这些机制将无济于事-检查此答案 这些并不意味着只能选择性地仅应用于一个String参数。

最好的方法是将一个方面应用到您想要此功能的控制器和方法,请参见此答案以获取示例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM