当前位置: 首页 > 面试题库 >

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

凌翔宇
2023-03-14
问题内容

我想处理一个更新实体的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

响应的状态码为“找到了302”,没有正文内容和以下标头:

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: "*"

这是服务器端代码:

@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);
}

这是进行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;
            }
    });
}

问题答案:

Spring MVC建立在Servlet
API之上。因此,HttpServletResponse理论上可以访问的任何组件都可以使用它sendRedirect(String)手动设置或设置响应代码。(我说的是
理论上的 原因,因为在进行这些调用时还必须尚未做出响应。)

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

HandlerInterceptorDispatcherServlet的请求处理生命周期中,A
收到了三次。

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

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

以下是所有默认情况:

当返回a时String,Spring将使用a
ViewResolverView基于String值解析a ,该值标识视图的名称。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几乎可以完全自定义,因此还有其他组件需要注意。这是HandlerMethodArgumentResolverHandlerMethodReturnValueHandlerHandlerAdapterHandlerExceptionResolverExceptionHandler等。请注意,您很少会使用这些功能,而Spring附带的功能几乎可以完成整个工作。



 类似资料:
  • 问题内容: 发送XMLHttpRequest-s时是否可以防止浏览器遵循重定向(即,获取重定向状态代码并自己处理)? 问题答案: 不符合XMLHttpRequest对象的W3C标准(添加了重点): 如果响应是HTTP重定向: 如果Location头传达的URL的原点与XMLHttpRequest的原点是相同的原点,并且重定向不违反无限循环预防措施,请在遵循相同原点请求事件规则的情况下 透明地遵循重

  • 问题内容: 一些网站具有用于“破解” 附件的代码,这意味着,如果将页面作为父页面加载到内部,则某些Javascript 会将外部窗口重定向到。 通常,此Javascript如下所示: 我的问题是:作为父页面的作者而不是内部页面的作者,如何防止发生此突破? PS在我看来,这应该是跨站点安全性违规,但事实并非如此。 问题答案: 几乎可以满足您的要求: 如果要允许顶级重定向,请指定。

  • vue项目如何防止URL重定向 例如把 进行base64编码 拼接在地址后面,就能跳转到百度,如何设置白名单呢?是前端操作还是后端操作呀 希望大佬能帮忙解答一下

  • 问题内容: 这个问题的答案是 社区的努力。编辑现有答案以改善此职位。它目前不接受新的答案或互动。 如果将用户输入未经修改地插入到SQL查询中,则应用程序容易受到SQL注入的攻击,如以下示例所示: 这是因为用户可以输入类似的内容,并且查询变为: 如何防止这种情况的发生? 问题答案: 使用准备好的语句和参数化查询。 这些是独立于任何参数发送到数据库服务器并由数据库服务器解析的SQL语句。这样,攻击者就

  • 问题内容: 我不想拥有用户或位置,因为我可以有多行用户包含相同数据,或者有多行位置包含相同数据。我只想避免用户和位置都具有一定的价值,因为该行重复了许多次。 例如:这还可以 但这不行: 因为已经存在其中user = 1和location = 2的行。 如何避免重复? 问题答案: 声明对(用户,位置)的唯一约束。

  • 我们的代码使用Asyncresttemplate如下所示

  • 我有一行代码: 它工作良好,但用户可以简单地按下Esc键来取消操作。我试图使用一个事件侦听器来防止Esc键被按下,但它只在用户在初始页面时起作用。一旦他们被重定向,它就会停止工作,他们可以在浏览器中快速按Esc键或地址栏旁边的大X来取消重定向。 有什么办法可以让我完全避免? 编辑:我之所以要这样做,是因为在登录时,它们会自动发送到索引页。我在我的数据库中有一个标志,它检查用户是否已经付款。然后在索

  • 我有以下HTML+js代码: 您能解释一下如何重构以下代码,在单击href code后执行,但#不添加到URL并且页面不应该重新加载的代码吗?