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

如圖中所示,
①當網頁傳輸一些垃圾資訊時,在web伺服器向後天的servlet發送請求的中間加一個過濾器,就可以減少servlet處理的壓力。
②當我們在servlet中需要個前台顯示資料庫的資訊時,将中文放在域中傳給前台時,前台在解析的時候,就會發生亂碼的問題,之前的解決方法時,每次在建立一個servlet的時候,首先就是設定編碼,防止亂碼。但是,當很多的servlet需要編解碼的話,就可以在進入servlet之前先進入過濾器,解決亂碼的問題
//從tomcat傳過來的資料進行解碼
request.setCharacterEncoding("utf-8");
//給浏覽器的一個響應,讓浏覽器用utf-8進行解碼
response.setContentType("test/html;charset=utf-8");
2.構成過濾器的步驟:
亂碼過濾器的實作:
- 導包(maven中導入,jsp,servlet,jstl,standard,mysql)
- 建立一個過濾器實作filter接口
編寫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 { } }
- 當value設定為/servlet/**時或者在filtermap中配置為 /servlet/*,表示所有servlet配的路徑為 /servlet/*都要走過濾器。
- chain保證了請求和響應都會走過過濾器
- 過濾器的和web伺服器(tomcat)同生共死,即就是,當tomcat伺服器關閉時,會執行destory的方法,當tomcat伺服器開啟時,會執行init的方法中的代碼。
案例示範:
需求,模拟一個登入頁面,設定登入正确的使用者名,當登入正确後跳轉到一個登陸成功的頁面,并且給登入頁面添加一個過濾器,結局中文亂碼和防止非正常通路登入成功頁面。
-
建立一個登入頁面
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>
-
寫一個登入的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); } }
-
寫一個解決中文亂碼的過濾器
/ccodefilter
web.xml@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 { } }
<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>
-
寫一個登入成功的頁面
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>
- 建立一個防止非正常登入成功頁面的過濾器
@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>
-
建立一個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); } }