我正在使用具有云功能的收据打印机。它与我正在实施的服务器规范相通讯。它每隔x秒钟用POST请求轮询URL,并且POST响应中包含特定信息时,打印机将GET请求发送到该URL,以获取要打印的信息。
我将打印服务器实现为Spring Boot服务器,而POST方法遇到一些奇怪的问题,我需要一些帮助。
我的问题是从打印机到服务器的POST请求从不发送到控制器。但是,我能够将Postman的POST请求发送到完全相同的URL,并由控制器处理。
URL只是:https://www.[my-domain].com:[port-number]/cloudprint
此外,我尝试将控制器方法复制到另一个在Apache后面的Tomcat实例上运行的Spring(不是Boot)应用程序中,打印机的POST请求由控制器方法处理。我可以在Apache日志和Tomcat日志中看到它们。当前的轮询频率为10秒。
这是控制器的外观:
package com.[my-domain].[application-name].controller;
[a bunch of imports]
@RestController
@CrossOrigin
public class PrintController {
Logger logger = LoggerFactory.getLogger(PrintController.class);
@RequestMapping(value="/cloudprint", method=RequestMethod.POST,
headers={"Accept=application/json"})
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody String printPost() {
logger.debug("in printPost");
return "OK";
}
@RequestMapping(value="/cloudprint", method=RequestMethod.GET,
headers={"Accept=application/json"})
@ResponseStatus(HttpStatus.OK)
public @ResponseBody String printGet(HttpServletRequest request) {
logger.debug("in printGet");
return "OK";
}
@RequestMapping(value="/cloudprint", method=RequestMethod.DELETE,
headers={"Accept=application/json"})
@ResponseStatus(HttpStatus.OK)
public @ResponseBody String printDelete() {
logger.debug("in printDelete");
return "OK";
}
}
可能是什么原因造成的?我可以测试什么来解决此问题?
答案 0 :(得分:3)
您好,您正在通过HTTPS访问REST服务。您从服务器收到的消息非常清楚。
sun.security.validator.ValidatorException:PKIX路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法执行 找到到达要求目标的有效认证路径;嵌套异常为 javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException:PKIX路径构建失败: sun.security.provider.certpath.SunCertPathBuilderException:无法执行 找到到所请求目标的有效认证路径
您尚未将证书添加到ca存储中。有关如何执行此操作的详细分步指南,请点击此处
Getting ssl.SSLHandshakeException when using REST client with header but works fine with PostMan
答案 1 :(得分:1)
每当Java尝试通过SSL(例如HTTPS,IMAPS,LDAPS)连接到另一个应用程序时,它只有在能够信任该应用程序的情况下才能连接到该应用程序。
在Java世界中处理信任的方式是您拥有一个密钥库(通常为$ JAVA_HOME / lib / security / cacerts),也称为信任库。它包含所有已知证书颁发机构(CA)证书的列表,并且Java将仅信任由这些CA之一签名的证书或该密钥库中存在的公共证书。
因此,此问题是由自签名的证书(CA未对其进行签名)或Java信任库中不存在的证书链引起的。它不信任证书,并且无法连接到应用程序。
答案 2 :(得分:1)
我不确定发出发布请求时使用哪种格式。您可以使用邮递员来验证您的应用程序可以处理哪种邮递。并发送相同的发帖请求,我相信您可以轻松找到每个示例代码。通常,当我们从html页面提交帖子时,我们使用x-www-form-urlencoded。
答案 3 :(得分:0)
如果您使用Spring Boot 2 ,则可能由于csrf保护而发生。它仅影响非GET请求,默认情况下在Spring Boot 2中已打开,但在较早版本中已关闭。
所以它很好地反映了您的问题描述-尽管我不完全了解它如何通过Postman运作...但是有可能它会以某种方式自动处理...
无论如何,值得一试:
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable();
}
}