如果项目是运行在 Tomcat 8 及以上,会发现发出的 PUT 请求和 DELETE
请求可以被控制其接收到,但是返回页面时(forward)会报HTTP 405 的错误提示:“消息 JSP 只允许 GET、POST 或 HEAD。Jasper 还允许OPTIONS”。

解决方案:

  1. 使用 Tomcat 8 以下版本。

  2. 使用 @RestController 或者 @Controller + @ResponseBody 标签,但是这样就无法跳转页面了。

  3. 避免使用 forward 方式跳转页面,改为 重定向redirect方式跳转到另一个控制器方法,再由这个控制器方法跳转页面。

@RequestMapping(value = "/rest", method = RequestMethod.PUT)
public String put() {// 接收表单中的各种信息System.out.println("PUT --- 更新数据");return "redirect:/success";
}@RequestMapping(value = "/success")
public String success() {return "success";
}
  1. 给 Tomcat 添加启动参数,使Tomcat允许写操作
<init-param><param-name>readonly</param-name><param-value>false</param-value>
</init-param>
  1. 创建一个新的 Filter 来过滤 FORWARD
// HiddenHttpMethodFilter.java
@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {HttpServletRequest requestToUse = request;if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {String paramValue = request.getParameter(this.methodParam);if (StringUtils.hasLength(paramValue)) {requestToUse = new HttpMethodRequestWrapper(request, paramValue);}}filterChain.doFilter(requestToUse, response);}

HiddenHttpMethodFilter 中的 doFilterInternal 方法是用来过滤 form 表单中 name 为 _method的请求。可以发现,它把请求作为参数传进HttpMethodRequestWrapper 中并且返回了一个新的请求,放行的也是新的请求。所以我们可以重写 HttpMethodRequestWrapper 中的 getMethod() 方法,让它支持 forward 方式的跳转。

// 重写 getMethod()
public class MyHttpMethodFilter extends HiddenHttpMethodFilter {@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)throws ServletException, IOException {HttpServletRequest requestToUse = request;String method = requestToUse.getMethod();if (method.equalsIgnoreCase("delete") || method.equalsIgnoreCase("put")) {method = "POST";}requestToUse = new HttpMethodRequestWrapper(request, method);filterChain.doFilter(requestToUse, response);}private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {private final String method;public HttpMethodRequestWrapper(HttpServletRequest request, String method) {super(request);this.method = method;}public String getMethod() {return this.method;}}
}

在 web.xml 中配置自己的过滤器:

<filter><filter-name>myFilter</filter-name><filter-class>com.wangxshen.filter.MyHttpMethodFilter</filter-class>
</filter>
<filter-mapping><filter-name>myFilter</filter-name><url-pattern>/*</url-pattern><dispatcher>FORWARD</dispatcher>
</filter-mapping>
  1. 在 forward 需要跳转的页面头加上 isErrorPage="true"
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8" isErrorPage="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body><h1>success</h1>
</body>
</html>

HTTP405报错:JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS相关推荐

  1. 报错JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS

    一. 问题背景 使用Spring MVC框架时,用到了REST的技术.使用了PUT.DELETE方式提交请求.但是就是跳转不到JSP页面 二. 解决方案 在你要跳转到的目标页面的下面这句代码里面添加i ...

  2. jsp里写java代码报错,jsp里写java代码报错

    jsp里写java代码报错 [2021-02-11 06:42:03]  简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...

  3. linux jsp 编译报错,JSP简要介绍

    JSP全称为Java Server Pages,其根本是一个简化的Servlet设计,实现了在Java中使用html标签.JSP是一种动态网页技术标准,也是JavaEE的标准.JSP同Servlet一 ...

  4. vue异步数据 报错_vue中异步请求数据,异步请求还没完成,文件就执行了就会报错,怎么解决?...

    vue中,axios异步加载数据,但是有的文件里面需要用到异步拿到的数据,数据还没拿到,文件已经执行了,这时候数据就是空,就会报错,这个问题怎么解决? 具体表现: 我这边vue项目是进入页面的时候会调 ...

  5. ant更改主题色报错Inline JavaScript is not enabled. Is it set in your options? vue ant主题色更改 vue-cli3

    问题:使用vue-cli3更改ant的主题色时候报错:Inline JavaScript is not enabled. Is it set in your options? 原因:我的问题是less ...

  6. 类似与这种的HHH000206: hibernate.properties not found的报错!只需要把hibernate的版本换成4.点几的就行!

  7. JavaWeb 关于Http405报错,提示此URL不支持Http方法GET

    如图,在前端与servlet交互时,如超链接href,url等,常遇到此bug 原因:服务器在访问servlet会优先访问doGet方法,出现问题是servlet中doGet缺失. 解决办法:检查se ...

  8. windows的bpython安装方法以及数据库报错--记录

    ---恢复内容开始--- 安装bpython的时候发现了一个博客讲解如何成功安装bpython,分享一下链接http://www.cnblogs.com/zhaojiedi1992/p/zhaojie ...

  9. python处理报错_python3报错及解决方案/须注意的细节(持续更新)

    问题: 编码的问题导致.在pymysql.connect()创建连接时,参数charset="utf8",而非"utf-8". 2.latin-1 codec ...

最新文章

  1. 13.PHP中循环结构之foreach循环语句(任务一)
  2. compareHist函数
  3. 利用Maya进行论文中网格动画数据的渲染
  4. vue定义一个变量并显示
  5. plsql(轻量版)_触发器
  6. python牛顿迭代法求平方根_牛顿迭代法计算平方根(Java,Python实现)
  7. python循环数组判断,python的数据类型、数组、条件判断、循环的基础知识
  8. 启动vue项目失败,报错Failed at the node-sass@4.14.1 postinstall script.
  9. linux+守护进程+php,【转载】Linux 守护进程的编程方法
  10. [转]UINavigationController的用法详解
  11. 查看jvm的full gc的频率
  12. mysql数据基本指令_mysql数据库常用命令(详细)
  13. python set 原理_Python基础教程之dict和set
  14. MYSQL 引擎的情况
  15. 如何用有道词典查找论文
  16. BZZ节点如何成为有效节点,BZZ节点优势
  17. 2021江苏省高考成绩排名查询,江苏高考成绩排名查询系统,2021年江苏个人成绩一分一段表...
  18. Visual Servo Control Part I: Basic Approaches
  19. Microsoft Word 教程「6」,如何在 Word 中插入艺术字?
  20. 基于两个移动平均线交叉的EA

热门文章

  1. 于丹感悟人生之经典名言
  2. toml的简单说明与配置
  3. C++MySQL数据库操作语句、事务的四大特性
  4. 安科瑞剩余电流互感器在电气火灾监控系统中的应用(安科瑞-卓宋兰)
  5. dstat wai_在HTML页面中避免使用WAI-ARIA进行冗余
  6. OFDM之viterbi译码
  7. 微服务2.0技术栈选型手册
  8. postgres更改数据库名的条件
  9. vue cube ui cube-tab-bar
  10. JSON数据的差异对比工具(Java版)