Java Rest API JAX-RS URL

标签 java rest tomcat jax-rs

我有一个类似于以下代码的 Java 应用程序。我需要能够将用户名、密码和 url 传递给它来执行任务。 url 调用会是什么样子?

用户名将是一个电子邮件地址:myemail@mail.com 密码只是一个字符串 网址将是:例如:hhtps://login.salesforce.com/services/Soap/u/37.0

到目前为止,我有这个 url,但它不起作用

localhost:8080/myAPP/webapi/myapi?user=some@email.com&pass=jsjjsd&url=hhtps://login.salesforce.com/services/Soap/u/37.0

类代码

@Path("/myapi")
public class myClass(){


@GET
@Path("/{user}/{pass}/{url}")
@Produces(MediaType.APPLICATION_JSON)
public String foo(@PathParam("user") String user,
                    @PathParam("pass") String pass,
                    @PathParam("url") String url) {
     return "test";
}

}

最佳答案

在 URL 中发送敏感数据是一个非常糟糕的主意。 永远不要这样做。请求的 URL 由服务器和代理记录。如果浏览器请求该 URL,该 URL 将进入浏览器历史记录。 这是一个安全漏洞。

你不应该做的事

在下面找到您绝不能使用的两个坏方法

如果您的端点是这样的:

@Path("/myapi")
public class MyResource() {

    @GET
    @Path("/{user}/{pass}/{url}")
    @Produces(MediaType.APPLICATION_JSON)
    public String foo(@PathParam("user") String user,
                      @PathParam("pass") String pass,
                      @PathParam("url") String url) {
         ...
    }
}

请求是这样的:

GET /myAPP/webapi/myapi/some%40email.com/jsjjsd/https%3A%2F%2Flogin.salesforce.com%2Fservices%2FSoap%2Fu%2F37.0 HTTP/1.1
Host: localhost:8080
Accept: application/json

如果您的端点是这样的:

@Path("/myapi")
public class MyResource() {

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public String foo(@QueryParam("user") String user,
                      @QueryParam("pass") String pass,
                      @QueryParam("url") String url) {
        ...
    }
}

请求是这样的:

GET /myAPP/webapi/myapi?user=some%40email.com&pass=jsjjsd&url=https%3A%2F%2Flogin.salesforce.com%2Fservices%2FSoap%2Fu%2F37.0 HTTP/1.1
Host: localhost:8080
Accept: application/json

请注意参数值是经过 URL 编码的。如需进一步引用,请查看此 answer .

你应该做什么

通过网络发送敏感数据时,强烈建议使用 HTTPS。 HTTPS将保护您免受中间人攻击。对于证书颁发机构,您可以考虑 Let's Encrypt .它声称是免费的、自动化的和开放的。

不要在 URL 中发送这些参数,您应该使用 POST 在请求负载中发送它们.例如,请求负载可以是 JSON。使用 JAX-RS 后,您可以使用 JSON 提供程序,例如 Jackson。

为此,定义如下所示的 bean:

public class Credentials implements Serializable {

    private String user;
    private String pass;
    private String url;

    // Getters and setters omitted
}

并在你的资源方法中使用它:

@Path("/myapi")
public class MyResource() {

    @POST
    @Consumer(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public String foo(Credentials credentials) {
        ...
    }
}

请求是这样的:

POST /myAPP/webapi/myapi HTTP/1.1
Host: localhost:8080
Content-Type: application/json
Accept: application/json

{
  "user": "some@email.com",
  "pass": "jsjjsd",
  "url": "https://login.salesforce.com/services/Soap/u/37.0"
}

关于Java Rest API JAX-RS URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38900473/

相关文章:

java - 有没有办法在 Java 中嵌入浏览器?

java - Spring Boot war 文件在 tomcat 上不起作用

java - REST - 如何缩小 Json 响应

xml - 在 XML 中编写 HTTP header

git - 如何通过 GitLab REST API 获取文件的原始内容?

tomcat - 为什么tomcat的应用程序没有结束斜线就不能运行?

java - Tomcat、HTTP Keep-Alive 和 Java 的 HttpsUrlConnection

java - 让 Ant 在不同情况下使用不同的构建类?

java - 如何更改 JFoenix 拾色器库的 CSS 样式?

java - 如何编写 Jsoup 选择器来获取页面中包含非 anchor 标记文本的元素?