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

解决方案:

  1. 使用 Tomcat 8 以下版本。

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

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

    1. @RequestMapping(value = "/rest", method = RequestMethod.PUT)
    2. public String put() {
    3. // 接收表单中的各种信息
    4. System.out.println("PUT --- 更新数据");
    5. return "redirect:/success";
    6. }
    7. @RequestMapping(value = "/success")
    8. public String success() {
    9. return "success";
    10. }
  4. 给 Tomcat 添加启动参数,使Tomcat允许写操作

    1. <init-param>
    2. <param-name>readonly</param-name>
    3. <param-value>false</param-value>
    4. </init-param>
  5. 创建一个新的 Filter 来过滤 FORWARD

    1. // HiddenHttpMethodFilter.java
    2. @Override
    3. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
    4. throws ServletException, IOException {
    5. HttpServletRequest requestToUse = request;
    6. if ("POST".equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == null) {
    7. String paramValue = request.getParameter(this.methodParam);
    8. if (StringUtils.hasLength(paramValue)) {
    9. requestToUse = new HttpMethodRequestWrapper(request, paramValue);
    10. }
    11. }
    12. filterChain.doFilter(requestToUse, response);
    13. }

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

    1. // 重写 getMethod()
    2. package com.pudding.conf;
    3. import java.io.IOException;
    4. import javax.servlet.FilterChain;
    5. import javax.servlet.ServletException;
    6. import javax.servlet.http.HttpServletRequest;
    7. import javax.servlet.http.HttpServletRequestWrapper;
    8. import javax.servlet.http.HttpServletResponse;
    9. import org.springframework.web.filter.HiddenHttpMethodFilter;
    10. public class MyHttpMethodFilter extends HiddenHttpMethodFilter {
    11. @Override
    12. protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
    13. throws ServletException, IOException {
    14. HttpServletRequest requestToUse = request;
    15. String method = requestToUse.getMethod();
    16. if (method.equalsIgnoreCase("delete") || method.equalsIgnoreCase("put")) {
    17. method = "POST";
    18. }
    19. requestToUse = new HttpMethodRequestWrapper(request, method);
    20. filterChain.doFilter(requestToUse, response);
    21. }
    22. private static class HttpMethodRequestWrapper extends HttpServletRequestWrapper {
    23. private final String method;
    24. public HttpMethodRequestWrapper(HttpServletRequest request, String method) {
    25. super(request);
    26. this.method = method;
    27. }
    28. public String getMethod() {
    29. return this.method;
    30. }
    31. }
    32. }

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

    1. <filter>
    2. <filter-name>myFilter</filter-name>
    3. <filter-class>com.pudding.conf.MyHttpMethodFilter</filter-class>
    4. </filter>
    5. <filter-mapping>
    6. <filter-name>myFilter</filter-name>
    7. <url-pattern>/*</url-pattern>
    8. <dispatcher>FORWARD</dispatcher>
    9. </filter-mapping>
  6. 在 forward 需要跳转的页面头加上 isErrorPage="true"

    1. <%@ page language="java" contentType="text/html; charset=UTF-8"
    2. pageEncoding="UTF-8" isErrorPage="true"%>
    3. <!DOCTYPE html>
    4. <html>
    5. <head>
    6. <meta charset="UTF-8">
    7. <title>Insert title here</title>
    8. </head>
    9. <body>
    10. <h1>success</h1>
    11. </body>
    12. </html>

HTTP 405 的错误提示:消息 JSP 只允许 GET、POST 或 HEAD。Jasper 还允许 OPTIONS 的解决方法的更多相关文章

  1. sudo 提示 'xxx is not in the sudoers file.This incident will be reported.的解决方法'

    在使用 Linux 的过程中,有时候需要临时获取 root 权限来执行命令时,一般通过在命令前添加 sudo 来解决. 但是第一次使用 sudo 时,有可能会得到这样一个错误提示 xxx is not ...

  2. Yii自定义错误提示消息

    英文原文: http://www.yiiframework.com/wiki/1/how-to-customize-the-error-message-of-a-validation-rule/ Va ...

  3. SQL2008无法附加数据库,提示“无法显示请求的对话框”(nColIndex实际值是-1)图文解决方法

    SQL2008无法附加数据库,提示“无法显示请求的对话框”(nColIndex实际值是-1)图文解决方法 SQL2008无法附加数据库,提示“无法显示请求的对话框”(nColIndex实际值是-1)图 ...

  4. ckeditor出现错误“从客户端(***)中检测到有潜在危险的 Request.Form值”的解决方法

    ckeditor出现错误“从客户端(***)中检测到有潜在危险的 Request.Form值”的解决方法 页面中使用ckeditor,提交文章时总是出错,“从客户端(TextBox1="&l ...

  5. 安装TortoiseGit出现提示“您必须安装带有更新版本Windows Installer服务的Windows Service Pack”-解决方法

    我的系统是xp sp3安装TortoiseGit时出现了错误提示“您必须安装带有更新版本Windows Installer服务的Windows Service Pack”. 解决方法,到微软官方下载相 ...

  6. 【win7下安装node.js错误:roling back action】与【"grunt" 不是内部或外部命令】 解决方法

    [win7下安装node.js错误:roling back action] 解决方法: Node.js 服务器端的JavaScript Node.js 是一个基于Chrome JavaScript 运 ...

  7. jsp 页面导出excel时字符串数字变成科学计数法的解决方法

    web导出excel数据格式化 原文地址:http://www.cnblogs.com/myaspnet/archive/2011/05/06/2038490.html   当我们把web页面上的数据 ...

  8. 阿里OSS Vue上传文件提示The OSS Access Key Id you provided does not exist in our records.解决方法

    vue项目 1.安装OSS的Node SDK npm install ali-oss --save 2.参考官方提示https://help.aliyun.com/document_detail/11 ...

  9. win7(32 bit) + IE8 环境,IE8无法弹窗(错误提示:“此网页上的错误可能会使它无法正确运行”),有关的系统注册信息损坏——解决方法

    错误截图如下:   IE有关的系统注册信息损坏,导致IE无法正常弹窗.   解决办法:重新注册与IE有关的DLL文件,具体如下: 1.以管理员身份运行附件脚本(新建txt文件,将下面代码复制到txt文 ...

随机推荐

  1. JavaScript零宽字符

    什么是零宽字符 一种不可打印的Unicode字符, 在浏览器等环境不可见, 但是真是存在, 获取字符串长度时也会占位置, 表示某一种控制功能的字符. 常见的零宽字符有哪些 零宽空格(zero-widt ...

  2. Spring框架——继承 - 依赖 - 命名空间

    Spring 继承 子 bean 可以继承⽗ bean 的属性值. <bean id="user" class="com.sunjian.entity.User&q ...

  3. 环境篇:Virtualbox+Vagrant安装Centos7

    环境篇:Virtualbox+Vagrant安装Centos7 1 安装Vagrant Vagrant下载地址:https://www.vagrantup.com/ Vagrant百度网盘:https ...

  4. 渗透神器cobalt strike在数字杀软环境下的使用

    当我们拿到cobalt strike的beacon权限时,使用它如何渗透目标内网.因为我看网上的文章都是在无杀软下写的,这难免有点脱离实战环境,本文主要测试CS的beacon在数字杀软环境下进行常规渗 ...

  5. (数据科学学习手札80)用Python编写小工具下载OSM路网数据

    本文对应脚本已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 我们平时在数据可视化或空间数据分析的过程中经常会 ...

  6. Linux Namespace 入门系列:Namespace API

    Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法.用官方的话来说,Linux Namespace 将全局系统资源封装在一个抽象中,从而使 namespace 内的进程认 ...

  7. 【2019多校第一场补题 / HDU6578】2019多校第一场A题1001Blank——dp

    HDU6578链接 题意 有一串字符串,仅由 {0,1,2,3}\{0, 1, 2, 3\}{0,1,2,3} 组成,长度为 nnn,同时满足 mmm 个条件.每个条件由三个整数组成:l.r.xl.r ...

  8. Python第五章-内置数据结构01-字符串

    Python 内置的数据结构 ​ 到目前为止,我们如果想保存一些数据,只能通过变量.但是如果遇到较多的数据要保存,这个时候时候用变量就变的不太现实. ​ 我们需要能够保存大量数据的类似变量的东东,这种 ...

  9. Feign客户端的重构,新建springcloud架构

    1,在上篇博文中,已经实现了feign 客户端来远程调用接口的功能,因为feign 客户端在springcloud 开发过程中是比较常用的方式 https://www.cnblogs.com/pick ...

  10. VMware pro 15.5安装教程

    一,安装 1.VMware pro 15.5 下载地址:https://www.vmware.com/cn/products/workstation-pro/workstation-pro-evalu ...