GVKun编程网logo

在Spring Boot应用程序中禁用HTTP OPTIONS方法(springboot禁用options请求)

15

关于在SpringBoot应用程序中禁用HTTPOPTIONS方法和springboot禁用options请求的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于html–我可以在Spring

关于在Spring Boot应用程序中禁用HTTP OPTIONS方法springboot禁用options请求的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于html – 我可以在Spring Boot应用程序中从Thymeleaf表发出HTTP POST请求、Spring Boot应用程序中特定于环境的application.properties文件、Spring Boot应用程序中的特定于环境的application.properties文件、Spring Boot应用程序同时支持HTTP和HTTPS协议的实现方法等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

在Spring Boot应用程序中禁用HTTP OPTIONS方法(springboot禁用options请求)

在Spring Boot应用程序中禁用HTTP OPTIONS方法(springboot禁用options请求)

我已经在spring boot应用程序上开发了rest
API。这些API仅接受GET和POST,但是在使用OPTIONS方法请求时,API会响应200状态(而不是405)。我用谷歌搜索了这个问题,但是没有一个解决方案是基于springboot的。

响应:

Allow: OPTIONS, TRACE, GET, HEAD, POSTPublic: OPTIONS, TRACE, GET, HEAD, POST

需要禁用OPTIONS方法。

答案1

小编典典

先前的答仅适用于tomcat,因此也要添加我的。您可以通过例如使用标准的servlet过滤器来禁用方法交叉容器:

import java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse;import org.springframework.stereotype.Component;     import org.springframework.web.filter.OncePerRequestFilter;@Componentpublic class MethodFilter extends OncePerRequestFilter {    @Override     protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)                     throws ServletException, IOException {         if (request.getMethod().equals("OPTIONS")) {            response.sendError(HttpServletResponse.SC_METHOD_NOT_ALLOWED);        } else {             filterChain.doFilter(request, response);         }     }}

注意:假设此类由Spring组成。如果没有,您可以使用此处详细介绍的其他注册方法。

html – 我可以在Spring Boot应用程序中从Thymeleaf表发出HTTP POST请求

html – 我可以在Spring Boot应用程序中从Thymeleaf表发出HTTP POST请求

我在一个简单的 Spring Boot应用程序中有一个Thymeleaf模板.该模板在表中包含一个列表,如下所示:

<p>There are <span th:text="${#lists.size(persons)}"></span> people:</p>
<table th:if="${not #lists.isEmpty(persons)}" border="1">
    <tr>
        <th>ID</th>
        <th>Name</th>
        <th>Address</th>
        <th>Telephone</th>
        <th>Email</th>
        <th>Actions</th>
    </tr>
    <tr th:each="person : ${persons}">
        <td th:text="${person.personId}"></td>
        <td th:text="${person.name}"></td>
        <td th:text="${person.address}"></td>
        <td th:text="${person.telephone}"></td>
        <td th:text="${person.email}"></td>
        <td>
            <a href="#" data-th-href="@{/edit(personId=${person.personId})}">Edit</a> |
            <a href="#" data-th-href="@{/delete(personId=${person.personId})}">Delete</a>
        </td>
    </tr>
</table>

我想根据表格中的最后一个单元格启用编辑和删除功能.但目前这两个请求都是针对HTTP GET的.这对于从服务器获取人员的详细信息以进行编辑的编辑很好,但是由于服务器上的数据更改,删除应该触发POST请求.

有没有人知道Thymeleaf是否允许每行一个表的POST请求?或者我是否必须每行编写一个简单的HTML表单?

GET表格目前是:

<td>
    <a href="#" data-th-href="@{/edit(personId=${person.personId})}">Edit</a>
    <!--a href="#" data-th-href="@{/delete(personId=${person.personId})}">Delete</a></td-->
    <form method="get" th:action="@{/edit(personId=${person.personId})}">
        <button type="submit" name="submit" value="value">Edit</button>
    </form>
</td>

我有一个链接和一个表格进行测试.

要调用的控制器方法是:

// Gets a Person.
@RequestMapping(value="/edit",method=RequestMethod.GET)
public String getEditPerson(@RequestParam("personId") String personId,Model model) {
    logger.info(PersonController.class.getName() + ".getEditPerson() method called."); 

    Person person = personDAO.get(Integer.parseInt(personId));
    model.addAttribute("person",person);

    // Set view.      
    return "/edit";
}

调用GET按钮版本时的错误是:

Whitelabel Error Page

This application has no explicit mapping for /error,so you are seeing this as a fallback.

Sun Jul 24 00:26:16 BST 2016
There was an unexpected error (type=Bad Request,status=400).
required String parameter 'personId' is not present`

我正在使用GET来触发编辑,因为除了personId之外,没有数据发送到服务器.没有采取数据库操作,所以它应该是GET.

解决方法

你正在使用链接,我认为这是不可能的,你需要使用一个表格,你可以指定要使用的方法POST.

在下面的示例中,使用< button>而不是< a>元素,但它会工作,你唯一需要做的就是用CSS设置你的按钮样式,看起来像你的链接

<form method="POST" th:action="@{/edit(personId=${person.personId})}">
    <button type="submit" name="submit" value="value">This is a link that sends a POST request</button>
</form>

现在你的代码应该是这样的

<tr th:each="person : ${persons}">                
    <td th:text="${person.personId}"></td>
    <td th:text="${person.name}"></td>
    <td th:text="${person.address}"></td>
    <td th:text="${person.telephone}"></td>
    <td th:text="${person.email}"></td>
    <td>
        <form method="POST" th:action="@{/edit(personId=${person.personId})}">
            <button type="submit" name="submit" value="value">EDIT</button>
        </form> | 
        <form method="POST" th:action="@{/delete(personId=${person.personId})}">
            <button type="submit" name="submit" value="value">DELETE</button>
        </form>
    </td>
</tr>

编辑

当您刚刚分享Java代码时,在控制器中您期望personId不是PathVariable,而是作为RequestParam,
在这种情况下,你的表格应具有这个价值……

编辑您的表单并添加人员ID,如下所示.

<form method="POST" th:action="@{/edit}">
    <input type="hidden" name="personid" id="personId" th:value="${person.personId}" />
    <button type="submit" name="submit" value="value">This is a link that sends a POST request</button>
</form>

另请注意,我将表单的操作更改为/ edit,就像控制器的外观一样

Spring Boot应用程序中特定于环境的application.properties文件

Spring Boot应用程序中特定于环境的application.properties文件

在我的Spring
Boot应用程序中,我想创建特定于环境的属性文件。我在战争中应用程序的包装类型,我正在嵌入式tomcat中执行它。我使用sts并从sts本身执行main。

  1. 我可以拥有特定于环境的属性文件,例如application-$ {env-value} .properties吗?

在上述情况下,env-value的值将为local / devl / test / prod

  1. 在哪里设置环境价值文件?对于本地,我可以通过sts将其设置为jvm参数

  2. 谁在S​​pring Boot应用程序中读取application.properties。

  3. 如何加载环境特定的属性文件?例如-如果我在特定于环境的属性文件中设置数据库uid,pwd,schema等,在这种情况下,数据源将能够理解其中的属性吗?

  4. 我可以同时使用application.properties和application-local.properties文件吗?

答案1

小编典典

Spring Boot已经支持基于配置文件的属性。

只需添加application-[profile].properties文件并使用spring.profiles.active属性指定要使用的配置文件。

-Dspring.profiles.active=local

这会从第一个加载application.propertiesapplication-local.properties,后者具有后者的覆盖属性。

Spring Boot应用程序中的特定于环境的application.properties文件

Spring Boot应用程序中的特定于环境的application.properties文件

如何解决Spring Boot应用程序中的特定于环境的application.properties文件?

Spring Boot已经支持基于配置文件的属性。

只需添加application-[profile].properties文件并使用spring.profiles.active属性指定要使用的配置文件。

-Dspring.profiles.active=local

这将加载application.propertiesapplication-local.properties与来自第一后者压倒一切的性质。

解决方法

在我的Spring Boot应用程序中,我想创建特定于环境的属性文件。我在战争中应用程序的包装类型,我正在嵌入式tomcat中执行它。我使用sts并从sts本身执行main。

  1. 我可以拥有特定于环境的属性文件,例如application-$ {env-value} .properties吗?
    在上述情况下,env-value的值将为local / devl / test / prod

  2. 在哪里设置环境值文件?对于本地,我可以通过sts将其设置为jvm参数

  3. 谁在S​​pring Boot应用程序中读取application.properties。

  4. 如何加载环境特定的属性文件?例如-如果我在特定于环境的属性文件中设置数据库uid,pwd,schema等,在这种情况下,数据源将能够理解其中的属性吗?

  5. 我可以同时使用application.properties和application-local.properties文件吗?

Spring Boot应用程序同时支持HTTP和HTTPS协议的实现方法

Spring Boot应用程序同时支持HTTP和HTTPS协议的实现方法

如今,企业级应用程序的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程序同时支持HTTP和HTTPS两种协议,需要的朋友可以参考下

如今,企业级应用程序的常见场景是同时支持HTTP和HTTPS两种协议,这篇文章考虑如何让Spring Boot应用程序同时支持HTTP和HTTPS两种协议。

准备

为了使用HTTPS连接器,需要生成一份Certificate keystore,用于加密和机密浏览器的SSL沟通。

如果你使用Unix或者Mac OS,可以通过下列命令:keytool -genkey -alias tomcat -keyalg RSA,在生成过程中可能需要你填入一些自己的信息,例如我的机器上反馈如下:

可以看出,执行完上述命令后在home目录下多了一个新的.keystore文件。

实战首先在resources目录下新建一个配置文件tomcat.https.properties,用于存放HTTPS的配置信息;

custom.tomcat.https.port=8443 custom.tomcat.https.secure=true custom.tomcat.https.scheme=https custom.tomcat.https.ssl=true custom.tomcat.https.keystore=${user.home}/.keystore custom.tomcat.https.keystore-password=changeit

然后在WebConfiguration类中创建一个静态类TomcatSslConnectorProperties;

@ConfigurationProperties(prefix = "custom.tomcat.https") public static class TomcatSslConnectorProperties { private Integer port; private Boolean ssl = true; private Boolean secure = true; private String scheme = "https"; private File keystore; private String keystorePassword; //这里为了节省空间,省略了getters和setters,读者在实践的时候要加上 public void configureConnector(Connector connector) { if (port != null) { connector.setPort(port); } if (secure != null) { connector.setSecure(secure); } if (scheme != null) { connector.setScheme(scheme); } if (ssl != null) { connector.setProperty("SSLEnabled", ssl.toString()); } if (keystore != null && keystore.exists()) { connector.setProperty("keystoreFile", keystore.getAbsolutePath()); connector.setProperty("keystorePassword", keystorePassword); } } }

通过注解加载tomcat.https.properties配置文件,并与TomcatSslConnectorProperties绑定,用注解修饰WebConfiguration类;

@Configuration @PropertySource("classpath:/tomcat.https.properties") @EnableConfigurationProperties(WebConfiguration.TomcatSslConnectorProperties.class) public class WebConfiguration extends WebMvcConfigurerAdapter {...}

在WebConfiguration类中创建EmbeddedServletContainerFactory类型的Srping bean,并用它添加之前创建的HTTPS连接器。

@Bean public EmbeddedServletContainerFactory servletContainer(TomcatSslConnectorProperties properties) { TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory(); tomcat.addAdditionalTomcatConnectors(createSslConnector(properties)); return tomcat; } private Connector createSslConnector(TomcatSslConnectorProperties properties) { Connector connector = new Connector(); properties.configureConnector(connector); return connector; }

通过mvn spring-boot:run启动应用程序;在浏览器中访问URLhttps://localhost:8443/internal/tomcat.https.properties

在浏览器中访问URLhttp://localhost:8080/internal/application.properties

分析

根据之前的文章和官方文档,Spring Boot已经对外开放了很多服务器配置,这些配置信息通过Spring Boot内部的ServerProperties类完成绑定,若要参考Spring Boot的通用配置项,请点击这里

Spring Boot不支持通过application.properties同时配置HTTP连接器和HTTPS连接器。在官方文档70.8中提到一种方法,是将属性值硬编码在程序中。

因此我们这里新建一个配置文件tomcat.https.properties来实现,但是这并不符合“Spring Boot风格”,后续有可能应该会支持“通过application.properties同时配置HTTP连接器和HTTPS连接器”。我添加的TomcatSslConnectorProperties是模仿Spring Boot中的ServerProperties的使用机制实现的,这里使用了自定义的属性前缀custom.tomcat而没有用现有的server.前缀,因为ServerProperties禁止在其他的配置文件中使用该命名空间。

@ConfigurationProperties(prefix = "custom.tomcat.https")这个注解会让Spring Boot自动将custom.tomcat.https开头的属性绑定到TomcatSslConnectorProperties这个类的成员上(确保该类的getters和setters存在)。值得一提的是,在绑定过程中Spring Boot会自动将属性值转换成合适的数据类型,例如custom.tomcat.https.keystore的值会自动绑定到File对象keystore上。

使用@PropertySource("classpath:/tomcat.https.properties")来让Spring Boot加载tomcat.https.properties文件中的属性。

使用@EnableConfigurationProperties(WebConfiguration.TomcatSslConnectorProperties.class)让Spring Boot自动创建一个属性对象,包含上述通过@PropertySource导入的属性。

在属性值导入内存,并构建好TomcatSslConnectorProperties实例后,需要创建一个EmbeddedServletContainerFactory类型的Spring bean,用于创建EmbeddedServletContainer。

通过createSslConnector方法可以构建一个包含了我们指定的属性值的连接器,然后通过tomcat.addAdditionalTomcatConnectors(createSslConnector(properties));设置tomcat容器的HTTPS连接器。

参考资料配置SSL

Spring Boot 1.x系列

了解Spring Boot的自动配置

springboot整合redis进行数据操作(推荐)

Spring Boot项目中如何定制HTTP消息转换器

Spring Boot整合Mongodb提供Restful接口

总结

以上所述是小编给大家介绍的Spring Boot应用程序同时支持HTTP和HTTPS协议的实现方法,希望对大家有所帮助!

关于在Spring Boot应用程序中禁用HTTP OPTIONS方法springboot禁用options请求的介绍现已完结,谢谢您的耐心阅读,如果想了解更多关于html – 我可以在Spring Boot应用程序中从Thymeleaf表发出HTTP POST请求、Spring Boot应用程序中特定于环境的application.properties文件、Spring Boot应用程序中的特定于环境的application.properties文件、Spring Boot应用程序同时支持HTTP和HTTPS协议的实现方法的相关知识,请在本站寻找。

本文标签: