HTTP405报错:JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS
如果项目是运行在 Tomcat 8 及以上,会发现发出的 PUT 请求和 DELETE
请求可以被控制其接收到,但是返回页面时(forward)会报HTTP 405 的错误提示:“消息 JSP 只允许 GET、POST 或 HEAD。Jasper 还允许OPTIONS”。
解决方案:
使用 Tomcat 8 以下版本。
使用 @RestController 或者 @Controller + @ResponseBody 标签,但是这样就无法跳转页面了。
避免使用 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";
}
- 给 Tomcat 添加启动参数,使Tomcat允许写操作
<init-param><param-name>readonly</param-name><param-value>false</param-value>
</init-param>
- 创建一个新的 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>
- 在 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相关推荐
- 报错JSPs only permit GET, POST or HEAD. Jasper also permits OPTIONS
一. 问题背景 使用Spring MVC框架时,用到了REST的技术.使用了PUT.DELETE方式提交请求.但是就是跳转不到JSP页面 二. 解决方案 在你要跳转到的目标页面的下面这句代码里面添加i ...
- jsp里写java代码报错,jsp里写java代码报错
jsp里写java代码报错 [2021-02-11 06:42:03] 简介: php去除nbsp的方法:首先创建一个PHP代码示例文件:然后通过"preg_replace("/ ...
- linux jsp 编译报错,JSP简要介绍
JSP全称为Java Server Pages,其根本是一个简化的Servlet设计,实现了在Java中使用html标签.JSP是一种动态网页技术标准,也是JavaEE的标准.JSP同Servlet一 ...
- vue异步数据 报错_vue中异步请求数据,异步请求还没完成,文件就执行了就会报错,怎么解决?...
vue中,axios异步加载数据,但是有的文件里面需要用到异步拿到的数据,数据还没拿到,文件已经执行了,这时候数据就是空,就会报错,这个问题怎么解决? 具体表现: 我这边vue项目是进入页面的时候会调 ...
- 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 ...
- 类似与这种的HHH000206: hibernate.properties not found的报错!只需要把hibernate的版本换成4.点几的就行!
- JavaWeb 关于Http405报错,提示此URL不支持Http方法GET
如图,在前端与servlet交互时,如超链接href,url等,常遇到此bug 原因:服务器在访问servlet会优先访问doGet方法,出现问题是servlet中doGet缺失. 解决办法:检查se ...
- windows的bpython安装方法以及数据库报错--记录
---恢复内容开始--- 安装bpython的时候发现了一个博客讲解如何成功安装bpython,分享一下链接http://www.cnblogs.com/zhaojiedi1992/p/zhaojie ...
- python处理报错_python3报错及解决方案/须注意的细节(持续更新)
问题: 编码的问题导致.在pymysql.connect()创建连接时,参数charset="utf8",而非"utf-8". 2.latin-1 codec ...
最新文章
- 13.PHP中循环结构之foreach循环语句(任务一)
- compareHist函数
- 利用Maya进行论文中网格动画数据的渲染
- vue定义一个变量并显示
- plsql(轻量版)_触发器
- python牛顿迭代法求平方根_牛顿迭代法计算平方根(Java,Python实现)
- python循环数组判断,python的数据类型、数组、条件判断、循环的基础知识
- 启动vue项目失败,报错Failed at the node-sass@4.14.1 postinstall script.
- linux+守护进程+php,【转载】Linux 守护进程的编程方法
- [转]UINavigationController的用法详解
- 查看jvm的full gc的频率
- mysql数据基本指令_mysql数据库常用命令(详细)
- python set 原理_Python基础教程之dict和set
- MYSQL 引擎的情况
- 如何用有道词典查找论文
- BZZ节点如何成为有效节点,BZZ节点优势
- 2021江苏省高考成绩排名查询,江苏高考成绩排名查询系统,2021年江苏个人成绩一分一段表...
- Visual Servo Control Part I: Basic Approaches
- Microsoft Word 教程「6」,如何在 Word 中插入艺术字?
- 基于两个移动平均线交叉的EA