如何防止Spring MVC进行重定向?

Mic*_*rdt 9 java spring spring-mvc

我想处理更新实体的AJAX请求.我真的不需要它返回任何东西.问题是Spring MVC坚持将重定向发送到同一个URL(显然正在进行重定向后获取),浏览器尽职尽责.

如何才能完成Spring MVC控制器方法并返回一些内容而不发送重定向?在网上搜索只会导致对如何进行重定向的无可争议的讨论,而不是如何避免重定向.

这是对http://localhost:9090/pex/api/testrun/f0a80b46-84b1-462a-af47-d1eadd779f59e这些标头的PUT请求:

Host: localhost:9090
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:29.0) Gecko/20100101 Firefox/29.0
Accept: */*
Accept-Language: de,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Length: 20
Content-Type: application/json
Referer: http://localhost:9090/pex/api/testrun/f0a80b46-84b1-462a-af47-d1eadd779f59e/visualizations/common-api?slas=lp,internal,external
X-Requested-With: XMLHttpRequest
Connection: keep-alive
Authorization: Basic xxxx
Run Code Online (Sandbox Code Playgroud)

响应的状态代码为"302 Found",没有正文内容和这些标题:

Content-Language: "de"
Content-Length: "0"
Location: "http://localhost:9090/pex/api/testrun/f0a80b46-84b1-462a-af47-d1eadd779f59e"
Server: "Jetty(6.1.10)"
access-control-allow-origin: "*"
Run Code Online (Sandbox Code Playgroud)

这是服务器端代码:

@RequestMapping(value = "/api/testrun/{testrunId}", method = RequestMethod.PUT, consumes = "application/json")
@ResponseBody
public Testrun updateOverview(@PathVariable("testrunId") final String testrunId, @RequestBody final String body) {
    return testrunService.updateOverview(testrunId, body);
}
Run Code Online (Sandbox Code Playgroud)

这是进行AJAX调用的Javascript代码:

$(document).ready(function() {
    $("#update_name_form").submit(function (e) {
        update_testrun($("#name"));
        return false;
    });
}
function update_testrun(element) {
    var name = element.attr('name');
    var new_value = element.val().trim();
    var data = {};
    data[name] = new_value;
    $.ajax({url: config.urls.api.testrun + testrun.id,
            type: "PUT",
            contentType: "application/json",
            data: JSON.stringify(data),
            error: function(jqXHR, textStatus, errorThrown) {
                    alert(errorThrown);
            },
            success: function (data, textStatus, jqXHR) {
                    testrun.overview[name] = new_value;
            }
    });
}
Run Code Online (Sandbox Code Playgroud)

Sot*_*lis 13

Spring MVC构建于Servlet API之上.因此,任何有权访问该组件的组件HttpServletResponse理论上都可以使用它来sendRedirect(String)手动设置响应代码.(我在理论上说,因为在进行这些调用时,必须尚未提交响应.)

通常,在Spring MVC应用程序中,a @Controller可以在方法中接收HttpServletResponse(或ServletResponse)@RequestMapping作为参数.

HandlerInterceptor作为DispatcherServlet请求处理生命周期的一部分,A 接收它三次.

任何已注册的Servlet Filter实例也可以访问ServletResponseSpring之前(和之后),DispatcherServlet因为过滤器在servlet之前起作用.

Spring试图将所有这些依赖项隐藏到Servlet API中,以使编程Web服务器更容易.因此,它提供了导致重定向的其他方法.这些主要取决于支持的处理程序方法返回类型.更具体地讲,我们关心的String,View,ModelAndView,和ResponseEntity.

以下是所有默认情况:

当您返回a时String,Spring将使用a ViewResolver来解析View基于String值的值,该值标识视图的名称.Spring的UrlBasedViewResolver将检测一个redirect:前缀String视图名,并把它作为一个指示发送重定向响应.它将创建一个RedirectView(其中一部分实际上已完成ViewNameMethodReturnValueHandler,但UrlBasedViewResolver创建了View),它将负责与重定向HttpServletResponse.

这是一个实现细节,但是Spring的大多数默认ViewResolver类都是这样做的.

有了View,您可以简单地创建并返回RedirectView自己.您也可以实现自己的View类来执行相同的操作.Spring将使用适当HandlerMethodReturnValueHandler的处理它.

有了ModelAndView,它是前两个选项的混合,因为您可以提供视图名称或View自身.

随着ResponseEntity它控制整个响应,它变得更有趣.也就是说,您可以设置状态代码,标题,正文,一切.因此,您需要做的就是将状态代码设置为302,并将Location带有URL 的标头重定向到.

最后,您在@ExceptionHandler方法(具有类似的返回类型)中具有类似的行为,您也可以将它们与@ResponseStatus手动混合并修改标题.

这些都是基本情况,但由于Spring MVC几乎可以完全自定义,因此还有其他组件需要注意.这是HandlerMethodArgumentResolver,HandlerMethodReturnValueHandler,HandlerAdapter,HandlerExceptionResolverExceptionHandler等.请注意,你很少会玩这些,而Spring附带的那些几乎可以完成整个工作.