Servlet過濾器Fileter是一個小型的web組件,它們經過攔截請求和響應,以便查看、提取或以某種方式操做客戶端和服務器之間交換的數據,實現「過濾」的功能。Filter一般封裝了一些功能的web組件,過濾器提供了一種面向對象的模塊化機制,將任務封裝到一個可插入的組件中, Filter組件經過配置文件來聲明,並動態的代理。html
過濾器是一個實現了 javax.servlet.Filter 接口的 Java 類。javax.servlet.Filter 接口定義了三個方法:java
序號 | 方法 | 描述 |
---|---|---|
1 | public void init(FilterConfig filterConfig) | web 應用程序啓動時,web 服務器將建立Filter 的實例對象,並調用其init方法,讀取web.xml配置,完成對象的初始化功能,從而爲後續的用戶請求做好攔截的準備工做(filter對象只會建立一次,init方法也只會執行一次)。開發人員經過init方法的參數,可得到表明當前filter配置信息的FilterConfig對象。 |
2 | public void doFilter (ServletRequest, ServletResponse, FilterChain) | 該方法完成實際的過濾操做,當客戶端請求方法與過濾器設置匹配的URL時,Servlet容器將先調用過濾器的doFilter方法。FilterChain用戶訪問後續過濾器。 |
3 | public void destroy() | Servlet容器在銷燬過濾器實例前調用該方法,在該方法中釋放Servlet過濾器佔用的資源。 |
寫一個servlet屏蔽負面評論。web
一、在web.xml中配置好servlet和filter瀏覽器
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <filter> <filter-name>hello</filter-name> <filter-class>filter.CommentFilter</filter-class> </filter> <filter-mapping> <filter-name>hello</filter-name> <url-pattern>/comment</url-pattern> </filter-mapping> <servlet> <servlet-name>h</servlet-name> <servlet-class>web.CommentServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>h</servlet-name> <url-pattern>/comment</url-pattern> </servlet-mapping> </web-app>
二、在src/main/java下新建一個包,名爲web;而且在web包下面新建一個類,名爲CommentServlet;服務器
package web; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CommentServlet extends HttpServlet { public void service(HttpServletRequest request, HttpServletResponse response) throws IOException { request.setCharacterEncoding("UTF-8"); response.setContentType("text/html;charset=utf8"); PrintWriter out = response.getWriter(); String str = request.getParameter("comment"); out.println("<h1>您發表的評論內容爲:" + str + "</h1>"); out.close(); } }
三、在src/main/java下新建一個包,名爲filter;而且在filter包下面新建一個類,名爲CommentFilterapp
package filter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class CommentFilter implements Filter { private String illegalWord; public void init(FilterConfig filterConfig) throws ServletException { illegalWord = filterConfig.getInitParameter("illegalWord"); System.out.println("過濾器Filter已經開始運行......" + illegalWord); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); PrintWriter out = resp.getWriter(); String comment = req.getParameter("comment"); System.out.println(comment); if (comment.indexOf("dam") == -1) { out.println("<h1>以隱藏該評論</h1>"); } else { chain.doFilter(req, resp); } } public void destroy() { System.out.println(); } }
四、在src/main/webapp下面新建一個JSP文件,名爲comment.jsp;webapp
<%@ page language="java" contentType="text/html; charset=utf8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">; <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf8"> <title>Insert title here</title> </head> <body> <form action="comment" method="post"> <fieldset> <legend>評論</legend> 請輸入評論:<textarea name="comment" style="vertical-align:middle;width:140px;height:55px;"></textarea><br> <input type="submit" value="發表評論"> </fieldset> </form> </body> </html>
一、在瀏覽器中輸入http://localhost:8089/servlet-test55-filter/comment.jsp ,界面以下:jsp
二、在評論框中輸入不含有「dam」的字符串,ide
點擊「發表評論」時,返回結果爲模塊化
三、在評論框中輸入含有「dam」的字符串,
點擊「發表評論」,返回的結果爲: