【问题标题】:URL.openConnection() method not working on WebSphere Liberty ProfileURL.openConnection() 方法不适用于 WebSphere Liberty Profile
【发布时间】:2016-01-16 10:06:59
【问题描述】:

我正在使用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>

【问题讨论】:

  • 问题中的代码不会编译给定的 url 是字符串而不是 java.net.URL。如果您提供了实际代码和异常,它可能会有所帮助。获得 401 时,您是否检查过您是否可以访问?访问的资源是否受到保护,您是否提供了任何凭据?
  • @Alasdair:谢谢你的回复。是的,你是对的。我正在将 URL 从字符串类型转换为 java.net.URL。

标签: servlets jax-rs httpurlconnection httpserver websphere-liberty


【解决方案1】:

对于它的价值,这段代码(修改为可以工作)运行良好,并在 8557 上的 servlet 内对基本身份验证保护的资源进行了良好的身份验证。

您的代码或服务可能会有所不同。贴出完整代码。

【讨论】:

  • 谢谢。是的,代码工作正常。我尝试使用不同的凭据和 URL,它正在工作。
【解决方案2】:

问题在于我尝试访问的 URL 和我使用的凭据。 尝试使用不同的凭据,它工作正常。

【讨论】:

    【解决方案3】:

    编译错误

    编译代码时一定有编译错误,因为urlString 并且没有openConnection() 方法:

    String url = "https://someurl/getdata";
    conn = (HttpURLConnection) url.openConnection();
    

    尝试使用URL 而不是String

    URL url = new URL("https://someurl/getdata");
    conn = (HttpURLConnection) url.openConnection();
    

    如果您有权访问您尝试请求的资源并且您的访问令牌有效,那么您的代码应该可以正常工作。

    JAX-RS 客户端 API

    我建议你使用JAX-RS Client API,而不是使用HttpURLConnection,这是在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 将为您提供更大的灵活性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-03
      • 1970-01-01
      • 2015-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多