Как отправить специальные символы из javascript на веб-интерфейсе в java на серверной части? - PullRequest
0 голосов
/ 29 мая 2018

У меня есть веб-сервис отдыха, URL которого равен

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

В параметре пароля есть 3 специальных символа.

  1. + символ читается какпробел
  2. & символ удалить все символы.например - мой пароль, такой как "passw&rd", и он будет выглядеть следующим образом: "passw"
  3. % символ не читает правильный пароль, он читает нулевое значение.

мой 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 голосов
/ 29 мая 2018

Прежде всего, не отправляйте пароли в URL-адресе - это просто очень плохая безопасность, поскольку параметры запроса могут регистрироваться в журналах Apache или NGINX и часто показываются по пути.

Во-вторых,если вы используете HTTP, помните, что некоторые символы необходимо экранировать.

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

Вы должны будете убедиться, что ваш код на самом деле декодирует строки, но в зависимости от вашей структуры он может сделать это автоматически (например, Spring) или вам может понадобиться добавить быстрый вызов вдекодирования.

Если вы измените поведение кодировки URI, вы измените спецификацию HTTP, и любому, кто использует ваш API, будет трудно понять, что происходит, особенно если вы захватываете амперсанды из-за любой кодировки URIбудет сломан для вашего API.

См. RFC: Универсальный идентификатор ресурса (URI): Общий синтаксис https://tools.ietf.org/html/rfc3986

0 голосов
/ 29 мая 2018

Во-первых, я рекомендую вам не отправлять конфиденциальные данные, такие как имя пользователя и пароль в URL.Вы должны отправить его в теле запроса.

Простой способ сделать это - кодировать Base64 на внешнем интерфейсе в javascript и декодировать на внутреннем интерфейсе в java.

FrontEnd : весь хромверсия, 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");

Для

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: commons-codec, commons-codec, 1.8.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...