gpt4 book ai didi

spring-mvc - Put 方法出现 405 JSP 错误

转载 作者:行者123 更新时间:2023-12-01 17:28:48 30 4
gpt4 key购买 nike

我遇到了有关 JSP 不接受 PUT 请求的问题。所以我想知道如何解决它。我已经在堆栈溢出中阅读了这个相关问题,但它没有解释如何修复它。

HTTP Status 405 - JSPs only permit GET POST or HEAD

来自 Rails 背景,我正在尝试使用 Rails REST 样式,例如 PUT 进行更新,使用 DELETE 删除用户资源。

但是每当此 Controller 中出现错误时,它都会尝试将请求返回到原始 JSP,但 Tomcat 8.0.9 不接受请求并给出此错误:“HTTP 状态 405 - JSP 只允许 GET POST 或 HEAD ”。我尝试在 Tomcat web.xml 中禁用只读 - 它没有任何效果,但我仍然收到错误。我已将其切换为 POST 方法,流程运行良好。

有没有办法可以强制转发为 POST 方法,同时仍然接受请求的 PUT 方法?

/**
* Edit a user account.
* @return the edit user view
*/
@RequestMapping(value = {"/update/{userId}"}, method = RequestMethod.PUT)
public String updateUser(@Valid @ModelAttribute("user") User user, BindingResult result, final RedirectAttributes redirectAttributes)
{
logger.debug(user);

// we check for duplicate email addresses during the update operation.
List<User> userCheckList = userRepository.findByEmail(user.getEmail());
if (userCheckList.size() > 0)
{
// size of list should only ever be 1
User userCheck = userCheckList.get(0);
if (userCheck.getId() != user.getId())
{
result.rejectValue("email", "error.user", "An account already exists for this user email address.");
}
}


if (result.hasErrors())
{
return "admin.users.edit";
}

// we locate the user and add it to the model
userRepository.save(user);



// the save operation was successful so we show the user message.
redirectAttributes.addFlashAttribute("user", user);
redirectAttributes.addFlashAttribute("message", "Updated successfully");


String viewName = "redirect:/admin/users";
logger.debug(viewName);

return viewName;
}

最佳答案

问题是,当您从 Controller 方法返回 View 名称时,Spring DispatcherServlet将转发到给定 View ,保留原始 PUT方法。

在尝试处理此转发时,Tomcat 将拒绝它,理由是 PUT到 JSP 可以解释为“用此请求的内容替换服务器上的此 JSP 文件。”

您确实希望 Controller 能够处理您的PUT请求,然后转发到您的 JSP,如 GET 。幸运的是,Servlet 3.0 提供了一种纯粹根据 FORWARD 进行过滤的方法。调度员。

创建过滤器:

public class GetMethodConvertingFilter implements Filter {

@Override
public void init(FilterConfig config) throws ServletException {
// do nothing
}

@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {

chain.doFilter(wrapRequest((HttpServletRequest) request), response);
}

@Override
public void destroy() {
// do nothing
}

private static HttpServletRequestWrapper wrapRequest(HttpServletRequest request) {
return new HttpServletRequestWrapper(request) {
@Override
public String getMethod() {
return "GET";
}
};
}
}

并将其连接到您的 web.xml因此:

<filter>
<filter-name>getMethodConvertingFilter</filter-name>
<filter-class>my.GetMethodConvertingFilter</filter-class>
</filter>

<filter-mapping>
<filter-name>getMethodConvertingFilter</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>FORWARD</dispatcher>
</filter-mapping>

这会将请求转换为 GET仅转发,使通过其他调度程序的请求保持不变,因此 PUT s 将像平常一样被您的 Controller 拦截。

我(可能不正确)的理解是 Tomcat 8.0.9 引入了一个修复程序,可以有效地自动为 ERROR 完成此修复程序。调度员 - 请参阅 answer在你的链接问题中。但是您没有使用容器的错误处理机制来呈现错误页面,而是使用 Spring MVC 手动转发到 View ,因此您需要这样做。就我个人而言,我在 Jetty 9.2.7 下遇到了这个问题,其中没有这样的修复,并且我将错误处理委托(delegate)给容器,所以我有 <dispatcher>ERROR</dispatcher>也在我的过滤器映射中配置。

这一切看起来有点神秘,但这是我发现成功跳过这个特定的 RESTful-Spring-JSP-web-application 环的唯一方法。

关于spring-mvc - Put 方法出现 405 JSP 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61166419/

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