Войти в веб-портал через Java
Мой сценарий: я работаю с корпоративным порталом, который является закрытым для меня, приложение предоставляет некоторые отчеты, мне нужно показывать отчеты на телевизоре, поэтому мне нужно, чтобы на телевизоре был встроенный веб-браузер для показа HTML. Пока здесь нет проблем, но на портале есть страница входа для предотвращения анонимного доступа, у меня есть учетные данные, но телевизор будет показывать отчеты в произвольном порядке, поэтому мне нужен механизм для входа в приложение и последующей загрузки образца отчета. и передать его в браузер телевизора.
Что я сделал: я создал веб-страницу, которая получает URL-адрес отчета, затем регистрируется на портале, после чего читает файлы cookie, а затем открывает соединение с отчетами (через его URL-адрес), чтобы загрузить его содержимое и вернуться обратно. содержимое в браузер (ТВ браузер).
Мой код
@WebServlet("/LoadReport")
public class LoadReport extends HttpServlet {
private static final long serialVersionUID = 1L;
public LoadReport() {
// TODO Auto-generated constructor stub
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession(true);
session.setMaxInactiveInterval(5);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
if (request.getQueryString() != null && request.getQueryString() != "") {
String tmp = request.getQueryString();
tmp = tmp.substring(tmp.indexOf('=') + 1);
sb.append(tmp);
String postParams = "j_username=djboobo&j_password=djboobo&persistent=on";
URL url = new URL("http://xyz/xyz/login/auth.jsp");
HttpURLConnection connection = (HttpURLConnection) getConnection(postParams, url);
// get sessionid from cookies
String cookies = getCookies(connection, postParams);
cookies += "logindetails=username:djboobo&persistent:yes";
// url to report
url = new URL(tmp);
connection = (HttpURLConnection) getConnection(postParams, url);
connection.setRequestProperty("Cookie", cookies);
DataOutputStream wr = new DataOutputStream(connection.getOutputStream());
wr.writeBytes(postParams);
wr.flush();
try {
BufferedReader br = new BufferedReader(new InputStreamReader(connection.getInputStream()));
while ((line = br.readLine()) != null) {
out.write(line);
}
} catch (Exception e) {
}
wr.close();
connection.disconnect();
}
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException,
IOException {
// TODO Auto-generated method stub
}
private HttpURLConnection getConnection(String postParams, URL url) throws IOException, ProtocolException {
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setDoOutput(true);
connection.setDoInput(true);
connection.setUseCaches(false);
connection.setRequestProperty("Host", "http://xyz/xyz");
connection.setRequestProperty("Accept",
"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8");
connection.setRequestProperty("Accept-Encoding", "gzip, deflate");
connection.setRequestProperty("Accept-Language", "en-US,en;q=0.8,fa;q=0.6");
connection.setRequestProperty("Cache-Control", "max-age=0");
connection.setRequestProperty("Connection", "keep-alive");
connection.setRequestProperty("Content-Length", String.valueOf(postParams.getBytes().length));
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setInstanceFollowRedirects(false);
connection.setRequestMethod("POST");
connection.setRequestProperty("charset", "utf-8");
connection
.setRequestProperty("User-Agent",
"Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.65 Safari/537.36");
return connection;
}
private String getCookies(HttpURLConnection conn, String postParams) throws IOException {
DataOutputStream wr = new DataOutputStream(conn.getOutputStream());
wr.writeBytes(postParams);
wr.flush();
wr.close();
List<String> cookies = conn.getHeaderFields().get("Set-Cookie");
StringBuilder sb = new StringBuilder();
for (String cookie : cookies) {
// System.out.println("Cookies: " + cookie);
if (cookie.contains("JSESSIONID")) {
sb.append(cookie.substring(0, cookie.indexOf(";")));
sb.append("; ");
break;
}
}
return sb.toString();
}
}
В чем заключается основная проблема Я попытался использовать инструмент разработчика Chrome, чтобы выяснить, как работает портал и каковы его файлы cookie запросов и ответов, а затем обнаружил, что если я передам SessionId (один из файлов cookie) на портал, он вернет содержимое отчета, но когда я использую SessionId, который скопировал из инструмента chrome (имеется в виду вход в систему из браузера chrome) загрузку содержимого отчета с портала, но когда я использую SessionId, полученный из программного входа в систему, содержимое отчета не загружается.
Я думаю, что вход в систему на портале происходит от программы, потому что он возвращает SessionId, но после входа в систему он убивает Session, поэтому соединение с отчетом с SessionId не проходит аутентификацию.
в чем дело???