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

时间:2018-05-29 11:48:40

标签: java rest web-services

我有一个其网址为

的其他网络服务

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

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

  1. +字符读为空格
  2. &字符删除所有字符。例如 - 我的密码就像这个"passw&rd"一样,它会像"passw"
  3. 一样读取
  4. %字符未读取正确的密码,其读取空值。
  5. 我的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();
        }
    }
    

    你能建议我如何阅读所有这些特殊的角色吗?

2 个答案:

答案 0 :(得分:0)

首先,我建议您不要在网址中发送用户名和密码等敏感数据。您应该在请求正文中发送。

一种简单的方法是在javascript中对前端进行Base64编码,在java中对后端进行解码。

FrontEnd :所有Chrome版本,Firefox 1.0及更高版本,Internet Explorer 10及以上版本

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");

For< Java 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。

答案 1 :(得分:0)

所有的拳头,不要在URL中发送密码 - 这只是非常糟糕的安全性,因为查询参数可以记录在Apache或NGINX日志中,并且经常暴露在外。

其次,如果您使用的是HTTP,请了解某些字符需要转义。

%2B +
%20 {space}
%26 &

您必须确保您的代码实际上正在解码字符串,但根据您的框架,它可能会自动执行(例如Spring),或者您可能需要添加快速标注来解码。

如果您更改了URI编码的行为,则会更改HTTP规范,这将使消费您API的任何人都难以了解正在发生的事情 - 特别是如果您抓住&符号,因为任何URI编码都将被破坏为您的API。

请参阅RFC:统一资源标识符(URI):通用语法https://tools.ietf.org/html/rfc3986