Искатель Java — сканирование квадратной образовательной системы на основе httpclient

Java

PS: Что ж, поскольку я недавно изучаю веб-протокол и простой http-протокол, я хочу написать сканер на java для сканирования основной информации (информация о курсе, оценки ...) личной домашней страницы официального веб-сайта школы (Zhengfang Educational Система дел) по прихоти.На самом деле я ее выучил раньше.Вы можете написать ее,когда прошли базовый туториал по java,но вы всегда выполняете задачи,которые должны быть выполнены на предыдущем этапе на текущем этапе! Может быть, это новичок ~ ~ ~.

 

Написано впереди: На самом деле при написании сканеров Java обычно используются три метода: класс встроенной библиотеки (urlconnection), внешняя библиотека (httpclient) и библиотека разбора документов (jsoup); среди них jsoup, третий -party, в основном используется для html-документов.Синтаксический анализ, в официальном документе нет никакого дополнительного метода, кроме метода Jsoup.connect() для доступа к веб-странице, и большинство из первых двух методов используются в сканере веб-сайта ( доступ к методу get и post), которому необходимо войти в систему, чтобы получить доступ к веб-странице. А поскольку httpclient является более гибким и эффективным, чем встроенная библиотека, сканер использует httpclient для доступа + Jsoup для совместного анализа документа.

 

Примечание: как новичок, у меня есть более или менее проблемы при попытке попробовать каждый проект, который реализовали другие, но я еще не реализовал, и этот проект краулера для меня то же самое, поэтому я написал эту статью. pit, сообщение в блоге также удобно для других новичков, чтобы выполнить его гладко. Если вы читаете новичок и хотите использовать java для написания сканера, который сканирует официальный сайт школы (не распыляйте, пожалуйста, обойдите ~~~), то вам очень повезло, если вы будете следовать содержанию следующего статью шаг за шагом, тогда вы обязательно получите желаемый результат. (Конечно, в проекте, который я опишу далее, он реализуется системой академических дел Zhengfang. Если официальный сайт вашей школы отличается от этого, на самом деле освоение базовой технологии аналогично.)

 

  • Предварительная подготовка:
    • Среда проекта: браузер Firefox, eclipseIDE
    • Требуемый пакет jar внешней библиотеки:
    • commons-codec-1.3.jar
    • commons-httpclient-3.1.jar
    • commons-logging-1.0.4.jar
    • jsouop-1.8.1.jar

Примечание. Эти пакеты jar необходимы, и некоторые люди могут задаться вопросом: это не просто пакет httpclient, зачем вам нужны два других пакета. На самом деле вам нужно только знать, что версии этих трех пакетов очень старые, Apache больше не поддерживается и не обновляется, и эти три пакета взаимозависимы и незаменимы. (Поскольку я скачал версию 3.1 в начале, менять на 4.Х не хочу, т.к. использование некоторых методов и функций в ней другое. Если скачаю, то уже расшарил в csdn, а вы можно скачать:скачать пакет httpclient-jar), если вы импортируете его в eclipse, вам не нужно вдаваться в подробности, результат будет таким, как показано ниже.

 

  • Разрушение земли:

[Примечание] Нет необходимости описывать, что такое краулер, очень просто просканировать веб-страницу без разрешения через URL-адрес, и это можно сделать непосредственно с помощью Jsoup. Но когда мы сканируем некоторые веб-сайты, на которых необходимо войти в систему, если мы по-прежнему посещаем URL-адрес напрямую, мы снова вернемся на домашнюю страницу входа, поэтому нам нужно выполнить имитацию входа.Что касается имитации входа, это заключается в том, чтобы опубликовать код проверки пароля учетной записи на сервере веб-сайта, запомнив его файл cookie для доступа к другим страницам после входа в систему (на самом деле, это предварительное знание, причина, по которой я хочу упомянуть об этом, заключается в том, что я также был сбит с толку в начало).

  • Сначала проанализируйте смоделированный процесс входа в систему, сначала откройте браузер Firefox и откройте интерфейс входа в систему школьного образования. Затем нажмите F12, чтобы открыть интерфейс перехвата пакетов, и войдите в систему как обычно. (~~ Случайно разоблачил школу...)
  • После успешного входа в систему, затем проанализируйте статус http процесса входа в систему, вы обнаружите, что есть метод POST с кодом состояния 302 и метод GET с кодом состояния 200, а затем откройте два отправленных данных, вы можете см. следующий рисунок.

 

Красное поле — это адрес интерфейса данных запроса.

  • Затем проанализируйте отправленные данные, и вы обнаружите, что в анализе захвата пакетов есть много параметров.На самом деле, в процессе входа в систему браузер автоматически использует пароль учетной записи и код подтверждения, которые вы вводили вручную, а также автоматически сгенерированные. в качестве единственной аутентификации.Файл cookie отправляется на сервер веб-сайта в качестве параметра для аутентификации и входа в систему. (Что касается разницы между cookie и сеансом, а также разницы между POST и GET, будет объяснено ниже) Параметры следующие:

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

  • Идентификатор учащегося: txtUserName
  • Пароль: TextBox2
  • Код подтверждения: txtSecretCode.
  • _VIEWSTATE, этот параметр фактически одинаков для официального сайта той же школы, а где этот параметр, так это в html исходниках страницы входа:
  • Ну параметры которые нужно вводить разобрались, тогда имитацию входа можно реализовать, но теперь возникает проблема, то есть при входе на страницу нужно вводить проверочный код.Где взять верификацию код? Как показано ниже:

 


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

[Высокая энергия: что касается автоматического распознавания кодов подтверждения, я подробно объясню в следующем сообщении в блоге]

  • После успешного входа в систему вы можете использовать файл cookie для посещения страницы, которую хотите посетить.

 

  • Общий фреймворк в целом знаком, а дальше переходим непосредственно к исходному коду:
[java] view plain copy print?
  1.   
[java] view plain copy print?
  1. package com.yxs.Link;  
  2. import org.apache.commons.httpclient.*;  
  3. import org.apache.commons.httpclient.methods.*;  
  4. import org.apache.commons.httpclient.cookie.*;  
  5. import java.util.*;  
  6. import org.jsoup.*;  
  7. import org.jsoup.nodes.*;  
  8. import org.jsoup.select.*;  
  9. import java.io.*;  
  10. /** 
  11.  *<p>Tile:LoginTest.java<p> 
  12. *

    Описание: Получите файл cookie и проверочный код для имитации входа в систему администрирования образования

  13.  * @author YXS<p> 
  14. * @данные 3 июня 2018 г.
  15.  */  
  16. public class LoginTMSystem {  
  17.   
  18.     public static String getHTML() {  
  19.         String cookie1 = "";  
  20.         String html = "null";  
  21.         String txtSecretCode = "";  
  22. System.out.println("Пожалуйста, введите номер студента:");
  23.         String txtUserName = new Scanner(System.in).next().trim();  
  24. System.out.println("Пожалуйста, введите ваш пароль:");
  25.         String TextBox2 = new Scanner(System.in).next().trim();  
  26.         String RadioButtonList1 = "";  
  27.         String __VIEWSTATE = "";  
  28.           
  29. //адрес входа
  30.         String loginURL = "http://jwxt.hfnu.edu.cn/(arezfqaeu12awkft0yuoe1qg)/default2.aspx";  
  31. //URL домашней страницы системы управления образованием
  32.         String indexURL = "http://jwxt.hfnu.edu.cn/(arezfqaeu12awkft0yuoe1qg)/xs_main.aspx";  
  33. // URL-адрес расписания курса, доступный после входа в систему
  34.         String dataURL = "http://jwxt.hfnu.edu.cn/(arezfqaeu12awkft0yuoe1qg)/xskbcx.aspx";  
  35. //URL для скачивания кода подтверждения
  36.         String checkCodeURL = "http://jwxt.hfnu.edu.cn/(arezfqaeu12awkft0yuoe1qg)/CheckCode.aspx";  
  37. //Создаем объект браузера
  38.         HttpClient httpClient = new HttpClient();  
  39.                   
  40. //Сначала перейдите на страницу кода подтверждения, чтобы получить код подтверждения
  41.         GetMethod getMethod1 = new GetMethod(checkCodeURL);  
  42.         try {  
  43. //Установим HttpClient для получения файлов cookie
  44.             httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);  
  45.             httpClient.executeMethod(getMethod1);  
  46. //Получить куки после посещения
  47.             Cookie[] cookies1 = httpClient.getState().getCookies();  
  48.             StringBuffer tmpcookies1 = new StringBuffer();  
  49.             for(Cookie c1 : cookies1) {  
  50.                 tmpcookies1.append(c1.toString()+";");  
  51. System.out.println("Доступ к файлам cookie страницы: "+c1.toString());
  52.                 cookie1 = tmpcookies1.toString();  
  53.                 //cookie1 = c1.toString();  
  54.             }  
  55.               
  56. //Путь для сохранения кода подтверждения
  57. File storeFile = new File("D:\\java jar package\\verifycode\\vc.gif");
  58.             InputStream is = getMethod1.getResponseBodyAsStream();  
  59.             FileOutputStream fos = new FileOutputStream(storeFile);  
  60.             byte[] b = new  byte[1024];  
  61.             int n;  
  62.             while((n = is.read(b)) != -1) {  
  63.                 fos.write(b,0,n);  
  64.             }  
  65.             is.close();  
  66.             fos.close();  
  67.               
  68. //Код здесь используется для автоматической идентификации проверочного кода
  69. txtSecretCode = ImagePreProcess.getAllOrc("D:\\JAR-пакет сканера Java\\verifycode\\vc.gif");
  70.         }catch(Exception e) {  
  71.             e.printStackTrace();  
  72.         }  
  73. //System.out.println("Пожалуйста, введите код подтверждения:");
  74.         //String txtSecretCode = new Scanner(System.in).next().trim();  
  75.         System.out.println(txtSecretCode);  
  76. System.out.println("Проверка с использованием cookie1:"+cookie1); 
  77.           
  78. //Смоделируйте вход в систему, выберите метод запроса Post или Get в соответствии с фактическими требованиями на стороне сервера
  79.         PostMethod postMethod = new PostMethod(loginURL);  
  80. //Установить тот же файл cookie
  81.         postMethod.setRequestHeader("cookie",cookie1);  
  82. //Установите информацию, имя пользователя и пароль, необходимые для входа в систему
  83.         NameValuePair[] data = {  
  84.                 new NameValuePair("__VIEWSTATE",__VIEWSTATE),  
  85.                 new NameValuePair("Button1", ""),  
  86.                 new NameValuePair("hidPdrs", ""),  
  87.                 new NameValuePair("hidsc", ""),  
  88.                 new NameValuePair("lbLanguage", ""),  
  89.                 new NameValuePair("RadioButtonList1",RadioButtonList1),  
  90.                 new NameValuePair("TextBox2",TextBox2),  
  91.                 new NameValuePair("txtSecretCode",txtSecretCode),  
  92.                 new NameValuePair("txtUserName",txtUserName)  
  93.         };  
  94.         postMethod.setRequestBody(data);  
  95.         try {  
  96.             int statusCode = httpClient.executeMethod(postMethod);  
  97.             //html = postMethod.getResponseBodyAsString();  
  98.             System.out.println(statusCode);  
  99.               
  100. // перенаправить
  101.             if(statusCode == 302) {   
  102. System.out.println("Успешное моделирование входа в систему!");
  103.                   
  104. //Установите HttpClient для получения файлов cookie, используйте ту же стратегию, что и браузер
  105.                 httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);  
  106. //Получить куки после авторизации
  107.                 Cookie[] cookies = httpClient.getState().getCookies();  
  108.                 StringBuffer tmpcookies = new StringBuffer();  
  109.                 for(Cookie c : cookies) {  
  110.                     tmpcookies.append(c.toString()+";");  
  111. System.out.println("Файлы cookie страницы входа: "+c.toString());
  112.                 }  
  113.                 //System.out.println("-------------------------------InformationFrame------------------------------");  
  114.                   
  115. //Операция после входа
  116.                   
  117. //Посетить главную страницу
  118.                 GetMethod getMethod2 = new GetMethod(indexURL+ "?xh="+txtUserName);  
  119. // Приносить предыдущий файл cookie в качестве пропуска каждый раз, когда вы посещаете веб-сайт, требующий авторизации
  120.                 getMethod2.setRequestHeader("cookie",tmpcookies.toString());  
  121.                 httpClient.executeMethod(getMethod2);  
  122.                   
  123. //Посетить страницу расписания занятий
  124.                 GetMethod getMethod3 = new GetMethod(dataURL+ "?xh="+txtUserName+"&xm=&gnmkdm=");  
  125. // Приносить предыдущий файл cookie в качестве пропуска каждый раз, когда вы посещаете веб-сайт, требующий авторизации
  126.                 getMethod3.setRequestHeader("referer",indexURL+ "?xh="+txtUserName);  
  127.                 getMethod3.setRequestHeader("cookie",tmpcookies.toString());  
  128.                 httpClient.executeMethod(getMethod3);  
  129.                 html = getMethod3.getResponseBodyAsString();  
  130.                   
  131. /*//Посетить главную страницу
  132.                 GetMethod getMethod = new GetMethod(indexURL+"?xh="+txtUserName); 
  133. // Приносить предыдущий файл cookie в качестве пропуска каждый раз, когда вы посещаете веб-сайт, требующий авторизации
  134.                 getMethod.setRequestHeader("cookie",tmpcookies.toString()); 
  135.                 httpClient.executeMethod(getMethod); 
  136.                 html = getMethod.getResponseBodyAsString();*/  
  137.             }else {  
  138. System.out.println("Ошибка входа");
  139.             }  
  140.         }catch(Exception e) {  
  141.             e.printStackTrace();  
  142.         }  
  143.         return html;  
  144.     }  
  145.     public static void main(String[] args) {  
  146.         Document doc = Jsoup.parse(LoginTMSystem.getHTML());  
  147.         //System.out.println(doc);  
  148.         /*Element link1 = doc.select("span#Label3").first(); 
  149.         String text1 = link1.text(); 
  150.         Element link2 = doc.select("span#xhxm").first(); 
  151.         String text2 = link2.text(); 
  152.         System.out.println(text1+text2);*/  
  153.         Elements link1 = doc.select("span#Label5");  
  154.         Elements link2 = doc.select("span#Label6");  
  155.         Elements link3 = doc.select("span#Label7");  
  156.         Elements link4 = doc.select("span#Label8");  
  157.         Elements link5 = doc.select("span#Label9");  
  158.         String text1 = link1.text();  
  159.         String text2 = link2.text();  
  160.         String text3 = link3.text();  
  161.         String text4 = link4.text();  
  162.         String text5 = link5.text();  
  163. System.out.println("-------------------------------Личная информация---------- --------------------"); 
  164.         System.out.println(text1);  
  165.         System.out.println(text2);  
  166.         System.out.println(text3);  
  167.         System.out.println(text4);  
  168.         System.out.println(text5);  
  169. System.out.println("-------------------------------Информация о курсе---------- --------------------"); 
  170.         Elements tds1 = doc.select("td[rowspan=2]");  
  171.         for(int i=0;i<tds1.size();i++) {  
  172.             String td = tds1.get(i).text().replace(Jsoup.parse(" ").text(),  " ");  
  173.             System.out.println(td);  
  174.         }  
  175.         Elements tds2 = doc.select("td[rowspan=3]");  
  176.         for(int i=0;i<tds2.size();i++) {  
  177.             String td = tds2.get(i).text().replace(Jsoup.parse(" ").text(),  " ");  
  178.             System.out.println(td);  
  179.         }  
  180.         System.exit(0);  
  181.     }  
	package com.yxs.Link;
	import org.apache.commons.httpclient.*;
	import org.apache.commons.httpclient.methods.*;
	import org.apache.commons.httpclient.cookie.*;
	import java.util.*;
	import org.jsoup.*;
	import org.jsoup.nodes.*;
	import org.jsoup.select.*;
	import java.io.*;
	/**
	 *<p>Tile:LoginTest.java<p>
	 *<p>Description:获取cookie和验证码模拟登录教务系统<p>
	 * @author YXS<p>
	 * @data2018年6月3日
	 */
	public class LoginTMSystem {
	
		public static String getHTML() {
			String cookie1 = "";
			String html = "null";
			String txtSecretCode = "";
			System.out.println("请输入学号:");
			String txtUserName = new Scanner(System.in).next().trim();
			System.out.println("请输入密码:");
			String TextBox2 = new Scanner(System.in).next().trim();
			String RadioButtonList1 = "";
			String __VIEWSTATE = "";
			
			//登录url
			String loginURL = "http://jwxt.hfnu.edu.cn/(arezfqaeu12awkft0yuoe1qg)/default2.aspx";
			//教务管理系统首页url
			String indexURL = "http://jwxt.hfnu.edu.cn/(arezfqaeu12awkft0yuoe1qg)/xs_main.aspx";
			//登录后访问的课程表url
			String dataURL = "http://jwxt.hfnu.edu.cn/(arezfqaeu12awkft0yuoe1qg)/xskbcx.aspx";
			//验证码下载网址
			String checkCodeURL = "http://jwxt.hfnu.edu.cn/(arezfqaeu12awkft0yuoe1qg)/CheckCode.aspx";
			//创建浏览器对象
			HttpClient httpClient = new HttpClient();
					
			//先访问验证码页面,获取验证码
			GetMethod getMethod1 = new GetMethod(checkCodeURL);
			try {
				//设置HttpClient接收Cookie
				httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
				httpClient.executeMethod(getMethod1);
				//获取访问后的Cookie
				Cookie[] cookies1 = httpClient.getState().getCookies();
				StringBuffer tmpcookies1 = new StringBuffer();
				for(Cookie c1 : cookies1) {
					tmpcookies1.append(c1.toString()+";");
					System.out.println("访问页面cookies : "+c1.toString());
					cookie1 = tmpcookies1.toString();
					//cookie1 = c1.toString();
				}
				
				//验证码保存路径
				File storeFile = new File("D:\\java爬虫jar包\\verifycode\\vc.gif");
				InputStream is = getMethod1.getResponseBodyAsStream();
				FileOutputStream fos = new FileOutputStream(storeFile);
				byte[] b = new byte[1024];
				int n;
				while((n = is.read(b)) != -1) {
					fos.write(b,0,n);
				}
				is.close();
				fos.close();
				
				//该处代码是用于验证码自动识别
				txtSecretCode = ImagePreProcess.getAllOrc("D:\\java爬虫jar包\\verifycode\\vc.gif");
			}catch(Exception e) {
				e.printStackTrace();
			}
			//System.out.println("请输入验证码:");
			//String txtSecretCode = new Scanner(System.in).next().trim();
			System.out.println(txtSecretCode);
			System.out.println("测试使用cookie1:"+cookie1);
			
			//模拟登录,按实际服务器端要求选用Post 或 Get请求方式
			PostMethod postMethod = new PostMethod(loginURL);
			//设置相同的cookie
			postMethod.setRequestHeader("cookie",cookie1);
			//设置登录时需要的信息,用户名和密码
			NameValuePair[] data = {
					new NameValuePair("__VIEWSTATE",__VIEWSTATE),
					new NameValuePair("Button1",""),
					new NameValuePair("hidPdrs",""),
					new NameValuePair("hidsc",""),
					new NameValuePair("lbLanguage",""),
					new NameValuePair("RadioButtonList1",RadioButtonList1),
					new NameValuePair("TextBox2",TextBox2),
					new NameValuePair("txtSecretCode",txtSecretCode),
					new NameValuePair("txtUserName",txtUserName)
			};
			postMethod.setRequestBody(data);
			try {
				int statusCode = httpClient.executeMethod(postMethod);
				//html = postMethod.getResponseBodyAsString();
				System.out.println(statusCode);
				
				//重定向
				if(statusCode == 302) { 
					System.out.println("模拟登录成功!");
					
					//设置HttpClient接收Cookie,用与浏览器一样的策略
					httpClient.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
					//获取登录后的Cookie
					Cookie[] cookies = httpClient.getState().getCookies();
					StringBuffer tmpcookies = new StringBuffer();
					for(Cookie c : cookies) {
						tmpcookies.append(c.toString()+";");
						System.out.println("登录页面cookies : "+c.toString());
					}
					//System.out.println("-------------------------------InformationFrame------------------------------");
					
					//进行登录后的操作
					
					//访问主页面
					GetMethod getMethod2 = new GetMethod(indexURL+"?xh="+txtUserName);
					//每次访问需授权的网址时带上前面的cookie作为通行证
					getMethod2.setRequestHeader("cookie",tmpcookies.toString());
					httpClient.executeMethod(getMethod2);
					
					//访问课程表页面
					GetMethod getMethod3 = new GetMethod(dataURL+"?xh="+txtUserName+"&xm=&gnmkdm=");
					//每次访问需授权的网址时带上前面的cookie作为通行证
					getMethod3.setRequestHeader("referer",indexURL+"?xh="+txtUserName);
					getMethod3.setRequestHeader("cookie",tmpcookies.toString());
					httpClient.executeMethod(getMethod3);
					html = getMethod3.getResponseBodyAsString();
					
					/*//访问主页面
					GetMethod getMethod = new GetMethod(indexURL+"?xh="+txtUserName);
					//每次访问需授权的网址时带上前面的cookie作为通行证
					getMethod.setRequestHeader("cookie",tmpcookies.toString());
					httpClient.executeMethod(getMethod);
					html = getMethod.getResponseBodyAsString();*/
				}else {
					System.out.println("登录失败");
				}
			}catch(Exception e) {
				e.printStackTrace();
			}
			return html;
		}
		public static void main(String[] args) {
			Document doc = Jsoup.parse(LoginTMSystem.getHTML());
			//System.out.println(doc);
			/*Element link1 = doc.select("span#Label3").first();
			String text1 = link1.text();
			Element link2 = doc.select("span#xhxm").first();
			String text2 = link2.text();
			System.out.println(text1+text2);*/
			Elements link1 = doc.select("span#Label5");
			Elements link2 = doc.select("span#Label6");
			Elements link3 = doc.select("span#Label7");
			Elements link4 = doc.select("span#Label8");
			Elements link5 = doc.select("span#Label9");
			String text1 = link1.text();
			String text2 = link2.text();
			String text3 = link3.text();
			String text4 = link4.text();
			String text5 = link5.text();
			System.out.println("-------------------------------个人信息------------------------------");
			System.out.println(text1);
			System.out.println(text2);
			System.out.println(text3);
			System.out.println(text4);
			System.out.println(text5);
			System.out.println("-------------------------------课程信息------------------------------");
			Elements tds1 = doc.select("td[rowspan=2]");
			for(int i=0;i<tds1.size();i++) {
				String td = tds1.get(i).text().replace(Jsoup.parse(" ").text(), " ");
				System.out.println(td);
			}
			Elements tds2 = doc.select("td[rowspan=3]");
			for(int i=0;i<tds2.size();i++) {
				String td = tds2.get(i).text().replace(Jsoup.parse(" ").text(), " ");
				System.out.println(td);
			}
			System.exit(0);
		}
	
}

 

  • Результаты показывают, что

 

  • Если вы понимаете исходный код, вы можете интерпретировать его самостоятельно. Если вы понимаете основной метод, легко понять смысл кода, и к нему добавлено много комментариев. Если вы все еще не понимаете, вы можете задавайте вопросы в комментариях или пишите мне qq1420755674 общайтесь.

 

  • [Примечание 1] Затянувшаяся печаль файлов cookie и сессий

Когда вы просматриваете веб-сайт, веб-сервер сначала отправит некоторые данные на ваш компьютер, а файл cookie поможет вам записать текст или некоторые варианты выбора, которые вы делаете на веб-сайте. Когда вы в следующий раз зайдете на тот же веб-сайт, веб-сервер сначала проверит, осталась ли какая-либо информация о файлах cookie, оставленная им в прошлый раз. тебе. Использование файлов cookie очень распространено. Многие веб-сайты, предоставляющие персонализированные услуги, используют файлы cookie для идентификации пользователей, чтобы облегчить доставку персонализированного контента. Например, бесплатные веб-сайты электронной почты с веб-интерфейсами должны их использовать. Печенье.

 

В частности, механизм cookie принимает схему поддержания состояния на стороне клиента, а механизм сеанса использует схему поддержания состояния на стороне сервера.

В то же время мы также видим, что, поскольку схема сохранения состояния на стороне сервера также должна сохранять удостоверение на стороне клиента, механизму сеанса может потребоваться полагаться на механизм cookie для достижения цели сохранения удостоверения, но на самом деле у него есть другие варианты.

механизм cookie. Распространение православных cookie-файлов осуществляется путем расширения протокола HTTP: сервер предлагает браузеру сгенерировать соответствующий cookie-файл в соответствии с инструкцией, добавляя строку специальных инструкций в заголовок HTTP-ответа. Однако чистые клиентские сценарии, такие как JavaScript или VBScript, также могут создавать файлы cookie. Использование файлов cookie автоматически отправляется браузером на сервер в фоновом режиме в соответствии с определенными принципами. Браузер проверяет все сохраненные файлы cookie.Если область, объявленная файлом cookie, больше или равна местоположению запрашиваемого ресурса, файл cookie прикрепляется к заголовку HTTP-запроса запрашиваемого ресурса и отправляется на сервер.

 

Содержимое файла cookie в основном включает: имя, значение, срок действия, путь и домен. Путь вместе с доменом составляет область действия файла cookie. Если время истечения срока действия не установлено, это означает, что время жизни файла cookie истекает во время сеанса браузера.Когда окно браузера закрывается, файл cookie исчезает. Такие файлы cookie, которые сохраняются в течение сеанса браузера, называются файлами cookie сеанса. Сеансовые файлы cookie, как правило, хранятся не на жестком диске, а в памяти, хотя такое поведение не предусмотрено нормой. Если установлен срок действия, браузер сохранит файл cookie на жестком диске. После закрытия и повторного открытия браузера эти файлы cookie остаются действительными до тех пор, пока не будет превышено установленное время истечения срока действия. Файлы cookie, хранящиеся на жестком диске, могут совместно использоваться различными процессами браузера, например двумя окнами IE. Для файлов cookie, хранящихся в памяти, разные браузеры имеют разные методы обработки.

 

сеансовый механизм. Механизм сеанса — это серверный механизм, сервер использует структуру, аналогичную хеш-таблице (или, возможно, хеш-таблице) для хранения информации. Когда программе необходимо создать сеанс для запроса клиента, сервер сначала проверяет, содержит ли запрос клиента уже идентификатор сеанса (называемый sessionid), и извлекает сеанс для использования в соответствии с идентификатором сеанса (если он не может быть получен, он создаст новый). Если клиентский запрос не содержит идентификатора сеанса, он создаст сеанс для клиента и сгенерирует сеанс, связанный с этим сеансом. Значение идентификатора и идентификатора сеанса должно быть строкой, которую нельзя повторять и которую нельзя легко найти для имитации. Этот идентификатор сеанса будет возвращен клиенту в этом ответе для хранения. Способ сохранения этого sessionid может использовать cookie, чтобы браузер мог автоматически отправлять этот ID на сервер по правилам в процессе взаимодействия. Как правило, имя этого файла cookie похоже на SEEESIONID. Но файлы cookie можно отключить искусственно, поэтому должен быть какой-то другой механизм для передачи идентификатора сеанса обратно на сервер, когда файлы cookie отключены.

Часто используемый метод называется перезаписью URL-адреса, который заключается в добавлении идентификатора сеанса непосредственно к пути URL-адреса. Существует также метод, называемый скрытыми полями формы. То есть сервер автоматически изменит форму, чтобы добавить скрытое поле, чтобы идентификатор сеанса можно было передать обратно на сервер при отправке формы. Например:

<form name="testform"action="/xxx">

<input type="hidden"name="jsessionid"value="ByOK3vjFD75aPnrF7C2HmdnV6QZcEbzWoWiBYEnLerjQ99zWpBng!-145788764">

<input type="text">

</form>

На самом деле этот метод можно просто заменить, применив перезапись URL к действию.

Разница между файлами cookie и сессиями:

1. Данные cookie хранятся в браузере клиента, а данные сеанса — на сервере.

2. Файлы cookie не очень безопасны. Другие могут анализировать файлы cookie, хранящиеся локально, и выполнять операции с файлами cookie. Учитывая безопасность, следует использовать сеанс.

3. Сессия будет сохранена на сервере в течение определенного периода времени. Когда количество посещений увеличится, это поднимет производительность вашего сервера.Чтобы снизить производительность сервера, вы должны использовать файлы cookie.

4. Данные, сохраняемые одним файлом cookie, не могут превышать 4 КБ. Многие браузеры ограничивают сайт сохранением не более 20 файлов cookie.

  • 【Примечание 2】Shuanghu Shuangfei из POST и GET
  • С точки зрения безопасности, get
  • Судя по размеру отправляемого контента, get
  • С точки зрения скорости ответа на запрос get>post, get требует, чтобы сервер немедленно обрабатывал запрос, а post-запрос может формировать очередь запросов.

 

  • Помните три или две ямы

【Яма 1】

  • На ранней стадии это было застойно в течение двух дней. Речь шла о том, был ли код подтверждения интерфейса входа таким же, как код подтверждения, который вы получили, посетив страницу с кодом подтверждения. Я не понял, как сохранить то же самое. идея или многие учебники не фокусируются на этом моменте, так что это немного глупо для меня. На картинке ниже показаны некоторые из дискуссий, которые были найдены в то время. Позже, только под руководством старших, он стал считаться дайго.
  • Позвольте мне кратко рассказать о том, что я думал в то время: поскольку мне нужно проверить пароль учетной записи и отправить его, когда я отправляю параметры, я отправляю на логинURL в это время, но предпосылкой наличия кода подтверждения является загрузка подтверждения код GET под checkCodeURL, но как я могу убедиться, что коды подтверждения двух одинаковые коды подтверждения?
  • Итак, я хочу сначала получить код подтверждения с помощью GETcheckCodeURL и одновременно получить файл cookie веб-страницы, а затем использовать тот же файл cookie в качестве параметра для POST на loginURL, что означает, что сервер знает, что я я обращаюсь к одному и тому же пользователю дважды, чтобы обеспечить две проверки Код остается тем же, но результат, конечно, не улучшается! ! ! ! ! Так в чем проблема?
  • Просмотрев такое количество изображений, вы должны обнаружить, что каждый URL-адрес отличается от обычного URL-адреса. Как показано на рисунке ниже, в URL-адресе есть длинная строка кодов символов. [Ключевые моменты] На самом деле это уникальный идентификационный код для каждой веб-страницы. То есть сервер будет генерировать идентификационный код при доступе к веб-странице в разное время. Только когда идентификационный код непротиворечив, сервер определит, что два проверочных кода согласованы.

 

【Яма 2】

  • Фактически, после решения Ямы 1 вы обнаружите, что можете успешно войти в систему, но когда вы захотите опубликовать страницу учебного плана, вы получите сообщение об ошибке! ВТФ?!
  • В настоящее время также необходимо отправить три параметра, которые аналогичны предыдущим, но ключевой момент: обязательно добавьте это предложение, чтобы сообщить веб-странице POST, откуда вы пришли.