通用Servlet Ajax請求 /do 處理所有請求,反射機制
//對於以上程式碼,PostAction對應你要請求的地址,我們暫時定義為var PostAction = "http://localhost:8080/tom/app/do";//拼接sPost引數,作為json格式傳入後臺,a是加密過的資料,c是當前使用者id//在後臺,我們配置對應的Servlet,我們攔截字尾為/app/do的請求,可以攔截所有app/do請求function callObjectAction(action, method, page, id, param, func, p1, p2, p3, p4, p5, p6, p7, p8) { if (!Me._id) { window.open('index.html','_self'); } else { var sPost = '{"a":"'+action+'","c":"'+method+'","k":"' + page + '","i":"' + id + '","_userid":"'+ Me._id +'"'; if (param) { sPost += ','+param; } sPost += '}'; //alert("post = " + sPost + "\r\n >>> " + encrypt(sPost, Me._s).length); $.ajax({ url : PostAction, method : 'POST', async : false, cache : false, //timeout : 30000, data : { a : encrypt(sPost, Me._s), b : "", c : Me._s }, // beforeSend:function() { //alert("before send"); // }, // complete:function() { //alert("after success or error"); // }, success : function(callBackData) { var jsonData = eval("(" + decrypt(callBackData, Me._s) + ");"); if (jsonData.m) { if (jsonData.s == '1') { successMessage(jsonData.m); } else { if (document.getElementById("er-" + page + "." + id)) { document.getElementById("er-" + page + "." + id).innerHTML = jsonData.m; document.getElementById("er-" + page + "." + id).style.display = ""; } else { errorMessage(jsonData.m); } } } if (jsonData.c) { eval(jsonData.c); } if (jsonData.s=='1') { if (func) { func(jsonData,p1,p2,p3,p4,p5,p6,p7,p8); } } }, error:function(callBackData) { alert("error"); } }); } };
<servlet> <servlet-name>AppReceiver</servlet-name> <servlet-class>app.servlet.AppServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AppReceiver</servlet-name> <url-pattern>/app/do</url-pattern> </servlet-mapping>
//我們這裡AppServlet繼承我們寫好的BaseServlet基類,我們的BaseServlet繼承HttpServlet
JsonNode node = JsonUtil.getJson(sJson);
sUser = JsonUtil.getJsonStringValue(node, "_u");
String sClass = JsonUtil.getJsonStringValue(node, "a");
String sFunction = JsonUtil.getJsonStringValue(node, "c");
//取出對應的類以及函式
String sIP = getRemoteHost(request);
//獲取遠端ip訪問地址,具體方法函式如下://獲取客戶端地址
public String getRemoteHost(javax.servlet.http.HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); } return ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip; }
sReturn = callAction(request, response, sClass, sFunction, sToken, node, sUser);
//上面一句是關鍵地方,傳遞函式以及類,node是封裝後的ip地址//下面是具體執行反射呼叫的過程,非常重要 //呼叫執行方法
public String callAction(HttpServletRequest request, HttpServletResponse response, String sClass, String sFunction,
String sToken, JsonNode node, String sUser) throws Exception {
String sResult = "";
Class[] aParams = new Class[4];
Object[] aValues = new Object[4];
aParams[0] = HttpServletRequest.class;
aParams[1] = HttpServletResponse.class;
aParams[2] = JsonNode.class;
aParams[3] = String.class;
aValues[0] = request;
aValues[1] = response;
aValues[2] = node;
aValues[3] = sUser;
Class aClass = null;
try {
aClass = Class.forName(ConfigUtil.App + ".app.action.Action" + sClass);
} catch (ClassNotFoundException e) {
aClass = Class.forName("app.action.Action" + sClass);
}
sResult = "" + aClass.getMethod(CommonUtil.isNull(sFunction) ? "action" : sFunction, aParams).invoke(null, aValues);
return sResult;
}
//我們來分析一下,request和response物件,類名,方法名,token,node傳入引數,sUser當前使用者
//建立一個aParams 的類陣列來儲存類資料,Class.forName("app.action.Action"+sClass),
//class.forName()是運用反射的原理建立物件,平常我們建立物件都是用new方式,class.forName也是一種方式。
//在這裡可以簡單說下5種建立物件的方式,1:使用new關鍵字,呼叫了建構函式,2:使用Class類的newInstance方法,呼叫了建構函式,
//3:使用Constructor類的newInstance方法,4:使用clone方法,沒有呼叫建構函式,5:使用反序列化,沒有呼叫建構函式。
//如,我前臺寫callObjectAction("Config","goodsPutAwayCheck",'',i,sParam,loadTableOption,i,d,c,s,p,t,f);
//即呼叫了app.action.ActionConfig類的goodsPutAwayCheck方法,返回資料在js中已經有處理,就不再細說,完整的公用callObjectAction適用所有請求
相關推薦
通用Servlet Ajax請求 /do 處理所有請求,反射機制
//我們來看下通用ajax 對應的js//其中action為系統內對應的Action類,method 對應的是類中的方法,page和id 可以為"",param為傳入引數,//func為回撥函式,p1-p8均為回撥函式傳遞的引數function callObjectActi
Servlet初始化及處理HTTP請求
png cal 共享 servlet配置 用戶訪問 input 端口號 doget 本地 上一篇詳細介紹了與Servlet相關的幾個核心的接口和類,當我們自己寫Servlet類時,一般需要繼承HttpServlet類,實現init()、doGet()、doP
Servlet生命週期和處理Http請求與響應
servlet的生命週期: 1.容器開啟並載入servlet; 2.呼叫init()方法對servlet進行初始化; 3.當請求到來呼叫service()方法處理請求,傳送響應; 4.呼叫destory()方法銷燬servlet; servlet處理Http響應
Servlet+AJAX實現資料處理顯示
實現功能:在輸入框中輸入字元,用AJAX傳到後臺Servlet處理後加上隨機數,並返回到前臺顯示。 一、寫前臺jsp頁面index.jsp <%@ page language="java"
axios(封裝使用、攔截特定請求、判斷所有請求加載完畢)
做出 page push cover arr 登錄 開發 自動識別 ram 博客地址:https://ainyi.com/71 基於 Promise 的 HTTP 請求客戶端,可同時在瀏覽器和 Node.js 中使用 vue2.0之後,就不再對 vue-resource
Servlet裏面request處理外部POST請求的輸入流的工具類
ace exceptio 輸入流 exception tac append clas blog trac package etcom.servlet; import java.io.BufferedReader; import java.io.IOException;
Ajax中與服務器的通信【發送請求與處理響應】
active 狀態碼 代碼 技術 bsp item 出版 ml2 圖書 一、發送請求 Ajax中通過XMLHttpRequest對象發送異步方式的後臺請求時。通常有兩種方式的請求,一種是GET請求,另一種是POST請求。發送請求一般要經過4個步驟分別是: (1)初始化X
Filter過濾器(自動登陸、通用的字符集編碼的過濾【處理不同請求的亂碼問題】、。。。)
XML under amt 有關 filter過濾器 pre 繼承 擴展名 獲取 Filter過濾器:可以過濾(攔截)從客戶端向服務器發送的請求。 過濾器的作用: 進行ip的過濾,臟話敏感詞語的過濾,自動登陸,響應壓縮。。。 過濾器的使用: 1.編寫類實現Filte
ajax 請求前後處理
1. 介紹 通過 jQuery 提供的 ajaxSetup 方法,我們可以攔截頁面上所有的 Ajax 請求響應(包括 $.ajax、$.post、$.get)。這樣我們可以對這些 Ajax 請求響應做統一的處理。 2. 例項 在每個需要攔截的頁面中新增 或者 在頁面引入的js檔案中新增 //
前端接收資料流實現圖片預覽效果--ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求並處理二進位制流資料 之最佳實踐
本文為轉載文章 原文連結:https://www.cnblogs.com/cdemo/p/5225848.html 首先要謝謝這位大神的無私貢獻!解決了我的問題也完美表達了我當時的心路歷程 ajax 請求二進位制流 圖片 檔案 XMLHttpRequest 請求並處理二進位制流資料 之最佳實踐
使用AJAX傳送POST/GET請求並處理返回的結果集
1.AJAX格式 $.ajax({ //請求方式post /get type:'post', //請求地址 url:'${ctx}/business/userActivateOrder/getOrders', //請求資料型別 dataType:'js
AJAX+Servlet實現客戶端無重新整理請求伺服器實踐
最近需要做一個在網頁中要不斷檢測伺服器端資料程式,當然最簡單的方法是在html頁面頭部加以下標籤 <META http-equiv=V="REFRESH" content="5;URL=本頁面url"> 實現將網頁設成每隔5秒鐘將自身頁面重新整理一次
axios處理http請求,對比ajax
在處理http請求方面,已經不推薦使用vue-resource了,而是使用最新的axios,下面做一個簡單的介紹。 安裝 使用node npm install axios 使用cdn <script src="https://unpkg.com/
前端html列表載入更多效果(預設取出所有資料,用js控制顯示數量,也可以用分頁的形式進行ajax請求,這種暫時木有寫)
程式碼說明,頁面是用freemarker寫的,newsModel.list 是所有的資料; <ul class="affair_list" pagesize="3"> 這句是關鍵 <#if type=='news'> &nbs
web 會話超時,請求(http請求和ajax非同步請求)處理
@Overridepublic void doFilter(ServletRequest request, ServletResponse response,FilterChain filterChain) throws IOException, ServletException {HttpServletRe
shiro 攔截器實現session過期攔截ajax請求的處理
攔截器程式碼: package com.xlqh.outlook.shirofilter; import java.io.IOException; import org.apache.shiro.
springMVC一個Controller處理所有使用者請求的併發問題
有狀態和無狀態的物件基本概念: 有狀態物件(Stateful Bean),就是有例項變數的物件 ,可以儲存資料,是非執行緒安全的。一般是prototype scope。 無狀態物件(Stateless Bean),就是沒有例項變數的物件,不能儲存資料,是不變類,是執行緒安全的。一般是singleton s
SpringMVC中servlet處理http請求原始碼解析
Spring MVC的核心控制器為Servlet,所有訪問服務端的請求都將由servlet攔截接受,並進行相應處理最終進行返回。下面我們來看看它究竟是怎麼做的。 SpringMVC中的Servl
ajax實戰:(ajax非同步下載檔案)請求二進位制流進行處理
需求 管理後臺需要隨時下載資料報表,資料要實時生成後轉換為excel下載 檔案不大,頁面放置“匯出”按鈕,點選按鈕後彈出儲存檔案對話方塊儲存 說明:第一種方法使用a標籤直接可以滿足大部分人需求,第二種方法純粹是在說實現方法以及更好的操作體驗,不需要(舉一個需
ssm整合shiro後,遇到ajax請求的處理
public class RoleAUthorizationFilter extends AuthorizationFilter { @Override protected boolean onAccessDenied(ServletRequest request,