我有一个类似于以下代码的 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/