大数据WEB阶段(十五)JavaEE三大核心技术之过滤器
生活随笔
收集整理的這篇文章主要介紹了
大数据WEB阶段(十五)JavaEE三大核心技术之过滤器
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Filter過濾器
一、Filter 過濾器概述
二、 過濾器的開發
配置過濾器
<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>三、生命周期
四、 細節
五、 和Filter開發相關的對象
FilterConfig:
可以用來獲取ServletContext對象
public void init(FilterConfig filterConfig) throws ServletException {System.out.println("init....");//1.filterConfig功能1:獲取filter的初始化參數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();}六、Filter案例
全站亂碼解決過濾器
具體解決請求響應亂碼問題:
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. 解決請求參數亂碼//方案一: // request.setCharacterEncoding(encode); //只能解決Post請求參數的亂碼//可以解決Post和Get請求類型的參數亂碼//但是在轉碼的時候需要指定具體的參數名稱 ,轉碼之后要重新放入request中供servlet拿取更是不能實現 , 所以 不可行 // String param = new String(request.getParameter("xxxx").getBytes("iso-8859-1") , encode);//方案二://request中的請求參數本身無法改變 //那么 換一個思路 想辦法改造和獲取請求參數相關的方法 在方法內加上解決亂碼的代碼 //這樣通過這些方法獲取請求參數時 解決好亂碼再返回 用起來就感覺 亂碼被解決了一樣//改造原有request方法方案一: //繼承//繼承只能先改造在創建實例 , 但是現在已經有了request對象, 就算通過繼承改造了ServletRequest類也不會影響到已有的對象 , 排除//改造原有request方法方案二://裝飾設計模式//1. 新建一個類 , 實現與被改造對象相同的接口//2. 通過狗仔方法傳入被改造的對象并保存在本類中//3. 然后實現接口中所有的方法 , 如果需要改造則在對應的方法里寫出邏輯 , 如果不需要改造的方法 ,則直接通過傳入的沒被改造的參數對象調用原有的方法即可//這種方案 的缺點 ,如果被改造的方法 中方法過多時 ,這個操作會十分繁瑣 。//改造原有的request對象方案三://在裝飾設計模式的基礎上實現//通過源碼 發現Servlet包下已經提供了一個ServletRequestWrapper類 , 它實現了與ServletRequest相同的接口//也就是說他就是java中已經提供的供開發者修改request對象中方法的入口//新建一個類繼承ServletRequestWrapper類之后 ,通過構造方法 把原始對象傳進去 , 然后只重寫需要改造的方法即可代碼//public class EncodeFilter implements Filter{/*** 當前web應用編碼集*/private String encode = null;/*** 初始化方法*/public void init(FilterConfig filterConfig) throws ServletException {//獲取ServletContext對象ServletContext sc = filterConfig.getServletContext();//讀取初始化參數 中的 編碼集 配置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 修改其中的和獲取請求參數相關的方法 增加了亂碼解決的代碼ServletRequest myReq = new MyServletRequest((HttpServletRequest) request);//放行資源chain.doFilter(myReq, response);}/*** 銷毀方法*/public void destroy() {}/*** 內部類 ServletRequest的裝飾類 改造了獲取請求參數相關的方法 增加了亂碼解決的代碼*///繼承了HttpServletRequestWrapper ,這個父類本身就是 HttpServletRequest的裝飾器 在其中提供方法的默認的實現 不想改造的方法 不用管 想改造的方法 覆蓋父類方法即可class MyServletRequest extends HttpServletRequestWrapper{private ServletRequest request = null;private boolean hasNotEncode = true;//構造器 接受傳入的request保存在類的內部public MyServletRequest(HttpServletRequest request) {super(request);this.request = request;}//覆蓋和獲取請求參數相關的方法@Overridepublic Map<String,String[]> getParameterMap() {try {//1.獲取真正request的請求參數組成的mapMap<String,String[]> map = request.getParameterMap();if(hasNotEncode){//由于真正的request對此map會緩存 所以解決亂碼的操作 只需要做一次 此處通過hasNotEncode來控制//2.遍歷mapfor(Map.Entry<String, String[]>entry : map.entrySet()){//3.獲取當前遍歷到的值的數組String [] values = entry.getValue();//4.遍歷值的數組 for(int i = 0;i<values.length;i++){//5.解決亂碼 存回數組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天內自動登錄
自動登錄過濾器源碼
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. 判斷該用戶是否 已經登錄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加密算法
總結
以上是生活随笔為你收集整理的大数据WEB阶段(十五)JavaEE三大核心技术之过滤器的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大数据WEB阶段(十四)JavaEE开发
- 下一篇: 大数据WEB阶段(十六)JavaEE三大