我正在阅读HiddenHttpMethodFilter
here的文档
然后出现:
过滤器,用于将发布的方法参数转换为HTTP方法, 可通过HttpServletRequest.getMethod()检索。由于浏览器 目前仅支持GET和POST,这是一种通用技术-由 原型库,例如-使用带有 额外的隐藏表单字段(_method)以传递“真实” HTTP方法 沿。该过滤器读取该参数并更改 HttpServletRequestWrapper.getMethod()返回相应的值。只要 允许使用“ PUT”,“ DELETE”和“ PATCH” HTTP方法。
很明显,浏览器不仅支持GET
和POST
,而且该链接不是针对旧版本的spring处理古老的浏览器的,我可以想象像spring这样的广泛使用的框架可以准确地文档。
那我想念什么?
答案 0 :(得分:1)
该引用的意思是<form></form>
html元素只能具有方法POST
或GET
:
这是用于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
}
}