在rest webservice中发送url作为查询参数



我已经编写了一个rest服务来加密和解密URL。

加密代码:

@GET
@Produces("application/json")
@Path("/encrypt/")
public Response encryptWithQuery(@QueryParam("plainString") String plainString)
        throws JSONException {
    Response response = new Response();
    AesUtil util = new AesUtil(KEY_SIZE, ITERATION_COUNT);
    response = util.encrypt(SALT, IV, PASSPHRASE, plainString);
    return response;
}

解密代码:

@GET
@Produces("application/json")
@Path("/decryptWP/")
public Response decryptWithQuery(@QueryParam("encryptString") String encryptString)
        throws JSONException {
    Response response = new Response();
    AesUtil util = new AesUtil(KEY_SIZE, ITERATION_COUNT);
    response = util.decrypt(SALT, IV, PASSPHRASE, encryptString);
    return response;
}

当我调用我的加密rest服务时,我得到加密字符串

url用于加密

http://localhost:9080/kttafm/keybank/encrypt?plainString=http://localhost:9080/kttafm/master.jsp?abc=zyx

但是当我调用解密rest服务时,我得到下面的异常

javax.crypto.BadPaddingException: Given final block not properly padded

但是如果我从@Queryparam移动到@path param,解密工作正常,

可以正常工作并解密加密字符串的方法是

 @GET
@Produces("application/json")
@Path("/decrypt/{encryptString}")
public Response decrypt(@PathParam("encryptString") String encryptString)
        throws JSONException {
    Response response = new Response();
    AesUtil util = new AesUtil(KEY_SIZE, ITERATION_COUNT);
    response = util.decrypt(SALT, IV, PASSPHRASE, encryptString);
    return response;
} 

我错过了什么?

请确保始终在客户端对参数进行编码,例如使用URLEncoder。

例如,您的加密URL必须是

http://localhost:9080/kttafm/keybank/encrypt?plainString=http%3A%2F%2Flocalhost%3A9080%2Fkttafm%2Fmaster.jsp%3Fabc%3Dzyx

给定加密字符串示例:"fbSjGsyDYfmJM4rAURhgdpX+XKQr8WTfiZC7PaBqK7KzfUEYau1cpXnhECqRT47n",我可以看到有一个"+"字符是URL解码的候选字符。您可以使用这个URL解码网站http://meyerweb.com/eric/tools/dencoder/来查看当您解码字符串时+号被转换。

这将导致解密错误,因为您的算法将不完全符合预期。

您可以通过在您的解密方法中添加一些调试消息来确保这一点,如下例所示:

@GET
@Produces("application/json")
@Path("/decrypt/{encryptString}")
public Response decrypt(@PathParam("encryptString") String encryptString)
        throws JSONException {
    System.out.println(encryptString);
    Response response = new Response();
    ...
} 
一个解决方案是在调用服务之前在客户端执行URL编码。在这种情况下,您的示例看起来像:"fbSjGsyDYfmJM4rAURhgdpX%2BXKQr8WTfiZC7PaBqK7KzfUEYau1cpXnhECqRT47n"

注意加号的转换

最新更新