1. 程式人生 > >Servlet-Web過濾器詳解

Servlet-Web過濾器詳解

一、Web過濾器工作原理

使用者傳送請求-----》過濾器判斷請求是否合法-----》(合法)訪問伺服器資源                                                                           -----》(不合法)請求重定向或轉發到其它頁面
過濾器的判斷在doFilter方法中進行(3個引數)     1.發給伺服器的請求       2.伺服器的響應      3.過濾器鏈(用於呼叫doFilter(arg1,arg2)放行訪問伺服器)
多個過濾器:過濾器1放行前方法(執行請求重定向到過濾器2的url的程式碼
)-----》過濾器2放行前方法(filterChain.doFilter()前)------》伺服器響應-----》過濾器1放行後方法執行請求重定向到過濾器2的url後的程式碼-----》過濾器2放行後方法(filterChain.doFilter()後)    
註解配置: 例項化Filter介面 @WebFilter中配置過濾器名、需要過濾的url地址、初始化過濾器所需要的字符集
  1. @WebFilter(filterName ="LoginFilter",urlPatterns ={"*"},initParams ={@WebInitParam(name ="EXCLUDED_PAGES"
    , value ="login.jsp,/servlet/LoginServlet,/servlet/LogoutServlet,failure.jsp")})
  2. publicclassLoginFilterimplementsFilter{
  3. FilterConfig filterConfig;
  4. @Override
  5. publicvoid init(FilterConfig filterConfig)throwsServletException{
  6. this.filterConfig = filterConfig;
  7. }
  8. //攔截頁面
  9. @Override
  10. publicvoid doFilter(ServletRequest servletRequest
    ,ServletResponse servletResponse,FilterChain filterChain)throwsIOException,ServletException{
  11. HttpServletRequest request =(HttpServletRequest) servletRequest;
  12. request.setCharacterEncoding("utf-8");
  13. HttpSession session = request.getSession();
  14. String excludedPage = filterConfig.getInitParameter("EXCLUDED_PAGES");
  15. if(excludedPage!=null){
  16. String[] strArrays = excludedPage.split(",");
  17. for(int i=0;i<strArrays.length;i++){
  18. //System.out.println(strArrays[i]);
  19. //System.out.println(((HttpServletRequest) servletRequest).getRequestURI());
  20. if(strArrays[i]==null||"".equals(strArrays[i]))continue;
  21. if(((HttpServletRequest) servletRequest).getRequestURI().indexOf(strArrays[i])!=-1){//url裡包含關鍵字則放行
  22. filterChain.doFilter(servletRequest,servletResponse);
  23. return;
  24. }
  25. }
  26. }
  27. if(session.getAttribute("username")!=null){//session中有值,正確登入----》放行
  28. filterChain.doFilter(servletRequest,servletResponse);
  29. }else{//session中沒有值,非法登陸----》返回登陸頁面
  30. ((HttpServletResponse)servletResponse).sendRedirect("/login.jsp");
  31. }
  32. }
  33. @Override
  34. publicvoid destroy(){
  35. }
  36. }

二、Web過濾器生命週期

例項化-------》web.xml載入 初始化-------》init() 過濾-------》doFilter() 銷燬--------》destroy()

三、過濾器分類

Qequest-----》直接訪問頁面時使用----》進入doFilter方法 Error----》伺服器資源異常時使用----》進入doFilter方法 Forward------》使用request.getRequestDispatcher("path").forward(arg1,arg2)時使用(請求轉發)----》進入doFilter方法 Include-----》使用request.getRequestDispatcher("path").include(arg1,arg2)時使用(請求轉發)----》進入doFilter方法 Async----》目標資源非同步處理時使用----》進入doFilter方法