天天看點

javaweb學習之filter過濾器過濾器(filter)的學習

過濾器(filter)的學習

1.作用:
javaweb學習之filter過濾器過濾器(filter)的學習

如圖中所示,

①當網頁傳輸一些垃圾資訊時,在web伺服器向後天的servlet發送請求的中間加一個過濾器,就可以減少servlet處理的壓力。

②當我們在servlet中需要個前台顯示資料庫的資訊時,将中文放在域中傳給前台時,前台在解析的時候,就會發生亂碼的問題,之前的解決方法時,每次在建立一個servlet的時候,首先就是設定編碼,防止亂碼。但是,當很多的servlet需要編解碼的話,就可以在進入servlet之前先進入過濾器,解決亂碼的問題

//從tomcat傳過來的資料進行解碼
request.setCharacterEncoding("utf-8");
//給浏覽器的一個響應,讓浏覽器用utf-8進行解碼
response.setContentType("test/html;charset=utf-8");
           
2.構成過濾器的步驟:

亂碼過濾器的實作:

  1. 導包(maven中導入,jsp,servlet,jstl,standard,mysql)
  2. 建立一個過濾器實作filter接口
    import javax.servlet.*;//導包注意
    import javax.servlet.annotation.WebFilter;
    import java.io.IOException;
    //當value設定為/servlet/*時,表示所有servlet配的路徑為/*都要走過濾器
    @WebFilter(filterName = "demoFilter",value = "/filter")
    public class demoFilter implements Filter {
        public void destroy() {
        }
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            //進行中文亂碼的code
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            //   鍊 控制放流的作用,如果沒有cahin那麼代碼就會停止在這裡
            chain.doFilter(req, resp);
        }
        public void init(FilterConfig config) throws ServletException {
        }
    }
               
    編寫filter的小結:
    1. 當value設定為/servlet/**時或者在filtermap中配置為 /servlet/*,表示所有servlet配的路徑為 /servlet/*都要走過濾器。
    2. chain保證了請求和響應都會走過過濾器
    3. 過濾器的和web伺服器(tomcat)同生共死,即就是,當tomcat伺服器關閉時,會執行destory的方法,當tomcat伺服器開啟時,會執行init的方法中的代碼。

案例示範:

需求,模拟一個登入頁面,設定登入正确的使用者名,當登入正确後跳轉到一個登陸成功的頁面,并且給登入頁面添加一個過濾器,結局中文亂碼和防止非正常通路登入成功頁面。

  1. 建立一個登入頁面

    login.jsp

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <form action="/login.do" method="post">
        <input type="text" name="username"/>
        <input type="submit" value="送出"/>
    </form>
    </body>
    </html>
               
  2. 寫一個登入的servlet

    /login.do

    @WebServlet(name = "loginServlet",value = "/login.do")
    public class loginServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            String username = request.getParameter("username");
            //如果使用者輸入的username是admin
            if (username.equalsIgnoreCase("admin")){
                //将sessionid放在裡面,好讓過濾器判斷是否為空
                request.getSession().setAttribute("sessionid",request.getSession().getId());
                //放在session域中的東西,内部轉發和重定向都可以擷取到
                response.sendRedirect("/sys/success.jsp");
            }else {
                //如果使用者輸入username不是admin
                request.getRequestDispatcher("login.jsp").forward(request,response);
            }
        }
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }
               
  3. 寫一個解決中文亂碼的過濾器

    /ccodefilter

    @WebFilter(filterName = "CcodeFilter")
    public class CcodeFilter implements Filter {
        public void destroy() {
        }
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            req.setCharacterEncoding("utf-8");
            resp.setContentType("text/html;charset=utf-8");
            chain.doFilter(req, resp);
        }
        public void init(FilterConfig config) throws ServletException {
    
        }
    }
               
    web.xml
    <filter>
        <filter-name>ccodefilter</filter-name>
        <filter-class>com.g.filter.CcodeFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>ccodefilter</filter-name>
        <servlet-name>loginServlet</servlet-name>
    </filter-mapping>
               
  4. 寫一個登入成功的頁面

    success.jsp放在sys的檔案下面

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>Title</title>
    </head>
    <body>
    <h1>登入成功</h1>
    <a href="/logout.do" target="_blank" rel="external nofollow" >退出</a>
    </body>
    </html>
               
  5. 建立一個防止非正常登入成功頁面的過濾器
    @WebFilter(filterName = "jspFilter")
    public class jspFilter implements Filter {
        public void destroy() {
        }
        public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
            //使用多态
            HttpServletRequest request= (HttpServletRequest) req;
            HttpServletResponse response= (HttpServletResponse) resp;
            Object sessionid = request.getSession().getAttribute("sessionid");
            //判斷存放在session域中的資料是否為空
            chain.doFilter(req, resp);
            if (sessionid == null) {
                //直接跳轉到登入頁面
               //req.getRequestDispatcher("/logout.do").forward(request,response);
                resp.setContentType("text/html;charset=utf-8");
                //三秒提醒後跳轉到登入頁面
                response.getWriter().write("非正常登入正在跳轉到登入頁面");
                response.setHeader("refresh","3;url=/logout.do");
            }
            request.getSession().removeAttribute("sessionid");
        }
        public void init(FilterConfig config) throws ServletException {
    
        }
    }
               
    <filter>
    <filter-name>jspfilter</filter-name>
    <filter-class>com.g.filter.jspFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>jspfilter</filter-name>
    <url-pattern>/sys/*</url-pattern>
    </filter-mapping>
               
  6. 建立一個servlet用來退出

    /logout.do servlet

    @WebServlet(name = "logoutServlet",value = "/logout.do")
    public class logoutServlet extends HttpServlet {
        protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            System.out.println(request.getSession().getAttribute("sessionid"));
            request.getRequestDispatcher("login.jsp").forward(request,response);
        }
        protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            this.doPost(request, response);
        }
    }