日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

大数据WEB阶段(十五)JavaEE三大核心技术之过滤器

發(fā)布時間:2024/4/30 java 74 豆豆
生活随笔 收集整理的這篇文章主要介紹了 大数据WEB阶段(十五)JavaEE三大核心技术之过滤器 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Filter過濾器

一、Filter 過濾器概述

  • Filter是JavaEE三大核心技術(shù)(Servlet 、 Filter 、 Listener)之一
  • FIlter作用是攔截對資源的訪問 , 攔截下來后可以控制是否允許通過 , 或者在允許通過前后做一些額外的操作 。
  • 所謂的攔截其實就是對代表請求的request、對象和代表 響應的response對象攔截下來 , 進行控制
  • 一個過濾器可能攔截多個資源 , 一個資源也可能被多個過濾器攔截
  • 這種多個攔截器攔截一個資源的模式成為責任鏈模式 。
  • 常用場景:
  • 就與URL的訪問權(quán)限控制
  • 全站亂碼解決過濾器
  • 過濾敏感詞匯
  • 壓縮響應
  • 二、 過濾器的開發(fā)

  • 想要開發(fā)一個過濾器 , 需要兩個步驟
  • 寫一個類實現(xiàn)Filter接口
  • 在web.xml中配置過濾器
  • Filter接口:
  • init(FilterConfig)
  • 初始化的方法 , 當Filter被初始化時 , 調(diào)用此方法 , 執(zhí)行初始化操作
  • destory()
  • 銷毀方法, 在Filter被銷毀之前調(diào)用 , 執(zhí)行善后操作
  • doFilter(ServletRequest request , ServletResponse response , FilterChain chain)
  • 核心方法 ,在存活期間 , 過濾器攔截到對資源的訪問 會造成此方法的執(zhí)行 , 需要在這個方法中設計過濾器的核心邏輯代碼
  • 配置過濾器

    <filter> -- 配置一個過濾器<filter-name>FirstFilter</filter-name> -- 過濾器的名字<filter-class>com.tarena.filter.FirstFilter</filter-class> -- 過濾器的類 </filter> <filter-mapping> -- 過濾器的攔截路徑配置,可以配置多個<filter-name>FirstFilter</filter-name> -- 為哪個名字的過濾器配置<url-pattern>/*</url-pattern> -- 攔截哪個路徑資源可以配置多個<servlet-name>XxxServlet</servlet-name> -- 攔截哪個名字的Servlet<dispatcher></dispatcher> -- 指定過濾器攔截哪種方式對資源的訪問,可以取值為REQUEST FORWARD INCLUDE ERROR,如果不配置,默認只攔截REQUEST方式的訪問。可以配置多個。 </filter-mapping>
  • 三、生命周期

  • 在web應用啟動時 , 會創(chuàng)建處web應用中配置的過濾器對象 , 創(chuàng)建出過濾器對象會立即調(diào)用init方法進行初始化操作 , 之后一直存活 , 直到web應用被銷毀時 , Filter跟著被銷毀.在銷毀之前會自動調(diào)用destory方法執(zhí)行善后操作 。 在存活期間 , 每當攔截到資源訪問 , 就執(zhí)行doFilter方法 , 來執(zhí)行過濾器的 邏輯 , 如果不做操作 , 則 默認攔截 , 可以通過FilterChain類的對象的 doFilter方法實現(xiàn)對資源訪問的放行 。 并且可以在doFilter前后做一些操作 。
  • 四、 細節(jié)

  • 如果一個資源被多個過濾器攔截 , 多個 攔截器的攔截順序取決于在web.xml文件中配置過濾器時的先后順序 。
  • 多個 過濾器的執(zhí)行 , 類似于方法 一層一層調(diào)用的過程 ,, 一層一層往里鉆, 然后在一層層一層往外出 。
  • 五、 和Filter開發(fā)相關(guān)的對象

  • FilterConfig:

  • init方法的參數(shù)
  • 代表FIlter在web.xml文件中的配置對象
  • 可以用來獲取Filter在Web.xml文件中的初始化配置參數(shù)
  • 可以用來獲取ServletContext對象

    public void init(FilterConfig filterConfig) throws ServletException {System.out.println("init....");//1.filterConfig功能1:獲取filter的初始化參數(shù)Enumeration<String> names = filterConfig.getInitParameterNames();while(names.hasMoreElements()){String name = names.nextElement();String value = filterConfig.getInitParameter(name);System.out.println(name+"~"+value);}//2.獲取ServletContext對象ServletContext sc = filterConfig.getServletContext();}
  • FilterChain:
  • doFilter方法參數(shù)
  • 代表過濾器鏈
  • 提供了doFilter方法 ,放行當前過濾器 , 執(zhí)行后續(xù)過濾器 , 如果后續(xù)沒有過濾器則調(diào)用到相應的資源 。
  • 六、Filter案例

  • 全站亂碼解決過濾器

  • 在web開發(fā)過程中 , 存在請求參數(shù)亂碼和響應輸出亂碼 。
  • 之前的開發(fā)中 , 在所有的Servlet和jsp頁面中 , 需要手動解決這兩種亂碼
  • 可以通過開發(fā)過濾器攔截所有的資源訪問 , 在過濾器中解決全站亂碼問題 。
  • 具體解決請求響應亂碼問題:

    1. 在web.xml文件 中配置全局的編碼類型 <!-- 全局配置 --> <context-param><param-name>encode</param-name><param-value>utf-8</param-value> </context-param> 2. 在過濾器初始化時獲取全局配置的編碼 , 并保存到過濾器中 private String encode = null; public void init(FilterConfig config) throws ServletException {encode = (String) config.getServletContext().getAttribute("encode"); }3. 解決響應亂碼: 在doFilter方法中 response.setCharacterEncoding(encode); response.setContentType("text/html;charset="+encode); 4. 解決請求參數(shù)亂碼//方案一: // request.setCharacterEncoding(encode); //只能解決Post請求參數(shù)的亂碼//可以解決Post和Get請求類型的參數(shù)亂碼//但是在轉(zhuǎn)碼的時候需要指定具體的參數(shù)名稱 ,轉(zhuǎn)碼之后要重新放入request中供servlet拿取更是不能實現(xiàn) , 所以 不可行 // String param = new String(request.getParameter("xxxx").getBytes("iso-8859-1") , encode);//方案二://request中的請求參數(shù)本身無法改變 //那么 換一個思路 想辦法改造和獲取請求參數(shù)相關(guān)的方法 在方法內(nèi)加上解決亂碼的代碼 //這樣通過這些方法獲取請求參數(shù)時 解決好亂碼再返回 用起來就感覺 亂碼被解決了一樣//改造原有request方法方案一: //繼承//繼承只能先改造在創(chuàng)建實例 , 但是現(xiàn)在已經(jīng)有了request對象, 就算通過繼承改造了ServletRequest類也不會影響到已有的對象 , 排除//改造原有request方法方案二://裝飾設計模式//1. 新建一個類 , 實現(xiàn)與被改造對象相同的接口//2. 通過狗仔方法傳入被改造的對象并保存在本類中//3. 然后實現(xiàn)接口中所有的方法 , 如果需要改造則在對應的方法里寫出邏輯 , 如果不需要改造的方法 ,則直接通過傳入的沒被改造的參數(shù)對象調(diào)用原有的方法即可//這種方案 的缺點 ,如果被改造的方法 中方法過多時 ,這個操作會十分繁瑣 。//改造原有的request對象方案三://在裝飾設計模式的基礎上實現(xiàn)//通過源碼 發(fā)現(xiàn)Servlet包下已經(jīng)提供了一個ServletRequestWrapper類 , 它實現(xiàn)了與ServletRequest相同的接口//也就是說他就是java中已經(jīng)提供的供開發(fā)者修改request對象中方法的入口//新建一個類繼承ServletRequestWrapper類之后 ,通過構(gòu)造方法 把原始對象傳進去 , 然后只重寫需要改造的方法即可代碼//public class EncodeFilter implements Filter{/*** 當前web應用編碼集*/private String encode = null;/*** 初始化方法*/public void init(FilterConfig filterConfig) throws ServletException {//獲取ServletContext對象ServletContext sc = filterConfig.getServletContext();//讀取初始化參數(shù) 中的 編碼集 配置this.encode = sc.getInitParameter("encode");}/*** 過濾方法*/public void doFilter(final ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {//--全站響應亂碼response.setCharacterEncoding(encode);response.setContentType("text/html;charset="+encode);//--全站請求亂碼 - 通過裝飾器 裝飾request 修改其中的和獲取請求參數(shù)相關(guān)的方法 增加了亂碼解決的代碼ServletRequest myReq = new MyServletRequest((HttpServletRequest) request);//放行資源chain.doFilter(myReq, response);}/*** 銷毀方法*/public void destroy() {}/*** 內(nèi)部類 ServletRequest的裝飾類 改造了獲取請求參數(shù)相關(guān)的方法 增加了亂碼解決的代碼*///繼承了HttpServletRequestWrapper ,這個父類本身就是 HttpServletRequest的裝飾器 在其中提供方法的默認的實現(xiàn) 不想改造的方法 不用管 想改造的方法 覆蓋父類方法即可class MyServletRequest extends HttpServletRequestWrapper{private ServletRequest request = null;private boolean hasNotEncode = true;//構(gòu)造器 接受傳入的request保存在類的內(nèi)部public MyServletRequest(HttpServletRequest request) {super(request);this.request = request;}//覆蓋和獲取請求參數(shù)相關(guān)的方法@Overridepublic Map<String,String[]> getParameterMap() {try {//1.獲取真正request的請求參數(shù)組成的mapMap<String,String[]> map = request.getParameterMap();if(hasNotEncode){//由于真正的request對此map會緩存 所以解決亂碼的操作 只需要做一次 此處通過hasNotEncode來控制//2.遍歷mapfor(Map.Entry<String, String[]>entry : map.entrySet()){//3.獲取當前遍歷到的值的數(shù)組String [] values = entry.getValue();//4.遍歷值的數(shù)組 for(int i = 0;i<values.length;i++){//5.解決亂碼 存回數(shù)組values[i] = new String(values[i].getBytes("iso8859-1"),encode);}}hasNotEncode = false;}//6.返回解決完亂碼的mapreturn map;} catch (Exception e) {e.printStackTrace();throw new RuntimeException(e);}}
  • 用戶30天內(nèi)自動登錄

  • 在處理用戶登錄時 , 判斷用戶是否勾選30天內(nèi)自動登錄 , 如果用戶名密碼正確且勾選過該選項 , 則發(fā)送cookie , 將用戶名密碼保存30天。 為了安全起見 , 保存之前先對密碼進行MD5加密
  • 之后用戶在來訪問時經(jīng)過自動登錄過濾器被攔截 , 如果用戶未登錄 , 且?guī)Я俗詣拥卿浀腸ookie , 并且其中的用戶名密碼都正確 , 則給給用戶給自動登錄 。但是無論自動登錄與否都要對url放行 。
  • 在LoginServlet中添加用戶自動登錄邏輯: 如果用戶勾選 了自動登錄 , 則將用戶信息添加進cookie中保存在本地
  • 在AutoLoginFilter中 攔截所有請求 , 先判斷是否登錄 , 在判斷是否有自動登錄cookie ,最后判斷用戶密碼是否正確
  • 自動登錄過濾器源碼

    public class AutoLoginFilter implements Filter{public void destroy() {}public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request; // 1. 判斷該用戶是否 已經(jīng)登錄if(req.getSession(false) == null ||req.getSession(false).getAttribute("user") == null){System.out.println("用戶未登錄"); // 2. 判斷訪問時是否帶有自動登錄cookieCookie[] cookies = req.getCookies();for(Cookie c :cookies){if("autologin".equals(c.getName())){System.out.println("帶有自動登錄cookie");String v = c.getValue();String[] vs = URLDecoder.decode(v , "utf-8").split("#");UserService us = BaseFactory.getBase().getInstance(UserService.class); // 3. 驗證用戶名密碼是否正確User user = us.login(vs[0], vs[1]);if(user != null){System.out.println("開始登錄");//三個條件都滿足 , 添加登錄標記req.getSession().setAttribute("user", user);System.out.println("自動登錄成功");}break;}}} // 4. 無論是否自動 登錄成功 , 都放行訪問。 放行訪問chain.doFilter(request , response);}public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}
  • 七、MD5加密算法

  • 又稱數(shù)據(jù)摘要算法 , 數(shù)據(jù)指紋算法
  • 任意長度的二進制文件計算出128位二進制的再要信息 , 通常轉(zhuǎn)換為32位16進制顯示 。
  • 明文相同算出的密文一定相同
  • 明文不同算出的密文一定不同 (概率極低 , 所以一般認為是唯一的)
  • 只能由明文算成密文 ,, 不能有密文算成明文
  • 應用:
  • 加密存儲數(shù)據(jù)
  • 文件完整性校驗
  • 數(shù)字簽名
  • 總結(jié)

    以上是生活随笔為你收集整理的大数据WEB阶段(十五)JavaEE三大核心技术之过滤器的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 97人妻精品视频一区 | 免费三片在线观看网站v888 | 人人爽久久涩噜噜噜网站 | 第一色综合 | 天堂精品| 清纯唯美亚洲激情 | 国产一区二区在线免费观看 | 久久久久久久9999 | 国产在线观看不卡 | 黄瓜视频在线免费观看 | 日韩精品中文字幕一区二区三区 | 国产农村熟妇videos | 一本久久精品一区二区 | 嫩草视频在线 | 青青在线视频 | 久久综合激的五月天 | 欧美性做爰毛片 | 影音先锋黑人 | 午夜国产小视频 | 麻豆网站在线免费观看 | 国产精品一区二区三区不卡 | 日韩 欧美 精品 | 国产蜜臀在线 | 91爱爱网 | 亚洲色图在线视频 | 国产在线无码精品 | 伦理片av| 国产传媒欧美日韩 | 国产丝袜久久 | 中文字幕国产在线观看 | 97人妻人人澡人人爽人人精品 | 久久av无码精品人妻出轨 | 欧美福利视频 | 中文字幕一二三 | 欧美999 | 日韩插插插 | 动漫裸体无遮挡 | 性av在线 | 丰满人妻一区二区三区免费视频棣 | caopeng在线视频 | 不卡一区二区在线观看 | 91麻豆精品久久久久蜜臀 | 男女爽爽视频 | 国产男男gay网站 | 国产精品一区三区 | 特大黑人巨人吊xxxx | 美女啪啪国产 | 欧美成人一二三区 | 性饥渴的农村熟妇 | 大陆一级片 | www.狠狠干 | 老牛影视一区二区三区 | 中文字幕av片 | 国产做爰xxxⅹ久久久精华液 | 国产精品一区不卡 | 午夜电影在线播放 | 特黄特色大片bbbb | 琪琪伦伦影院理论片 | 奇米成人网 | 国产精品久久久久久久久久久久 | 仙踪林久久久久久久999 | 天天插天天 | 99精品偷自拍 | 国产欧美精品在线观看 | 久久久久无码国产精品一区 | 国产呦小j女精品视频 | 4438x五月天 日吊视频 | 成人在线观看免费爱爱 | 久久99深爱久久99精品 | 91国产高清| www.奇米 | 亚洲欧美成人一区 | 一区二区三区视频在线 | 强伦轩人妻一区二区电影 | 久久精品免费一区二区 | 久久免费资源 | 天天弄天天干 | 色婷婷香蕉在线一区二区 | 不卡中文 | 虫族全黄h全肉污文 | 天天操夜夜操狠狠操 | h片在线观看 | 国产老头老太作爱视频 | 一道本久久 | 999精品| 高级毛片| 免费看日产一区二区三区 | 朋友人妻少妇精品系列 | 欧美在线| 国产日韩一区 | 国产高清精品软件丝瓜软件 | 中文字幕视频一区二区 | 拍摄av现场失控高潮数次 | 亚洲视频中文字幕在线观看 | 男人肌肌桶女人肌肌 | 手机看片福利在线 | 成人免费在线观看 | 中文字幕系列 | 超碰丝袜|