A. java 怎麼實現HTTP的POST方式通訊,以及HTTPS方式傳遞
雖然在 JDK 的 java.net 包中已經提供了訪問 HTTP 協議的基本功能,但是對於大部分應用程序來說,JDK
庫本身提供的功能還不夠豐富和靈活。HttpClient 是 Apache Jakarta Common
下的子項目,用來提供高效的、最新的、功能豐富的支持 HTTP 協議的客戶端編程工具包,並且它支持 HTTP 協議最新的版本和建議。以下是簡單的post例子:
String url = "http://www.newsmth.net/bbslogin2.php";
PostMethod postMethod = new PostMethod(url);
// 填入各個表單域的值
NameValuePair[] data = { new NameValuePair("id", "youUserName"),
new NameValuePair("passwd", "yourPwd") };
// 將表單的值放入postMethod中
postMethod.setRequestBody(data);
// 執行postMethod
int statusCode = httpClient.executeMethod(postMethod);
// HttpClient對於要求接受後繼服務的請求,象POST和PUT等不能自動處理轉發
// 301或者302
if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY ||
statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
// 從頭中取出轉向的地址
Header locationHeader = postMethod.getResponseHeader("location");
String location = null;
if (locationHeader != null) {
location = locationHeader.getValue();
System.out.println("The page was redirected to:" + location);
} else {
System.err.println("Location field value is null.");
}
return;
}
B. java獲取伺服器文件,怎樣用url返回
第一種; response.setStatus(302);
response.setHeader("location", "/dayX/MyHtml.html"); 該方式可以重定向到伺服器指定頁面
當然還有以下方式:
第二種;請求轉發
請求轉發是指將請求再轉發到另一資源(一般為jsP或Servlet)。此過程依然在同一個請求范圍內,轉發後瀏覽器地址欄內容不變
請求轉發使用RequestDispatcher介面中的forward()方法來實現,該方法可以把請求轉發到另外一個資源,並讓該資源對瀏覽器的請求進行響應request.getRequestDispatcher(path) .forward(request,response);
第三種 重定向
重定向是指頁面重新定位到某個新地址,之前的請求失效,進入一個新的請求,且跳轉後瀏覽器地址欄內容將變為新的指定地址
重定向是通過HttpServletResponse對象的sendRedirect()來實現,該方法相當於瀏覽器重新發送一個請求
response.sendRedirect(path);
C. 用java做好的登陸界面,當登陸成功後跳轉到下個頁面的代碼是什麼
用java做好的登陸界面,當登陸成功後跳轉到下個頁面的代碼如下:
如果登陸驗專證是在jsp中,那麼跳轉可以寫成屬
1.response.sendRedirct("跳轉到頁面");
2.<jsp:forward page="跳轉頁面"/>
3.response.setHeader("Location","");
如果是登陸驗證是在servlet中,那麼中轉可以寫成
1.response.sendRedirect("/a.jsp");
2.RequestDispatcher dispatcher = request.getRequestDispatcher("/a.jsp");
dispatcher .forward(request, response);
也可以使用js代碼實現:
<script>
function validate(){
window.location.href="/index.jsp";
}
</script>
D. java網路爬蟲怎麼實現抓取登錄後的頁面
沒做過網路爬蟲,不過順手寫了個自動登錄貓撲打卡的程序你可以參考一下,需要的包是commons-logging.jar,commons-net-1.4.1.jar,commons-codec-1.3.jar,log4j.jar,httpclient-4.3.1.jar ,下面是源代碼,希望可以幫到你~~
package com.ly.mainprocess;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import org.apache.http.Consts;
import org.apache.http.Header;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.cookie.Cookie;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
public class Test1 {
public static void main(String[] args){
Test1 test1 = new Test1();
System.out.println(test1.process("******","******"));
}
@SuppressWarnings("deprecation")
public boolean process(String username,String password) {
boolean ret=false;
DefaultHttpClient httpclient = new DefaultHttpClient();
try {
HttpGet httpget;
HttpResponse response;
HttpEntity entity;
List<Cookie> cookies;
//組建登錄的post包
HttpPost httppost = new HttpPost("http://login.hi.mop.com/Login.do"); // 用戶登錄
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("nickname", username));
nvps.add(new BasicNameValuePair("password", password));
nvps.add(new BasicNameValuePair("origURL", "http://hi.mop.com/SysHome.do"));
nvps.add(new BasicNameValuePair("loginregFrom", "index"));
nvps.add(new BasicNameValuePair("ss", "10101"));
httppost.setEntity(new UrlEncodedFormEntity(nvps, Consts.UTF_8));
httppost.addHeader("Referer", "http://hi.mop.com/SysHome.do");
httppost.addHeader("Connection", "keep-alive");
httppost.addHeader("Content-Type", "application/x-www-form-urlencoded");
httppost.addHeader("Accept-Language", "zh-CN,zh;q=0.8");
httppost.addHeader("Origin", "http://hi.mop.com");
httppost.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/30.0.1599.101 Safari/537.36");
response = httpclient.execute(httppost);
entity = response.getEntity();
// System.out.println("Login form get: " + response.getStatusLine());
EntityUtils.consume(entity);
// System.out.println("Post logon cookies:");
cookies = httpclient.getCookieStore().getCookies();
if (cookies.isEmpty()) {
// System.out.println("None");
} else {
for (int i = 0; i < cookies.size(); i++) {
// System.out.println("- " + cookies.get(i).toString());
}
}
//進行頁面跳轉
String url = ""; // 頁面跳轉
Header locationHeader = response.getFirstHeader("Location");
// System.out.println(locationHeader.getValue());
if (locationHeader != null) {
url = locationHeader.getValue(); // 得到跳轉href
HttpGet httpget1 = new HttpGet(url);
response = httpclient.execute(httpget1);
// 登陸成功。。。hoho
}
entity = response.getEntity();
// System.out.println(response.getStatusLine());
if (entity != null) {
// System.out.println("Response content length: " + entity.getContentLength());
}
// 顯示結果
BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
String line = null;
while ((line = reader.readLine()) != null) {
// System.out.println(line);
}
//自動打卡
// 訪問網站的子網頁。
HttpPost httppost1 = new HttpPost("http://home.hi.mop.com/ajaxGetContinusLoginAward.do"); // 設置個人信息頁面
httppost1.addHeader("Content-Type", "text/plain;charset=UTF-8");
httppost1.addHeader("Accept", "text/plain, */*");
httppost1.addHeader("X-Requested-With", "XMLHttpRequest");
httppost1.addHeader("Referer", "http://home.hi.mop.com/Home.do");
response = httpclient.execute(httppost1);
entity = response.getEntity();
// System.out.println(response.getStatusLine());
if(response.getStatusLine().toString().indexOf("HTTP/1.1 200 OK")>=0){
ret = true;
}
if (entity != null) {
// System.out.println("Response content length: " + entity.getContentLength());
}
// 顯示結果
reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
line = null;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (Exception e) {
} finally {
httpclient.getConnectionManager().shutdown();
}
return ret;
}
}
E. java web怎麼添加response.setheader
response.setHeader()的用法
1. HTTP消息頭
(1)通用信息頭
即能用於請求消息中,也能用於響應信息中,但與被傳輸的實體內容沒有關系的信息頭,如Data,Pragma
主要: Cache-Control , Connection , Data , Pragma , Trailer , Transfer-Encoding , Upgrade
(2)請求頭
用於在請求消息中向伺服器傳遞附加信息,主要包括客戶機可以接受的數據類型,壓縮方法,語言,以及客戶計算機上保留的信息和發出該請求的超鏈接源地址等.
主要: Accept , Accept-Encoding , Accept-Language , Host ,
(3)響應頭
用於在響應消息中向客戶端傳遞附加信息,包括服務程序的名稱,要求客戶端進行認證的方式,請求的資源已移動到新地址等.
主要: Location , Server , WWW-Authenticate(認證頭)
(4)實體頭
用做實體內容的元信息,描述了實體內容的屬性,包括實體信息的類型,長度,壓縮方法,最後一次修改的時間和數據的有效期等.
主要: Content-Encoding , Content-Language , Content-Length , Content-Location , Content-Type
(5)擴展頭
主要:Refresh, Content-Disposition
2. 幾個主要頭的作用
(1)Content-Type的作用
該實體頭的作用是讓伺服器告訴瀏覽器它發送的數據屬於什麼文件類型。
例如:當Content-Type 的值設置為text/html和text/plain時,前者會讓瀏覽器把接收到的實體內容以HTML格式解析,後者會讓瀏覽器以普通文本解析.
(2)Content-Disposition 的作用
當Content-Type 的類型為要下載的類型時 , 這個信息頭會告訴瀏覽器這個文件的名字和類型。
Content-Disposition擴展頭的例子:
<%@pagepageEncoding="GBK"contentType="text/html;charset=utf-8"import="java.util.*,java.text.*"%>
<%=DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT,Locale.CHINA).format(newDate())
%>
<%
response.setHeader("Content-Type","video/x-msvideo");
response.setHeader("Content-Disposition","attachment;filename=aaa.doc");
%>
Content-Disposition中指定的類型是文件的擴展名,並且彈出的下載對話框中的文件類型圖片是按照文件的擴展名顯示的,點保存後,文件以filename的值命名,保存類型以Content中設置的為准。
注意:在設置Content-Disposition頭欄位之前,一定要設置Content-Type頭欄位。
3.如何實現文件下載
要實現文件下載,我們只需要設置兩個特殊的相應頭,它們是什麼頭?如果文件名帶中文,該如何解決?
兩個特殊的相應頭:
----Content-Type: application/octet-stream
----Content-Disposition: attachment;filename=aaa.zip
例如:
response.setContentType("image/jpeg");
response.setHeader("Content-Disposition","attachment;filename=Bluehills.jpg");
如果文件中filename參數中有中文,則就會出現亂碼。
解決辦法:
(1)MimeUtility.encodeWord("中文.txt");//現在版本的IE還不行
(2)newString("中文".getBytes("GB2312"),"ISO8859-1");//實際上這個是錯誤的
4. 測試並分析文件名亂碼問題
response.setHeader()下載中文文件名亂碼問題
response.setHeader("Content-Disposition","attachment;filename="+java.net.URLEncoder.encode(fileName,"UTF-8"));
response.setHeader(...)文件名中有空格的時候
StringfileName=StringUtils.trim(file.getName());
StringformatFileName=encodingFileName(name);//在後面定義方法encodingFileName(StringfileName);
response.setHeader("Content-Disposition","attachment;filename="+formatFileName);
//處理文件名中出現的空格
//其中%20是空格在UTF-8下的編碼
(StringfileName){
StringreturnFileName="";
try{
returnFileName=URLEncoder.encode(fileName,"UTF-8");
returnFileName=StringUtils.replace(returnFileName,"+","%20");
if(returnFileName.length()>150){
returnFileName=newString(fileName.getBytes("GB2312"),"ISO8859-1");
returnFileName=StringUtils.replace(returnFileName,"","%20");
}
}catch(UnsupportedEncodingExceptione){
e.printStackTrace();
if(log.isWarnEnabled()){
log.info("Don'tsupportthisencoding...");
}
}
returnreturnFileName;
}
一秒刷新頁面一次
response.setHeader("refresh","1");
二秒跳到其他頁面
response.setHeader("refresh","2;URL=otherPagename");
沒有緩存:
response.setHeader("Pragma","No-cache");
response.setHeader("Cache-Control","no-cache");
設置過期的時間期限
response.setDateHeader("Expires",System.currentTimeMillis()+自己設置的時間期限);
訪問別的頁面:
response.setStatus(302);
response.setHeader("location","url");
通知瀏覽器數據採用的壓縮格式:
response.setHeader("Content-Encoding","壓縮後的數據");
高速瀏覽器壓縮數據的長度:
response.setHeader("Content-Length",壓縮後的數據.length+"");
高速瀏覽器圖片或視頻:
response.setHeader("Content-type","這個參數在tomcat里conf下的web.xml裡面找");
inputstreamin=this.getServletContext.getResourceAsStream("/2.jpg");
intlen=0;
bytebuffer[]=newbyte[1024]
outputStreamout=response.getOutputStream();
while(len=in.read(buffer)>0){
out.write(buffer,0,len)
}
高速瀏覽器已下載的形式:
response.setHeader("Content-disposition","attachment;filename=2.jpg");
inputstreamin=this.getServletContext.getResourceAsStream("/2.jpg");
intlen=0;
bytebuffer[]=newbyte[1024]
outputStreamout=response.getOutputStream();
while(len=in.read(buffer)>0){
out.write(buffer,0,len)
}