С точки зрения безопасности я пытаюсь расширить связь между моим клиентом и моим API с помощью сеанса.Клиент отправляет свой заголовок в API, и API создает сеанс.
Клиент:
public static JSONObject send(String info)
{
StringBuffer resp = new StringBuffer();
try
{
URL url = new URL( "http://localhost:8080/myapi/" );
HttpURLConnection con = ( HttpURLConnection ) url.openConnection() );
con.setRequestMethod("POST");
con.setRequestProperty( "USER-AGENT", USER_AGENT );
con.setRequestProperty( "Accept-Charset", "UTF-8");
con.setRequestProperty( "Content-Type", "application/json" );
con.setDoOutput( true );
String data = info ;
DataOutputStream output = new DataOutputStream( con.getOutputStream);
output.writeBytes( data );
output.flush();
output.close();
int returnCode = con.getResponseCode();
BufferedReader reader = null;
if (returnCode==200)
{
reader = new BufferedReader( new InputStreamReader(con.getInputStream()));
}
else
{
reader = new BufferedReader( new InputStreamReader(con.getErrorStream()));
}
String input;
while( ( input = reader.readLine() ) != null )
{
resp.append( input );
}
reader.close();
return new JSONObject( resp.toString() );
}
catch( Exception e )
{
System.out.println( e.getMessage() );
return new JSONObject( resp.toString() );
}
finally
{
if( con != null )
{
con.disconnect();
}
}
}
API:
HttpServletRequest request = requestGlobals.getHttpServletRequest();
HttpSession session = request.getSession();
Идея: первый запрос с send
создает соединение с API, а API генерирует сеанс, который хранится в нем.Второй send
от того же клиента должен отправить тот же заголовок, чтобы API мог сгенерировать тот же сеанс и сравнить его с сохраненным.Например, я могу гарантировать дальнейшие вызовы только после успешного входа в систему
Проблема: если соединение восстанавливается на втором send
, тот же клиент отправляет другой заголовок с другой длиной содержимого, в результате чегогенерируется другой сеанс.Я попытался установить if( con == null )
вокруг области, где соединение создается на клиенте, но это не решило мою проблему.
Вопрос: Что мне нужно сделать, чтобы второй send
использовал уже существующее соединение или отправил тот же заголовок?