filter 作用
過濾器
filter用于攔截用戶請求,在服務(wù)器作出響應(yīng)前,可以在攔截后修改request和response,這樣實(shí)現(xiàn)很多開發(fā)者想得到的功能。
filter是一個(gè)可以復(fù)用的代碼片段,可以用來轉(zhuǎn)換HTTP請求、響應(yīng)和頭信息。Filter不像Servlet,它不能產(chǎn)生一個(gè)請求或者響應(yīng),它只是修改對某一資源的請求,或者修改從某一的響應(yīng)。
常見用法
處理全站中文亂碼問題
實(shí)現(xiàn)自動(dòng)登錄
過濾敏感詞匯
壓縮網(wǎng)頁
選擇性讓瀏覽器緩存
這幾種功能的實(shí)現(xiàn)采用同樣的原理,那就是使用包裝模式或動(dòng)態(tài)代理增強(qiáng)request或response對象的功能。
Servlet和filter的區(qū)別
1,servlet 流程是短的,url傳來之后,就對其進(jìn)行處理,之后返回或轉(zhuǎn)向到某一自己指定的頁面。它主要用來在 業(yè)務(wù)處理之前進(jìn)行控制.
2,filter 流程是線性的, url傳來之后,檢查之后,可保持原來的流程繼續(xù)向下執(zhí)行,被下一個(gè)filter, servlet接收等,而servlet 處理之后,不會(huì)繼續(xù)向下傳遞。filter功能可用來保持流程繼續(xù)按照原來的方式進(jìn)行下去,或者主導(dǎo)流程,而servlet的功能主要用來主導(dǎo)流程。
filter可用來進(jìn)行字符編碼的過濾,檢測用戶是否登陸的過濾,禁止頁面緩存等。
demo演示
步驟一:新建comment.jsp頁面
- <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
- <html>
- <head>
- <title>評(píng)論</title>
- </head>
- <body>
- <form action="comment" method="post">
- <fieldset>
- <legend>評(píng)論</legend>
- 請輸入評(píng)論:<textarea name="comment"
- style="vertical-align:middle;
- width:140px;height:55px"></textarea><Br>
- <input type="submit" value="發(fā)表評(píng)論" />
- </fieldset>
- </form>
- </body>
- </html>
步驟二:新建CommentServlet.java文件
- package web;
- import java.io.IOException;
- import java.io.PrintWriter;
- import javax.servlet.ServletException;
- 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 ServletException, IOException {
- request.setCharacterEncoding("UTF-8");
- response.setContentType("text/html;charset=UTF-8");
- PrintWriter out = response.getWriter();
- //獲取評(píng)論內(nèi)容
- String str = request.getParameter("comment");
- //顯示評(píng)論內(nèi)容
- out.println("<h3>評(píng)論內(nèi)容:" + str + "</h3>");
- out.close();
- }
- }
步驟三:新建CommentFilter類
- package web;
- 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 CommentFilter1 implements Filter{
- private String illegalWord;
- /**
- * 容器刪除過濾器實(shí)例之前調(diào)用,只執(zhí)行一次
- */
- public void destroy() {
- }
- /**
- * 用于處理請求的主要方法
- */
- 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");
- if(comment.indexOf("damn")!=-1){
- //有敏感詞匯
- out.print("<h3>評(píng)論內(nèi)容已關(guān)閉</h3>");
- }else{
- //沒有敏感詞匯則向后處理,交給其他過濾器或Servlet
- chain.doFilter(req, resp);
- }
- }
- /**
- * 容器啟動(dòng)之后,創(chuàng)建過濾器實(shí)例
- * 然后調(diào)用init方法,只會(huì)調(diào)用一次
- * 容器會(huì)將已經(jīng)創(chuàng)建好的FilterConfig對象作為參數(shù)傳入
- * 可以從該參數(shù)中獲取初始化的配置信息
- */
- public void init(FilterConfig filterConfig) throws ServletException {
- illegalWord = filterConfig.getInitParameter("illegalWord");
- System.out.println("Filter1:init is runnming... " + illegalWord);
- }
- }
步驟四:配置CommentFilter過濾器
web.xml文件代碼:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
- http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
- <display-name></display-name>
- <!-- 過濾器 -->
- <filter>
- <filter-name>filter1</filter-name>
- <filter-class>web.CommentFilter1</filter-class>
- </filter>
- <filter-mapping>
- <filter-name>filter1</filter-name>
- <url-pattern>/comment</url-pattern>
- </filter-mapping>
- <!-- Servlet -->
- <servlet>
- <servlet-name>CommentServlet</servlet-name>
- <servlet-class>web.CommentServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>CommentServlet</servlet-name>
- <url-pattern>/comment</url-pattern>
- </servlet-mapping>
- </web-app>
步驟五:部署應(yīng)用,輸入評(píng)論查看結(jié)果
總結(jié)
- 上一篇: 在win7下python的xlrd和xl
- 下一篇: springboot整合seata1.5