我正在使用javax.servlet.http.HttpServlet
来创建和初始化我的服务器。
我正在IBM WebSphere Liberty服务器上部署我的servlet。
当我尝试进行任何REST调用时,我收到401 Unauthorized
错误。
HttpURLConnection conn = null;
String url = "https://someurl/getdata";
try {
conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
String accessToken = this.token;
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-Type",
"application/x-www-form-urlencoded;charset=utf-8");
conn.setRequestProperty("Accept", "application/json;charset=utf-8");
conn.setRequestProperty("X-Auth-Token", "bmXaj83sgo4"); } catch (Exception e) {
e.printStackTrace();
}
抛出NullPointerException
或在该行返回401 Unouthorized
错误:
conn = (HttpURLConnection) url.openConnection();
但是我可以通过RestClient或使用简单的Java项目来访问相同的URL。
我的web.xml
看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1">
<display-name>SampleTesting</display-name>
<servlet>
<servlet-name>Monkey Server</servlet-name>
<servlet-class>com.sample.testing.basic.BasicMonkeyServer</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
</web-app>
答案 0 :(得分:0)
为了它的价值,这段代码(经过修改可以正常工作)运行良好,并且可以在8557上的servlet中对基本Auth保护资源进行身份验证。
您的代码或服务是不同的。发布完整的代码。
答案 1 :(得分:0)
问题在于我尝试访问的URL和我使用的凭据。 尝试使用不同的凭据,它工作正常。
答案 2 :(得分:0)
编译代码时必须有编译错误,因为url
是String
且没有openConnection()
方法:
String url = "https://someurl/getdata";
conn = (HttpURLConnection) url.openConnection();
URL url = new URL("https://someurl/getdata");
conn = (HttpURLConnection) url.openConnection();
如果您有权访问您尝试请求的资源并且您的访问令牌有效,那么您的代码应该可以正常运行。
我建议使用HttpURLConnection
,而不是使用JAX-RS Client API,这是在Java中使用REST API的标准方法:
Client client = ClientBuilder.newClient();
String data = client.target("https://someurl/getdata")
.request(MediaType.APPLICATION_FORM_URLENCODED)
.get(String.class);
要执行身份验证,请创建ClientRequestFilter
:
@Provider
public class Authenticator implements ClientRequestFilter {
private String authenticationToken;
public Authenticator(String authenticationToken) {
this.authenticationToken = authenticationToken;
}
public void filter(ClientRequestContext requestContext) throws IOException {
requestContext.getHeaders().add("X-Auth-Token", authenticationToken);
}
}
并在Client
:
Client client = ClientBuilder.newClient().register(new Authenticator("your-token"));
从长远来看,使用JAX-RS客户端API将为您提供更大的灵活性。