java請求,java請求轉發

本文目錄一覽:

Java 請求輸入接口文檔沒有的字段會報錯嗎

會。

輸入接口需要調用方法或者將接口的位置進行連接,如果沒有初始化,將無法使用這個接口,甚至無法運行。

接口英文Interface在JAVA編程語言中是一個抽象類型,是抽象方法的集合,接口通常以interface來聲明,一個類通過繼承接口的方式,從而來繼承接口的抽象方法,接口並不是類,編寫接口的方式和類很相似,但是它們屬於不同的概念,類描述對象的屬性和方法,接口則包含類要實現的方法,除非實現接口的類是抽象類,否則該類要定義接口中的所有方法。

Java發送get請求時設置ua

HttpClient方式發送請求或則以流的方式。

兩種實現方式不同,怎麼使用看個人喜好,不過在項目開發過程中,使用流的方式部署在預發機linux機器上會出現發送請求返回null的情況,但是本地windows卻正常訪問,而且,換另外一台預發機也能正常獲取數據,目前還沒有研究出個所以然,get是從服務器上獲取數據,post是向服務器傳送數據,get是把參數數據隊列加到提交表單的ACTION屬性所指的URL中,值和表單內各個字段一一對應,在URL中可以看到,post是通過HTTPpost機制,將表單內各個字段與其內容放置在HTML HEADER內一起傳送到ACTION屬性所指的URL地址。

javaweb如何實現請求和響應

先來看一個流程圖:

服務器處理請求的流程:

(1)服務器每次收到請求時,都會為這個請求開闢一個新的線程。

(2)服務器會把客戶端的請求數據封裝到request對象中,request就是請求數據的載體!

(3)服務器還會創建response對象,這個對象與客戶端連接在一起,它可以用來向客戶端發送響應。

由流程圖可以看出,在JavaWeb的請求與響應中,最重要的兩個參數為request以及response,這兩參數在Servlet的service( )方法中。

1、response概念:

response是Servlet.service方法的一個參數,類型為javax.servlet.http.HttpServletResponse。在客戶端發出每個請求時,服務器都會創建一個response對象,並傳入給Servlet.service()方法。response對象是用來對客戶端進行響應的,這說明在service()方法中使用response對象可以完成對客戶端的響應工作。

response對象的功能分為以下四種:

(1)設置響應頭信息

(2)發送狀態碼

(3)設置響應正文

(4)重定向

2、response響應正文

response是響應對象,向客戶端輸出響應正文(響應體)可以使用response的響應流,repsonse一共提供了兩個響應流對象:

(1)PrintWriter out = response.getWriter():獲取字符流;

(2)ServletOutputStream out = response.getOutputStream():獲取位元組流;

當然,如果響應正文內容為字符,那麼使用response.getWriter(),如果響應內容是位元組,例如下載時,那麼可以使用response.getOutputStream()。

注意,在一個請求中,不能同時使用這兩個流!也就是說,要麼你使用repsonse.getWriter(),要麼使用response.getOutputStream(),但不能同時使用這兩個流。不然會拋出illegalStateException異常。

java中請求參數action怎麼獲取

1. ActionContext

在Struts2開發中,除了將請求參數自動設置到Action的字段中,我們往往也需要在Action里直接獲取請求(Request)或會話(Session)的一些信息,甚至需要直接對JavaServlet Http的請求(HttpServletRequest),響應(HttpServletResponse)操作. 我們需要在Action中取得request請求參數”username”的值:

ActionContext context = ActionContext.getContext();

Map params = context.getParameters();

String username = (String) params.get(“username”);

on執行時的上下文,上下文可以看作是一個容器(其實我們這裡的容器就是一個Map而已),它存放的是Action在執行時需要用到的對象. 一般情況, 我們的ActionContext都是通過: ActionContext context = (ActionContext) actionContext.get();來獲取的.我們再來看看這裡的actionContext對象的創建:

static ThreadLocal actionContext = new ActionContextThreadLocal();

ActionContextThreadLocal是實現ThreadLocal的一個內部類.ThreadLocal可以命名為”線程局部變量”,它為每一個使用該變量的線程都提供一個變量值的副本,使每一個線程都可以獨立地改變自己的副本,而不會和其它線程的副本衝突.這樣,我們ActionContext里的屬性只會在對應的當前請求線程中可見,從而保證它是線程安全的.

通過ActionContext取得HttpSession: Map session = ActionContext.getContext().getSession();

2. ServletActionContext

ServletActionContext(com.opensymphony.webwork. ServletActionContext),這個類直接繼承了我們上面介紹的ActionContext,它提供了直接與Servlet相關對象訪問的功能,它可以取得的對象有:

(1)javax.servlet.http.HttpServletRequest : HTTPservlet請求對象

(2)javax.servlet.http.HttpServletResponse : HTTPservlet相應對象

(3)javax.servlet.ServletContext : Servlet上下文信息

(4)javax.servlet.ServletConfig : Servlet配置對象

(5)javax.servlet.jsp.PageContext : Http頁面上下文

如何從ServletActionContext里取得Servlet的相關對象:

1取得HttpServletRequest對象: HttpServletRequest request = ServletActionContext. getRequest();

2取得HttpSession對象: HttpSession session = ServletActionContext. getRequest().getSession();

3. ServletActionContext和ActionContext聯繫

ServletActionContext和ActionContext有着一些重複的功能,在我們的Action中,該如何去抉擇呢?我們遵循的原則是:如果ActionContext能夠實現我們的功能,那最好就不要使用ServletActionContext,讓我們的Action盡量不要直接去訪問Servlet的相關對象.

注意:在使用ActionContext時有一點要注意: 不要在Action的構造函數里使用ActionContext.getContext(),因為這個時候ActionContext里的一些值也許沒有設置,這時通過ActionContext取得的值也許是null;同樣,HttpServletRequest req = ServletActionContext.getRequest()也不要放在構造函數中,也不要直接將req作為類變量給其賦值。至於原因,我想是因為前面講到的static ThreadLocal actionContext = new ActionContextThreadLocal(),從這裡我們可以看出ActionContext是線程安全的,而ServletActionContext繼承自ActionContext,所以ServletActionContext也線程安全,線程安全要求每個線程都獨立進行,所以req的創建也要求獨立進行,所以ServletActionContext.getRequest()這句話不要放在構造函數中,也不要直接放在類中,而應該放在每個具體的方法體中(eg:login()、queryAll()、insert()等),這樣才能保證每次產生對象時獨立的建立了一個req。

4. struts2中獲得request、response和session

(1)非IoC方式

方法一:使用org.apache.struts2.ActionContext類,通過它的靜態方法getContext()獲取當前Action的上下文對象。

ActionContext ctx = ActionContext.getContext();

ctx.put(“liuwei”, “andy”); //request.setAttribute(“liuwei”, “andy”);

Map session = ctx.getSession(); //session

HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);

HttpServletResponse response = ctx.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);

細心的朋友可以發現這裡的session是個Map對象, 在Struts2中底層的session都被封裝成了Map類型. 我們可以直接操作這個Map對象進行對session的寫入和讀取操作, 而不用去直接操作HttpSession對象.

方法二:使用org.apache.struts2.ServletActionContext類

public class UserAction extends ActionSupport {

//其他代碼片段

private HttpServletRequest req;

// private HttpServletRequest req = ServletActionContext.getRequest(); 這條語句放在這個位置是錯誤的,同樣把這條語句放在構造方法中也是錯誤的。

public String login() {

req = ServletActionContext.getRequest(); //req的獲得必須在具體的方法中實現

user = new User();

user.setUid(uid);

user.setPassword(password);

if (userDAO.isLogin(user)) {

req.getSession().setAttribute(“user”, user);

return SUCCESS;

}

return LOGIN;

}

public String queryAll() {

req = ServletActionContext.getRequest(); //req的獲得必須在具體的方法中實現

uList = userDAO.queryAll();

req.getSession().setAttribute(“uList”, uList);

return SUCCESS;

}

//其他代碼片段

}

(2)IoC方式(即使用Struts2 Aware攔截器)

要使用IoC方式,我們首先要告訴IoC容器(Container)想取得某個對象的意願,通過實現相應的接口做到這點。

public class UserAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {

private HttpServletRequest request;

private HttpServletResponse response;

public void setServletRequest(HttpServletRequest request) {

this.request = request;

}

public void setServletResponse(HttpServletResponse response) {

this.response = response;

}

public String execute() {

HttpSession session = request.getSession();

return SUCCESS;

}

}

如何在java中發起http和https請求

1.寫http請求方法

[java] view plain copy

//處理http請求 requestUrl為請求地址 requestMethod請求方式,值為”GET”或”POST”

public static String httpRequest(String requestUrl,String requestMethod,String outputStr){

StringBuffer buffer=null;

try{

URL url=new URL(requestUrl);

HttpURLConnection conn=(HttpURLConnection)url.openConnection();

conn.setDoOutput(true);

conn.setDoInput(true);

conn.setRequestMethod(requestMethod);

conn.connect();

//往服務器端寫內容 也就是發起http請求需要帶的參數

if(null!=outputStr){

OutputStream os=conn.getOutputStream();

os.write(outputStr.getBytes(“utf-8”));

os.close();

}

//讀取服務器端返回的內容

InputStream is=conn.getInputStream();

InputStreamReader isr=new InputStreamReader(is,”utf-8″);

BufferedReader br=new BufferedReader(isr);

buffer=new StringBuffer();

String line=null;

while((line=br.readLine())!=null){

buffer.append(line);

}

}catch(Exception e){

e.printStackTrace();

}

return buffer.toString();

}

2.測試。

[java] view plain copy

public static void main(String[] args){

String s=httpRequest(“”,”GET”,null);

System.out.println(s);

}

輸出結果為的源代碼,說明請求成功。

註:1).第一個參數url需要寫全地址,即前邊的http必須寫上,不能只寫這樣的。

2).第二個參數是請求方式,一般接口調用會給出URL和請求方式說明。

3).第三個參數是我們在發起請求的時候傳遞參數到所要請求的服務器,要傳遞的參數也要看接口文檔確定格式,一般是封裝成json或xml.

4).返回內容是String類,但是一般是有格式的json或者xml。

二:發起https請求。

1.https是對鏈接加了安全證書SSL的,如果服務器中沒有相關鏈接的SSL證書,它就不能夠信任那個鏈接,也就不會訪問到了。所以我們第一步是自定義一個信任管理器。自要實現自帶的X509TrustManager接口就可以了。

[java] view plain copy

import java.security.cert.CertificateException;

import java.security.cert.X509Certificate;

import javax.net.ssl.X509TrustManager;

public class MyX509TrustManager implements X509TrustManager {

@Override

public void checkClientTrusted(X509Certificate[] chain, String authType)

throws CertificateException {

// TODO Auto-generated method stub

}

@Override

public void checkServerTrusted(X509Certificate[] chain, String authType)

throws CertificateException {

// TODO Auto-generated method stub

}

@Override

public X509Certificate[] getAcceptedIssuers() {

// TODO Auto-generated method stub

return null;

}

}

註:1)需要的包都是java自帶的,所以不用引入額外的包。

2.)可以看到裏面的方法都是空的,當方法為空是默認為所有的鏈接都為安全,也就是所有的鏈接都能夠訪問到。當然這樣有一定的安全風險,可以根據實際需要寫入內容。

2.編寫https請求方法。

[java] view plain copy

/*

* 處理https GET/POST請求

* 請求地址、請求方法、參數

* */

public static String httpsRequest(String requestUrl,String requestMethod,String outputStr){

StringBuffer buffer=null;

try{

//創建SSLContext

SSLContext sslContext=SSLContext.getInstance(“SSL”);

TrustManager[] tm={new MyX509TrustManager()};

//初始化

sslContext.init(null, tm, new java.security.SecureRandom());;

//獲取SSLSocketFactory對象

SSLSocketFactory ssf=sslContext.getSocketFactory();

URL url=new URL(requestUrl);

HttpsURLConnection conn=(HttpsURLConnection)url.openConnection();

conn.setDoOutput(true);

conn.setDoInput(true);

conn.setUseCaches(false);

conn.setRequestMethod(requestMethod);

//設置當前實例使用的SSLSoctetFactory

conn.setSSLSocketFactory(ssf);

conn.connect();

//往服務器端寫內容

if(null!=outputStr){

OutputStream os=conn.getOutputStream();

os.write(outputStr.getBytes(“utf-8”));

os.close();

}

//讀取服務器端返回的內容

InputStream is=conn.getInputStream();

InputStreamReader isr=new InputStreamReader(is,”utf-8″);

BufferedReader br=new BufferedReader(isr);

buffer=new StringBuffer();

String line=null;

while((line=br.readLine())!=null){

buffer.append(line);

}

}catch(Exception e){

e.printStackTrace();

}

return buffer.toString();

}

可見和http訪問的方法類似,只是多了SSL的相關處理。

3.測試。先用http請求的方法訪問,再用https的請求方法訪問,進行對比。

http訪問:

[java] view plain copy

public static void main(String[] args){

String s=httpRequest(“”,”GET”,null);

System.out.println(s);

}

結果為:

https訪問:

[java] view plain copy

public static void main(String[] args){

String s=httpsRequest(“”,”GET”,null);

System.out.println(s);

}

結果為:

可見https的鏈接一定要進行SSL的驗證或者過濾之後才能夠訪問。

三:https的另一種訪問方式——導入服務端的安全證書。

1.下載需要訪問的鏈接所需要的安全證書。 以這個網址為例。

1)在瀏覽器上訪問。

2)點擊上圖的那個打了×的鎖查看證書。

3)選擇複製到文件進行導出,我們把它導入到java項目所使用的jre的lib文件下的security文件夾中去,我的是這個路徑。D:\Program Files (x86)\Java\jre8\lib\security

註:中間需要選導出格式,就選默認的就行,還需要命名,我命名的是12306.

2.打開cmd,進入到java項目所使用的jre的lib文件下的security目錄。

3.在命令行輸入 Keytool -import -alias 12306 -file 12306.cer -keystore cacerts

4.回車後會讓輸入口令,一般默認是changeit,輸入時不顯示,輸入完直接按回車,會讓確認是否信任該證書,輸入y,就會提示導入成功。

5.導入成功後就能像請求http一樣請求https了。

測試:

[java] view plain copy

public static void main(String[] args){

String s=httpRequest(“”,”GET”,null);

System.out.println(s);

}

結果:

現在就可以用http的方法請求https了。

註:有時候這一步還是會出錯,那可能是jre的版本不對,我們右鍵run as——run configurations,選擇證書所在的jre之後再運行。

java中怎樣用post,get,put請求

java中用post,get,put請求方法:

public static String javaHttpGet(String url,String charSet){

String resultData = null;

try {

URL pathUrl = new URL(url); //創建一個URL對象

HttpURLConnection urlConnect = (HttpURLConnection) pathUrl.openConnection(); //打開一個HttpURLConnection連接

urlConnect.setConnectTimeout(30000); // 設置連接超時時間

urlConnect.connect();

if (urlConnect.getResponseCode() == 200) { //請求成功

resultData = readInputStream(urlConnect.getInputStream(), charSet);

}

} catch (MalformedURLException e) {

LogL.getInstance().getLog().error(“URL出錯!”, e);

} catch (IOException e) {

LogL.getInstance().getLog().error(“讀取數據流出錯!”, e);

}

return resultData;

}

public static String javaHttpPost(String url,MapString,Object map,String charSet){

String resultData=null;

StringBuffer params = new StringBuffer();

try {

IteratorEntryString, Object ir = map.entrySet().iterator();

while (ir.hasNext()) {

Map.EntryString, Object entry = (Map.EntryString, Object) ir.next();

params.append(URLEncoder.encode(entry.getKey(),charSet) + “=” + URLEncoder.encode(entry.getValue().toString(), charSet) + “”);

}

byte[] postData = params.deleteCharAt(params.length()).toString().getBytes();

URL pathUrl = new URL(url); //創建一個URL對象

HttpURLConnection urlConnect = (HttpURLConnection) pathUrl.openConnection();

urlConnect.setConnectTimeout(30000); // 設置連接超時時間

urlConnect.setDoOutput(true); //post請求必須設置允許輸出

urlConnect.setUseCaches(false); //post請求不能使用緩存

urlConnect.setRequestMethod(“POST”); //設置post方式請求

urlConnect.setInstanceFollowRedirects(true);

urlConnect.setRequestProperty(“Content-Type”,”application/x-www-form-urlencoded; charset=”+charSet);// 配置請求Content-Type

urlConnect.connect(); // 開始連接

DataOutputStream dos = new DataOutputStream(urlConnect.getOutputStream()); // 發送請求參數

dos.write(postData);

dos.flush();

dos.close();

if (urlConnect.getResponseCode() == 200) { //請求成功

resultData = readInputStream(urlConnect.getInputStream(),charSet);

}

} catch (MalformedURLException e) {

LogL.getInstance().getLog().error(“URL出錯!”, e);

} catch (IOException e) {

LogL.getInstance().getLog().error(“讀取數據流出錯!”, e);

} catch (Exception e) {

LogL.getInstance().getLog().error(“POST出錯!”, e);

}

return resultData;

}

原創文章,作者:ZVES,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/137280.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
ZVES的頭像ZVES
上一篇 2024-10-04 00:17
下一篇 2024-10-04 00:17

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean加載過程

    Java Bean加載過程涉及到類加載器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean加載的過程。 一、類加載器 類加載器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發佈。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字符串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字符串中是否存在多個指定字符: 一、字符串遍歷 字符串是Java編程中非常重要的一種數據類型。要判斷字符串中是否存在多個指定字符…

    編程 2025-04-29
  • VSCode為什麼無法運行Java

    解答:VSCode無法運行Java是因為默認情況下,VSCode並沒有集成Java運行環境,需要手動添加Java運行環境或安裝相關插件才能實現Java代碼的編寫、調試和運行。 一、…

    編程 2025-04-29
  • Java任務下發回滾系統的設計與實現

    本文將介紹一個Java任務下發回滾系統的設計與實現。該系統可以用於執行複雜的任務,包括可回滾的任務,及時恢復任務失敗前的狀態。系統使用Java語言進行開發,可以支持多種類型的任務。…

    編程 2025-04-29
  • Java 8 Group By 會影響排序嗎?

    是的,Java 8中的Group By會對排序產生影響。本文將從多個方面探討Group By對排序的影響。 一、Group By的概述 Group By是SQL中的一種常見操作,它…

    編程 2025-04-29

發表回復

登錄後才能評論