请求映射未执行

时间:2014-05-13 06:35:05

标签: java spring spring-mvc broadleaf-commerce

我不太确定这是否与春天有关:D

我有一张表格:

<form class="csvForm" method="post" action="/admin/myentity/bulkUpload" style="display: none;">

我有一个控制器:

@RequestMapping("/" + AdminMyController.SECTION_KEY)
@Secured("PERMISSION_OTHER_DEFAULT")
public class AdminMyController extends AdminBasicEntityController {
    protected static final String SECTION_KEY = "myentity";

@RequestMapping(value = "/bulkUpload", method = RequestMethod.POST)
public String showBulkUpload(HttpServletRequest request, HttpServletResponse response, Model model) throws IOException {
  Map<String, Object> responseMap = new HashMap<String, Object>();

  return "sts";
  }
}

我想知道为什么它不会进入showBulkUpload方法:o 当我把方法改成GET时......它会进入方法..我想知道我错过了什么

和btw,控制器bean没有问题,因为它被100%扫描

2 个答案:

答案 0 :(得分:0)

Http GET POST 方法具有不同的特征。至于你的情况,我只是猜测你给出的名字,bulkUpload,你试图上传大量的数据。与 POST 方法进行比较时,Http GET 容量有限。因此,如果您尝试上传大量数据,则可能无法通过 GET 方法将其发送到您的浏览器和服务器。

GET 方法容量可能会根据客户端浏览器以及您的Web服务器而更改。如果服务器无法处理,由于 GET 方法的长度,它应该引发414 Request-URI Too Long

  

HTTP协议不对
的长度设置任何先验限制   一个URI。服务器必须能够处理他们的任何资源的URI   服务,并且应该能够处理无限长度的URI   提供可以生成此类URI的基于GET的表单。服务器
  如果URI较长,则应该返回414(Request-URI Too Long)状态   服务器可以处理(见10.4.15节)。

Reference

10.4.15 414 Request-URI太长

  

服务器拒绝为请求提供服务,因为   Request-URI比服务器愿意解释的长。这个   只有当客户不正确时才会出现罕见情况   将POST请求转换为具有长查询的GET请求   信息,当客户端进入URI&#34;黑洞&#34;的   重定向(例如,指向后缀的重定向URI前缀   本身),或当服务器受到客户试图攻击时   利用固定长度来利用某些服务器中存在的安全漏洞   用于读取或操作Request-URI的缓冲区。

Reference

对于客户端站点,浏览器GET方法容量如下:

如果您无法访问Spring Controller,很可能在测试中使用 IE 。如果您使用 Chrome Firefox ,则您的网络服务器可能无法使用该长数据处理 GET 方法。

其他信息可在here

中找到

答案 1 :(得分:0)

这与Spring有些相关,但更具体到Broadleaf中的CsrfFilter。我猜你的CsrfFilter日志中有一个堆栈跟踪。此过滤器(连接在Broadleaf中的applicationContext-security.xml中)将确保所有POST请求都具有csrfToken请求参数(CSRF代表跨站点请求伪造)。如果您更换了您发布的代码段:

<form class="csvForm" method="post" action="/admin/myentity/bulkUpload" style="display: none;">

使用blc:将Thymeleaf处理器(自动填充csrfToken隐藏输入参数)添加到HTML中:

<blc:form class="csvForm" method="post" action="/admin/myentity/bulkUpload" style="display: none;">

然后它应该工作。