如何将特殊字符从前端的javascript发送到后端的java?



我有一个 rest Web 服务,其网址是

http://localhost/rest/authenticate?username=username&password=pa+ssw1&rd%

在密码参数中有3个特殊字符。

  1. +字符读作空格
  2. &字符删除所有字符。 例如 - 我的密码像这样"passw&rd",它会读成这样"passw"
  3. %字符未读取正确的密码,则读取 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.

相关内容

  • 没有找到相关文章

最新更新