我有一个 rest Web 服务,其网址是
http://localhost/rest/authenticate?username=username&password=pa+ssw1&rd%
在密码参数中有3个特殊字符。
+
字符读作空格&
字符删除所有字符。 例如 - 我的密码像这样"passw&rd"
,它会读成这样"passw"
%
字符未读取正确的密码,则读取 null 值。
我的 API 像这样...
@Path("/authenticate")
public class AuthenticateService {
private ILiteWebServiceFacade liteWebServiceFacade = ServiceLocator.locateService(ILiteWebServiceFacade.class);
@POST
@Produces(MediaType.APPLICATION_JSON)
public Response authenticate(@FormParam("username") String username,
@FormParam("password") String password)
throws RestException {
AuthenticateResponse res = new AuthenticateResponse();
try {
res = liteWebServiceFacade.mobAuthenticate(username, password);
} catch (RestApplicationException e) {
res.setError(e.getErrorMessage().getErrorCode(), e.getErrorMessage().getErrorMessageKey());
}
return Response.ok(res).build();
}
}
你能建议我如何阅读所有这些特殊字符吗?
首先,不要在URL中发送密码 - 它的安全性真的很差,因为查询参数可以记录在Apache或NGINX日志中,并且经常在此过程中暴露。
其次,如果您使用的是 HTTP,请了解某些字符需要转义。
%2B +
%20 {space}
%26 &
你必须确保你的代码实际上是在解码字符串,但根据你的框架,它可能会自动完成(例如,Spring这样做(,或者你可能必须添加一个快速标注来解码。
如果你改变URI编码的行为,你就改变了HTTP规范,这将使任何使用你的API的人都很难理解发生了什么 - 特别是如果你抓住与号,因为任何URI编码都会被破坏你的API。
请参阅 RFC:统一资源标识符 (URI(:泛型语法 https://www.rfc-editor.org/rfc/rfc3986
首先,我建议您不要在URL中发送用户名和密码等敏感数据。您应该在请求正文中发送它。
一个简单的方法是在javascript的前端进行Base64编码,在java的后端进行解码。
前端:全chrome版本,火狐1.0及以上,IE10及以上
var string = 'pa+ssw1&rd%';
// Encode the String
var encodedString = btoa(string);
console.log(encodedString); // Outputs: cGErc3N3MSZyZCU=
// Decode the String
var decodedString = atob(encodedString);
console.log(decodedString); // Outputs: pa+ssw1&rd%
后端:
对于 Java 8 及更高版本:
import java.util.Base64;
byte[] decoded = Base64.getDecoder().decode(password);
decodedpassword = new String(decoded, "utf-8");
对于
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.binary.StringUtils;
public String decode1(String s) {
return StringUtils.newStringUtf8(Base64.decodeBase64(s));
}
public String decode2(String s) {
return new String(Base64.decodeBase64(s), "utf-8");
}
Maven/sbt repo: commons-codec, commons-codec, 1.8.