Spring Doc为什么说浏览器只支持GET和POST方法

时间:2018-10-25 07:39:30

标签: java spring http-headers

我正在阅读HiddenHttpMethodFilter here的文档 然后出现:

  

过滤器,用于将发布的方法参数转换为HTTP方法,   可通过HttpServletRequest.getMethod()检索。由于浏览器   目前仅支持GET和POST,这是一种通用技术-由   原型库,例如-使用带有   额外的隐藏表单字段(_method)以传递“真实” HTTP方法   沿。该过滤器读取该参数并更改   HttpServletRequestWrapper.getMethod()返回相应的值。只要   允许使用“ PUT”,“ DELETE”和“ PATCH” HTTP方法。

很明显,浏览器不仅支持GETPOST,而且该链接不是针对旧版本的spring处理古老的浏览器的,我可以想象像spring这样的广泛使用的框架可以准确地文档。

那我想念什么?

3 个答案:

答案 0 :(得分:1)

该引用的意思是<form></form> html元素只能具有方法POSTGET

这是用于POST:<form method="POST" ...></form>

这是针对GET:<form method="GET" ...></form>

如果要使用除POST和GET之外的其他代码,请像下面的代码片段所示使用它。
例如,如果您想使用PUT:

<form method="POST" ...>
  <input type="hidden" name="_method" value="PUT" />
</form>

如果像这样<form method="PUT" ...></form>使用它,它将无法正常工作。

阅读this了解更多信息。

答案 1 :(得分:0)

我的猜测是,您在web.xml中引用了一个配置,如下所示:

  <filter>
    <filter-name>method-filter</filter-name>
    <filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
  </filter>

  <filter-mapping>
    <filter-name>method-filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

您所引用的功能涵盖了不支持某些请求类型的浏览器的方案,并且如果/当添加新的请求类型但仍不支持它们时,在某些情况下它仍然有用。

在许多项目中,您可能会注意到与“冗余”类似的另一件事,即许多后端开发人员在构建REST api时设置了CharacterEncodingFilter的利用率。在这种情况下,在他们的web.xml中会看到类似这样的设置:

<filter>
    <filter-name>encoding-filter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
      <param-name>encoding</param-name>
      <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
      <param-name>forceEncoding</param-name>
      <param-value>true</param-value>
    </init-param>
  </filter>

  <filter-mapping>
    <filter-name>encoding-filter</filter-name>
    <url-pattern>/*</url-pattern>
  </filter-mapping>

与此同时,许多前端开发人员设置了自己的标头,这些标头基本上执行相同的操作。从根本上讲这并没有错,实际上它可以解决所有可能的情况,尽管有些人可能觉得多余,但其他人会发现它注重细节。

TL; DR: Spring是一个企业就绪的框架,不仅提供新功能,而且还涵盖了诸如边缘情况,向后兼容性以及向新技术的迁移策略等问题。

答案 2 :(得分:0)

也许您只需要添加一个过滤器,希望对您有所帮助。

@WebFilter(asyncSupported = true, urlPatterns = {"/*"})
public class DeckCORSFilter implements Filter {

    /**
     * Logger
     */
    private static final Logger M_LOG = Logger.getLogger(DeckCORSFilter.class);

    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.Filter#destroy()
     */
    @Override
    public void destroy() {
        // TODO Auto-generated method stub

    }

    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest,
     * javax.servlet.ServletResponse, javax.servlet.FilterChain)
     */
    @Override
    public void doFilter(final ServletRequest req, final ServletResponse res,
            final FilterChain chain) throws IOException, ServletException {
        if (M_LOG.isDebugEnabled()) {
            M_LOG.debug("CORS filter enabled...........");
            M_LOG.debug("CORS filter req.........." + req.toString());

        }

        final HttpServletResponse response = (HttpServletResponse) res;
        response.setHeader("Access-Control-Allow-Origin", "*");// allow access
        // from all
        // orgins
        response.setHeader("Access-Control-Allow-Methods",
                "POST, GET, PUT, OPTIONS, DELETE");// allows only specified
        // methods
        // gives the value in seconds for how long the response to the preflight
        // request can be cached for without sending another preflight request.
        response.setHeader("Access-Control-Max-Age", "3600");
        // Content-Type, confirming that these are permitted headers to be used
        // with the actual request
        response.setHeader("Access-Control-Allow-Headers",
                "x-requested-with,Content-Type,Authorization");
        chain.doFilter(req, res);

    }

    /*
     * (non-Javadoc)
     * 
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
     */
    @Override
    public void init(final FilterConfig filerConfig) throws ServletException {
        // TODO Auto-generated method stub

    }

}