亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > AJAX > 正文

Ajax請求和Filter配合案例解析

2024-09-01 08:33:49
字體:
來源:轉載
供稿:網友

案例引入

現在有這樣一個問題,就是在提交大片文字評論的時候,前臺拿到數據之后給后臺發送ajax請求,然后后臺有一個防止SQL注入的Filter,這個Filter得到這個前臺傳過來的數據之后,進行合法性校驗,如果沒有校驗成功,那么要跳轉到error.jsp頁面進行顯示錯誤信息?,F在讓我們看看怎么實現這個需求。

思路一:請求轉發實現

ajax請求

$.ajax({method:'post',url:'servlet/DemoServlet',dataType:'json',data:{'userName':userName,'passWord':passWord,'text': text},success:function(data){//成功之后的邏輯},error:function(){//錯誤之后的邏輯}});

防止SQL注入Filter

package com.yiyexiaoyuan.filter;import java.io.IOException;import java.util.Enumeration;import javax.security.auth.message.callback.PrivateKeyCallback.Request;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;//過濾sql關鍵字的Filter public class SQLFilter implements Filter{public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException{HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;// 獲得所有請求參數名Enumeration params = req.getParameterNames();String sql = "";while (params.hasMoreElements()){// 得到參數名String name = params.nextElement().toString();// System.out.println("name===========================" + name +// "--");// 得到參數對應值String[] value = req.getParameterValues(name);for (int i = 0; i < value.length; i++){sql = sql + value[i];} }System.out.println("提交方式:"+req.getMethod());System.out.println("被匹配字符串:" + sql);if (sqlValidate(sql)){//請求轉發req.getRequestDispatcher("error.jsp").forward(req, res); }else{String request_uri = req.getRequestURI(); chain.doFilter(request, response);}}// 校驗protected static boolean sqlValidate(String str){str = str.toLowerCase();// 統一轉為小寫// String badStr = "and|exec";String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or|like|;|--|+|,|*|/";/** String badStr =* "'|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|"* +* "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|"* + "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";*/// 過濾掉的sql關鍵字,可以手動添加String[] badStrs = badStr.split("//|");for (int i = 0; i < badStrs.length; i++){if (str.indexOf(badStrs[i]) != -1){System.out.println("匹配到:" + badStrs[i]);return true;}}return false;}public void init(FilterConfig filterConfig) throws ServletException{// throw new UnsupportedOperationException("Not supported yet.");}public void destroy(){// throw new UnsupportedOperationException("Not supported yet.");}}

web.xml配置

<filter><display-name>SQLFilter</display-name><filter-name>SQLFilter</filter-name><filter-class>com.yiyexiaoyuan.filter.SQLFilter</filter-class></filter><filter-mapping><filter-name>SQLFilter</filter-name><url-pattern>/servlet/*</url-pattern></filter-mapping><filter>

分析,ajax請求DemoServlet,然后請求先被防止SQL注入這個Filter過濾器先過濾,然后過濾到的請求參數構成一個匹配字符串,然后檢查是否是惡意代碼,如果是的話,請求轉發。但是很遺憾,邏輯上這個是對的,但是ajax請求是局部刷新的,最后是要回到ajax請求發起的這個頁面的,所以請求轉發不會實現,我們看下一種實現邏輯。

思路二:返回值進行判斷

這個思路的邏輯是這樣的:在Filter過濾掉信息的時候,給ajax請求回送一個json數據,然后返回給前臺,前臺拿這個數據進行判斷是否是惡意代碼和良好代碼。再進行下一步的處理。

ajax請求

$.ajax({method:'post',url:'servlet/DemoServlet',dataType:'json',data:{'userName':userName,'passWord':passWord,'text': text},success:function(data){//成功之后的邏輯if (data.mssage!=""){//執行處理惡意代碼的邏輯}else{}},error:function(){//錯誤之后的邏輯}});

防止SQL注入的Filter

package com.yiyexiaoyuan.filter;import java.io.IOException;import java.util.Enumeration;import javax.security.auth.message.callback.PrivateKeyCallback.Request;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;//過濾sql關鍵字的Filter public class SQLFilter implements Filter{public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException{HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;// 獲得所有請求參數名Enumeration params = req.getParameterNames();String sql = "";while (params.hasMoreElements()){// 得到參數名String name = params.nextElement().toString();// System.out.println("name===========================" + name +// "--");// 得到參數對應值String[] value = req.getParameterValues(name);for (int i = 0; i < value.length; i++){sql = sql + value[i];} }System.out.println("提交方式:"+req.getMethod());System.out.println("被匹配字符串:" + sql);if (sqlValidate(sql)){//傳送json數據JSONObject json = new JSONObject();json.accumulate("message", "惡意代碼注入");res.getWriter().print(json.toString()); }else{String request_uri = req.getRequestURI(); chain.doFilter(request, response);}}// 校驗protected static boolean sqlValidate(String str){str = str.toLowerCase();// 統一轉為小寫// String badStr = "and|exec";String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or|like|;|--|+|,|*|/";/** String badStr =* "'|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|"* +* "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|"* + "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";*/// 過濾掉的sql關鍵字,可以手動添加String[] badStrs = badStr.split("//|");for (int i = 0; i < badStrs.length; i++){if (str.indexOf(badStrs[i]) != -1){System.out.println("匹配到:" + badStrs[i]);return true;}}return false;}public void init(FilterConfig filterConfig) throws ServletException{// throw new UnsupportedOperationException("Not supported yet.");}public void destroy(){// throw new UnsupportedOperationException("Not supported yet.");}}

思路三:異常+跳轉實現

這個思路的邏輯是這樣的。后臺的Filter過濾掉惡意注入代碼的話,拋出RuntimeException(),然后導致ajax請求失敗,然后回調ajax請求的error方法。但是我們錯誤頁面的數據怎么傳送過去呢?經過我認真思考之后,我們可以這樣做,在session存一個error_messgae值,然后ajax請求的error方法跳轉到錯誤頁面,然后進行取值渲染錯誤頁面。

ajax請求

$.ajax({method:'post',url:'servlet/DemoServlet',dataType:'json',data:{'userName':userName,'passWord':passWord,'text': text},success:function(data){//成功之后的邏輯},error:function(){window.location.href="error.jsp";}});

防止SQL注入Filter

package com.yiyexiaoyuan.filter;import java.io.IOException;import java.util.Enumeration;import javax.security.auth.message.callback.PrivateKeyCallback.Request;import javax.servlet.Filter;import javax.servlet.FilterChain;import javax.servlet.FilterConfig;import javax.servlet.ServletException;import javax.servlet.ServletRequest;import javax.servlet.ServletResponse;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import net.sf.json.JSONObject;//過濾sql關鍵字的Filter public class SQLFilter implements Filter{public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException{HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse res = (HttpServletResponse) response;// 獲得所有請求參數名Enumeration params = req.getParameterNames();String sql = "";while (params.hasMoreElements()){// 得到參數名String name = params.nextElement().toString();// System.out.println("name===========================" + name +// "--");// 得到參數對應值String[] value = req.getParameterValues(name);for (int i = 0; i < value.length; i++){sql = sql + value[i];} }System.out.println("提交方式:"+req.getMethod());System.out.println("被匹配字符串:" + sql);if (sqlValidate(sql)){req.getSession().setAttribute("error_message","惡意注入了"); throw new RuntimeException("惡意注入");}else{String request_uri = req.getRequestURI(); chain.doFilter(request, response);}}// 校驗protected static boolean sqlValidate(String str){str = str.toLowerCase();// 統一轉為小寫// String badStr = "and|exec";String badStr = "'|and|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|char|declare|sitename|net user|xp_cmdshell|or|like|;|--|+|,|*|/";/** String badStr =* "'|and|exec|execute|insert|create|drop|table|from|grant|use|group_concat|column_name|"* +* "information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|*|"* + "chr|mid|master|truncate|char|declare|or|;|-|--|+|,|like|//|/|%|#";*/// 過濾掉的sql關鍵字,可以手動添加String[] badStrs = badStr.split("//|");for (int i = 0; i < badStrs.length; i++){if (str.indexOf(badStrs[i]) != -1){System.out.println("匹配到:" + badStrs[i]);return true;}}return false;}public void init(FilterConfig filterConfig) throws ServletException{// throw new UnsupportedOperationException("Not supported yet.");}public void destroy(){// throw new UnsupportedOperationException("Not supported yet.");}}

error.jsp實現

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>錯誤頁面</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><center> 系統出錯了,請稍后再試......<br /><br /><br /><br />錯誤信息是: ${ error_message}</center> </body></html>

這樣就很巧妙得實現了Filter攔截并友好提示。

以上所述是小編給大家介紹的Ajax請求和Filter配合案例解析,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對VeVb武林網網站的支持!


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩成人在线免费观看| 日韩中文在线视频| 欧美国产欧美亚洲国产日韩mv天天看完整| 日韩天堂在线视频| 日韩一级裸体免费视频| 欧美中文字幕视频在线观看| 欧美日韩加勒比精品一区| 国产精品入口尤物| 亚洲高清色综合| 国产精品美乳一区二区免费| 欧美人交a欧美精品| 日韩大片免费观看视频播放| 中文字幕日韩在线视频| 久久精品国产精品亚洲| 久久久在线观看| 欧美激情视频网| 欧美午夜精品久久久久久浪潮| 色视频www在线播放国产成人| 欧美亚洲日本网站| 久久99青青精品免费观看| 亚洲另类图片色| 久久精品中文字幕电影| 亚洲成人精品视频在线观看| 中文字幕免费精品一区| 国产精品三级网站| 亚洲第一综合天堂另类专| 欧美一区二区视频97| 国产精品一区专区欧美日韩| 国产欧美日韩综合精品| 尤物99国产成人精品视频| 亚洲精品视频网上网址在线观看| 91国自产精品中文字幕亚洲| 亚洲的天堂在线中文字幕| 日韩av黄色在线观看| 欧美专区在线观看| 欧美激情一区二区三区高清视频| 久久久女人电视剧免费播放下载| 亚洲最大中文字幕| 亚洲人成伊人成综合网久久久| 精品久久久久久亚洲国产300| 欧美在线视频免费| 欧美日韩成人黄色| 丝袜亚洲另类欧美重口| 国产精品∨欧美精品v日韩精品| 欧美精品一二区| 久久精品国产亚洲精品| 欧美一二三视频| 日韩国产精品亚洲а∨天堂免| 日韩成人在线视频网站| 色综合天天综合网国产成人网| 国产成人中文字幕| 欧美夫妻性生活xx| 国产精品吹潮在线观看| 97久久精品在线| 草民午夜欧美限制a级福利片| 欧美有码在线视频| 日韩电影免费观看中文字幕| 亚洲色图25p| 成人黄色在线播放| 91福利视频在线观看| 日韩av综合网站| 日本精品性网站在线观看| 国产精品一区二区在线| 成人激情av在线| 国产精品久久国产精品99gif| 有码中文亚洲精品| 日韩高清中文字幕| 日本19禁啪啪免费观看www| 一本久久综合亚洲鲁鲁| 欧美国产日本高清在线| 国产日韩精品在线| 欧美黄色片视频| 秋霞午夜一区二区| 另类少妇人与禽zozz0性伦| 中文字幕一区电影| 色偷偷综合社区| 亚洲欧美日韩国产精品| 91免费精品国偷自产在线| 狠狠爱在线视频一区| 国内精品视频一区| 免费不卡欧美自拍视频| 亚洲欧洲日产国产网站| 欧美激情精品久久久久久变态| 日韩在线视频国产| 欧美诱惑福利视频| 国产成人一区二区三区| 国产精品美女无圣光视频| 日韩精品电影网| 日韩电影免费观看在线| 久久色免费在线视频| 日韩精品极品在线观看播放免费视频| 久久91亚洲精品中文字幕| 中文字幕精品—区二区| 精品国产成人av| 久久精品国产欧美激情| 蜜臀久久99精品久久久无需会员| 久久亚洲欧美日韩精品专区| 亚洲天堂一区二区三区| 欧美极品少妇xxxxⅹ喷水| 亚洲免费av电影| 日韩最新在线视频| 最近2019年好看中文字幕视频| 久久精品久久精品亚洲人| 欧美激情精品久久久久久变态| 久久天天躁狠狠躁夜夜躁2014| 日韩在线免费视频观看| 在线精品播放av| 在线观看免费高清视频97| 久久久久久有精品国产| 亚洲国产精品国自产拍av秋霞| 在线激情影院一区| 一夜七次郎国产精品亚洲| 久久久免费电影| 91在线高清免费观看| 久久久亚洲欧洲日产国码aⅴ| 国产精品主播视频| 日韩精品中文字幕久久臀| 欧美午夜精品伦理| 粉嫩av一区二区三区免费野| 尤物yw午夜国产精品视频明星| 日韩一区视频在线| 亚洲开心激情网| 成年人精品视频| 尤物九九久久国产精品的分类| 一区二区成人精品| 日韩成人中文字幕| 亚洲综合日韩中文字幕v在线| 91av在线视频观看| 欧美特黄级在线| 日本91av在线播放| 国产精品久久久久久久久久三级| 欧美大尺度电影在线观看| 色www亚洲国产张柏芝| 色综合伊人色综合网站| 黑人精品xxx一区| 狠狠久久亚洲欧美专区| 中文字幕九色91在线| 精品自拍视频在线观看| 亚洲裸体xxxx| 久久91亚洲人成电影网站| 九九精品视频在线| 中文字幕亚洲字幕| 国产精品久久9| 欧美老女人在线视频| 成人久久18免费网站图片| 久久久久久12| 国产精品欧美激情| 亚洲综合在线做性| 国产精品视频公开费视频| 亚洲欧美综合区自拍另类| 91精品国产自产在线观看永久| 日韩有码视频在线| 欧美日韩在线影院| 欧美日韩国产精品一区二区不卡中文| 日韩国产在线播放| 成人午夜在线观看| 亚洲人午夜精品| 亚洲xxxxx性| 欧美又大又粗又长| 亚洲美女在线视频| 日韩va亚洲va欧洲va国产| 亚洲欧美制服第一页| 欧美激情视频播放| 精品丝袜一区二区三区|