rest - 为什么基本身份验证总是使用 restTemplate 给出错误 403?
问题描述
我尝试了多种方法在spring boot项目中通过RestTemplate调用get url来获取json,但每次我得到以下403错误:
<200,{"request":{"mbean":"org.apache.activemq.artemis:address=%22my.queue.demo%22,broker=%22141.110.112.13%22,component=addresses,queue=%22my.queue.demo%22,routing-type=%22anycast%22,subcomponent=queues","attribute":"MessageCount","type":"read"},"error_type":"java.lang.Exception","error":"java.lang.Exception
: Reading attribute MessageCount is forbidden for MBean
org.apache.activemq.artemis:address=%22my.queue.demo%22,broker=%22141.110.112.13%22,component=addresses,queue=%22my.queue.demo%22,routing-type=%22anycast%22,subcomponent=queues","status":403},[Date:"Wed,
12 Jun 2019 12:56:22 GMT", Cache-Control:"no-cache",
Pragma:"no-cache", Access-Control-Allow-Origin:"*",
X-Frame-Options:"SAMEORIGIN", X-XSS-Protection:"1",
Content-Type:"text/plain;charset=utf-8", Expires:"Wed, 12 Jun 2019
11:56:22 GMT", Transfer-Encoding:"chunked"]>
这是我尝试调用的网址:
http://10.185.148.153:1495/console/jolokia/read/org.apache.activemq.artemis:broker=%22141.110.112.13%22,component=addresses,address=%22my.queue.demo%22,subcomponent=queues,routing-type=%22anycast%22,queue=%22my.queue.demo%22/MessageCount
当我将 Postman 与基本身份验证(用户 = 测试,通过 = 测试)一起使用时,它可以找到但不能与 Resttemplate 一起使用。
这是我的配置类:
@SpringBootApplication
public class StartWebApplication {
public static void main(String[] args) {
SpringApplication.run(StartWebApplication.class, args);
}
}
@Configuration
class Appconfig{
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
我的控制器:
...
@Autowired
private RestTemplate restTemplate;
....
restTemplate.exchange(url, HttpMethod.GET, createHeaders("test", "test"), String.class)
....
HttpEntity createHeaders(String username, String password) {
byte[] token = Base64.getEncoder().encode(
(username + ":" + password).getBytes());
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + new String(token));
HttpEntity<String> request = new HttpEntity<>(headers);
return request;
}
}
解决方案
使用RestTemplate
,您可以避免一些Base64
样板文件:
@Bean
RestTemplate rest() {
RestTemplate rest = new RestTemplate();
rest.getInterceptors().add(new BasicAuthenticationInterceptor("test", "test"));
return rest;
}
然后你可以简单地做:
rest.getForObject(url, String.class);
不确定问题是否出在您的用户名和密码的 Base64-ing 中,但这样做会消除这种可能性。
推荐阅读
- reactjs - React Apollo (GraphQL):如何阻止查询组件在每次状态更改时重新获取
- symfony5 - 将 Postmark 与 Symfony Mailer 集成的问题
- ip - 是否可以在xilinx的axi4-stream交换机IP上的masters和slave接口上配置相同的tdata宽度?
- html - 如何忽略全局css?
- sapui5 - UI5 设置独立于 UI 样式其余部分的表格内容密度/边距
- json - 忽略 JSON 的自写转换的顺序和缺失字段
- synchronization - 2个液压缸的同步位置控制
- ios - 为什么我无法使用 WKWebView 加载有效的 PDF 文件?
- php - 我的应用程序存储重复的订单列表项。这就像我所知道的 3 次一样随机发生。这是存储方法(Laravel 5.6)
- loops - tidyverse 中的时间依赖性:避免循环?