Spring MVC error: HTTP status 405 - JSPS only permit get post or head

~wangweijun 2020-11-13 07:25:03
spring mvc error http status


I've been writing about JavaEE Series of articles , Writing SpringMVC Of REST style URL There were some problems , Here is part of the code .

index.jsp Page code :

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="ISO-8859-1">
<title>Insert title here</title>
</head>
<body>
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="PUT">
<input type="submit" value="TestRest PUT">
</form>
<br>
<form action="springmvc/testRest/1" method="post">
<input type="hidden" name="_method" value="DELETE">
<input type="submit" value="TestRest DELETE">
</form>
<br>
<form action="springmvc/testRest" method="post">
<input type="submit" value="TestRest POST">
</form>
<br>
<form action="springmvc/testRest/1" method="get">
<input type="submit" value="TestRest GET">
</form>
<br>
</body>
</html>

Controller code :

@RequestMapping("/springmvc")
@Controller
public class RequestMappingTest {

@RequestMapping(value = "/testRest/{id}",method = RequestMethod.PUT)
public String testRestPut(@PathVariable("id") Integer id) {

System.out.println("testRest PUT:" + id);
return "success";
}
@RequestMapping(value = "/testRest/{id}",method = RequestMethod.DELETE)
public String testRestDelete(@PathVariable("id") Integer id) {

System.out.println("testRest DELETE:" + id);
return "success";
}
@RequestMapping(value = "/testRest",method = RequestMethod.POST)
public String testRestPost() {

System.out.println("testRest POST");
return "success";
}
@RequestMapping(value = "/testRest/{id}",method = RequestMethod.GET)
public String testRestGet(@PathVariable("id") Integer id) {

System.out.println("testRest GET:" + id);
return "success";
}
}

Project running :
 Insert picture description here
spot GET、POST No problem , But you DELETE and PUT When the program is wrong , The error information is as follows :
 Insert picture description here
Error message prompt :jsp Only GET POST or HEAD.

Actually, I met this mistake a long time ago , I checked , There are a total of four ways to solve :

  1. tomcat Switch to 7.0 And the following versions
  2. Mark... On the method @ResponseBody
  3. Ask to transfer to a Controller, Back again jsp page
  4. In your success Page header settings isErrorPage The attribute is true

At that time, the problem was solved , I don't know why , I've checked about it these days , There are many people who write this mistake on the Internet , But it's just a solution , It's not exactly why it's solved like this .

tomcat Switch to 7.0 And the following versions

After consulting a lot of information , I come to some conclusions , The wrong information is obvious , That's right jsp Only GET、POST or HEAD, And we used it REST In the style DELETE and PUT, Obviously it's going to be wrong .

So why put tomcat Version switch to 7.0 perhaps 7.0 The following version will not have such a problem ?

Tomcat according to JCP standard (JSP2.3 edition ) The provisions of the , from Tomcat8.x Version start , No more support for HTTP PUT Access to JSP page , Support only GET、POST and HEAD The way .

The return value you write in the controller method is a string ,SpringMVC Think of it as a jsp page , That's why I made a mistake .
This perfectly explains why the first solution works , But switch tomcat The version is obviously not good .

Mark... On the method @ResponseBody

Just said SpringMVC The return value of the controller method is considered as a jsp Page causes an error , Then you can mark the processing method @ResponseBody annotation , Try running the project again :
 Insert picture description here
The successful running , But the return value is displayed on the page .

This is about understanding @ResponseBody The role of the :

@ResponseBody The function of annotation is to convert the return value of the controller method to the specified format through the appropriate converter , Write to Response Object's body District , Usually used to return JSON Data or XML data .
Be careful : View processor will not walk after using this annotation , Instead, the data is written directly into the input stream , His effect is equivalent to passing Response Object to output data in the specified format .

See this , Do you understand , You add this note , It doesn't use the view processor , Of course, I won't jump to jsp Page , Don't jump to jsp page , Of course, it's not wrong .

But this annotation is usually used to return data , If you do want to return data , Of course, there is no problem in writing like this , This is also a relatively standard way of writing .

Ask to transfer to a Controller, Back again jsp page

And if you just want to jump to one jsp page , You can use the third solution .
Since you can't jump to jsp page , You can transfer the request to a control method first , Then jump to jsp page .
Change the code of the control class :

@RequestMapping("/springmvc")
@Controller
public class RequestMappingTest {

@RequestMapping("/toSuccess")
public String toSuccess() {

System.out.println("toSuccess");
return "success";
}
@RequestMapping(value = "/testRest/{id}",method = RequestMethod.PUT)
public String testRestPut(@PathVariable("id") Integer id) {

System.out.println("testRest PUT:" + id);
return "redirect:/springmvc/toSuccess";
}
@RequestMapping(value = "/testRest/{id}",method = RequestMethod.DELETE)
public String testRestDelete(@PathVariable("id") Integer id) {

System.out.println("testRest DELETE:" + id);
return "redirect:/springmvc/toSuccess";
}
@RequestMapping(value = "/testRest",method = RequestMethod.POST)
public String testRestPost() {

System.out.println("testRest POST");
return "success";
}
}
......

In this way , our DELETE and PUT Requests don't jump directly jsp page , But first to toSuccess Control method , And jump from this method to jsp page .

In your success Page header settings isErrorPage The attribute is true

As for why this solution can succeed , I believe you should be able to know for yourself ?

Because of DELETE and PUT Ask for a direct jump jsp Page error , When you're waiting to jump jsp Set... In the page isErrorPage The attribute is true after , Jumping around jsp Error on page , And set the isErrorPage Property page is the error page , It just shows .

summary

in summary , These four solutions are actually solving the same problem , Namely jsp I won't support it DELETE and PUT, We need to find a way not to visit directly under these two requests jsp That's it .

But these methods are against their own subjective will , So only when you need to use DELETE and PUT Use them on request , For example, return some data through them , Otherwise, don't use them , It's all over the place .

The teacher often teaches us , Know what it is , We need to know why .

版权声明
本文为[~wangweijun]所创,转载请带上原文链接,感谢

  1. [front end -- JavaScript] knowledge point (IV) -- memory leakage in the project (I)
  2. This mechanism in JS
  3. Vue 3.0 source code learning 1 --- rendering process of components
  4. Learning the realization of canvas and simple drawing
  5. gin里获取http请求过来的参数
  6. vue3的新特性
  7. Get the parameters from HTTP request in gin
  8. New features of vue3
  9. vue-cli 引入腾讯地图(最新 api,rocketmq原理面试
  10. Vue 学习笔记(3,免费Java高级工程师学习资源
  11. Vue 学习笔记(2,Java编程视频教程
  12. Vue cli introduces Tencent maps (the latest API, rocketmq)
  13. Vue learning notes (3, free Java senior engineer learning resources)
  14. Vue learning notes (2, Java programming video tutorial)
  15. 【Vue】—props属性
  16. 【Vue】—创建组件
  17. [Vue] - props attribute
  18. [Vue] - create component
  19. 浅谈vue响应式原理及发布订阅模式和观察者模式
  20. On Vue responsive principle, publish subscribe mode and observer mode
  21. 浅谈vue响应式原理及发布订阅模式和观察者模式
  22. On Vue responsive principle, publish subscribe mode and observer mode
  23. Xiaobai can understand it. It only takes 4 steps to solve the problem of Vue keep alive cache component
  24. Publish, subscribe and observer of design patterns
  25. Summary of common content added in ES6 + (II)
  26. No.8 Vue element admin learning (III) vuex learning and login method analysis
  27. Write a mini webpack project construction tool
  28. Shopping cart (front-end static page preparation)
  29. Introduction to the fluent platform
  30. Webpack5 cache
  31. The difference between drop-down box select option and datalist
  32. CSS review (III)
  33. Node.js学习笔记【七】
  34. Node.js learning notes [VII]
  35. Vue Router根据后台数据加载不同的组件(思考-&gt;实现-&gt;不止于实现)
  36. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  37. 【JQuery框架,Java编程教程视频下载
  38. [jQuery framework, Java programming tutorial video download
  39. Vue Router根据后台数据加载不同的组件(思考-&gt;实现-&gt;不止于实现)
  40. Vue router loads different components according to background data (thinking - & gt; Implementation - & gt; (more than implementation)
  41. 【Vue,阿里P8大佬亲自教你
  42. 【Vue基础知识总结 5,字节跳动算法工程师面试经验
  43. [Vue, Ali P8 teaches you personally
  44. [Vue basic knowledge summary 5. Interview experience of byte beating Algorithm Engineer
  45. 【问题记录】- 谷歌浏览器 Html生成PDF
  46. [problem record] - PDF generated by Google browser HTML
  47. 【问题记录】- 谷歌浏览器 Html生成PDF
  48. [problem record] - PDF generated by Google browser HTML
  49. 【JavaScript】查漏补缺 —数组中reduce()方法
  50. [JavaScript] leak checking and defect filling - reduce() method in array
  51. 【重识 HTML (3),350道Java面试真题分享
  52. 【重识 HTML (2),Java并发编程必会的多线程你竟然还不会
  53. 【重识 HTML (1),二本Java小菜鸟4面字节跳动被秒成渣渣
  54. [re recognize HTML (3) and share 350 real Java interview questions
  55. [re recognize HTML (2). Multithreading is a must for Java Concurrent Programming. How dare you not
  56. [re recognize HTML (1), two Java rookies' 4-sided bytes beat and become slag in seconds
  57. 【重识 HTML ,nginx面试题阿里
  58. 【重识 HTML (4),ELK原来这么简单
  59. [re recognize HTML, nginx interview questions]
  60. [re recognize HTML (4). Elk is so simple