本文介紹了Java Spring MVC使用攔截器轉發/重定向POST請求的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個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請求并維護所有已發布的數據和方法類型?理想情況下,我希望重用已定義的相同控制器來處理傳入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的字符串,從那里您可以確定它是‘me’還是一個實際的UserID值。通過這種方式,您不必處理重定向。如果您必須一直這樣做,您可以創建一個幫助器方法,如下所示:
public Integer getUserId(String userId) {
return "me".equals(userId) ? AccessControlUtil.getUserId() : Integer.valueOf(userId);
}
這篇關于Java Spring MVC使用攔截器轉發/重定向POST請求的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,