JavaEE之Filter过滤器、登录状态验证、敏感词汇过滤
生活随笔
收集整理的這篇文章主要介紹了
JavaEE之Filter过滤器、登录状态验证、敏感词汇过滤
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
Filter:過濾器
1. 概念:
生活中的過濾器:凈水器,空氣凈化器web中的過濾器:當訪問服務器的資源時,過濾器可以將請求攔截下來,完成一些特殊的功能。 過濾器的作用:一般用于完成通用的操作。如:登錄驗證、統一編碼處理、敏感字符過濾...2. 快速入門:
1. 步驟:
1. 定義一個類,實現接口Filter2. 復寫方法3. 配置攔截路徑1. web.xml2. 注解2. 代碼:
@WebFilter("/*")//訪問所有資源之前,都會執行該過濾器 public class FilterDemo1 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("filterDemo1被執行了....");//放行filterChain.doFilter(servletRequest,servletResponse);}@Overridepublic void destroy() {} }3. 過濾器細節:
1. web.xml配置
<filter><filter-name>demo1</filter-name><filter-class>cn.itcast.web.filter.FilterDemo1</filter-class></filter><filter-mapping><filter-name>demo1</filter-name><!-- 攔截路徑 --><url-pattern>/*</url-pattern></filter-mapping>2. 過濾器執行流程
1. 執行過濾器2. 執行放行后的資源3. 回來執行過濾器放行代碼下邊的代碼3. 過濾器生命周期方法
1. init:在服務器啟動后,會創建Filter對象,然后調用init方法。只執行一次。用于加載資源2. doFilter:每一次請求被攔截資源時,會執行。執行多次3. destroy:在服務器關閉后,Filter對象被銷毀。如果服務器是正常關閉,則會執行destroy方法。只執行一次。用于釋放資源 @WebFilter("/*") public class FilterDemo3 implements Filter {/*** 每一次請求被攔截資源時,會執行。執行多次* @param req* @param resp* @param chain* @throws ServletException* @throws IOException*/public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {System.out.println("doFilter....");chain.doFilter(req, resp);}/*** 在服務器啟動后,會創建Filter對象,然后調用init方法。只執行一次。用于加載資源* @param config* @throws ServletException*/public void init(FilterConfig config) throws ServletException {System.out.println("init....");}/*** 在服務器關閉后,Filter對象被銷毀。如果服務器是正常關閉,則會執行destroy方法。只執行一次。用于釋放資源*/public void destroy() {System.out.println("destroy....");}}啟動服務器時會自動執行init方法,并且只執行一次
啟動完服務器后,瀏覽器多次發起請求時,會執行doFilter方法
4. 過濾器配置詳解
攔截路徑配置:
1. 具體資源路徑: /index.jsp 只有訪問index.jsp資源時,過濾器才會被執行 2. 攔截目錄: /user/* 訪問/user下的所有資源時, 過濾器都會被執行 3. 后綴名攔截: *.jsp 訪問所有后綴名為jsp資源時,過濾器都會被執行 4. 攔截所有資源:/* 訪問所有資源時,過濾器都會被執行攔截方式配置:資源被訪問的方式
注解配置:設置dispatcherTypes屬性1. REQUEST:默認值。瀏覽器直接請求資源2. FORWARD:轉發訪問資源3. INCLUDE:包含訪問資源4. ERROR:錯誤跳轉資源5. ASYNC:異步訪問資源 //瀏覽器直接請求index.jsp資源時,該過濾器會被執行 @WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.REQUEST) //只有轉發訪問index.jsp時,該過濾器才會被執行 @WebFilter(value="/index.jsp",dispatcherTypes = DispatcherType.FORWARD) //瀏覽器直接請求index.jsp或者轉發訪問index.jsp。該過濾器才會被執行 @WebFilter(value="/*",dispatcherTypes ={ DispatcherType.FORWARD,DispatcherType.REQUEST}) web.xml配置設置<dispatcher></dispatcher>標簽即可5. 過濾器鏈(配置多個過濾器)
* 執行順序:如果有兩個過濾器:過濾器1和過濾器21. 過濾器12. 過濾器23. 資源執行4. 過濾器25. 過濾器1 * 過濾器先后順序問題:1. 注解配置:按照類名的字符串比較規則比較,值小的先執行* 如: AFilter 和 BFilter,AFilter就先執行了。2. web.xml配置: <filter-mapping>誰定義在上邊,誰先執行4. 案例:
案例1_登錄驗證
需求:1. 訪問day17_case案例的資源。驗證其是否登錄2. 如果登錄了,則直接放行。3. 如果沒有登錄,則跳轉到登錄頁面,提示"您尚未登錄,請先登錄"。 @WebFilter(filterName = "LoginFilter") public class LoginFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {//0. 強制轉換HttpServletRequest request = (HttpServletRequest) req;//1. 獲取資源請求路徑String uri = request.getRequestURI();//2. 判斷是否包含登陸相關資源路徑if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/js/") || uri.contains("/css/") || 1uri.contains("/fonts/") || uri.contains("/checkServlet")){// 包含,發起請求的是登陸界面,放行chain.doFilter(req,resp);}else{// 不包含,需要驗證用戶是否登錄//3. 從獲取session中獲取userObject user = request.getSession().getAttribute("user");if (user!=null){chain.doFilter(req,resp);}else {// 沒有登錄,跳轉登陸界面request.setAttribute("login_msg", "您未登錄,請登錄");request.getRequestDispatcher("/login.jsp").forward(request, resp);}}}public void init(FilterConfig config) throws ServletException {}public void destroy() {} }案例2_敏感詞匯過濾
需求:1. 對day17_case案例錄入的數據進行敏感詞匯過濾2. 敏感詞匯參考《敏感詞匯.txt》3. 如果是敏感詞匯,替換為 *** * 分析:1. 對request對象進行增強。增強獲取參數相關方法2. 放行。傳遞代理對象* 增強對象的功能:* 設計模式:一些通用的解決固定問題的方式1. 裝飾模式2. 代理模式* 概念:1. 真實對象:被代理的對象2. 代理對象:3. 代理模式:代理對象代理真實對象,達到增強真實對象功能的目的* 實現方式:1. 靜態代理:有一個類文件描述代理模式2. 動態代理:在內存中形成代理類* 實現步驟:1. 代理對象和真實對象實現相同的接口2. 代理對象 = Proxy.newProxyInstance();3. 使用代理對象調用方法。4. 增強方法* 增強方式:1. 增強參數列表2. 增強返回值類型3. 增強方法體執行邏輯 package cn.itcast.web.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.util.ArrayList; import java.util.List;@WebFilter("/SensitiveWordsFilter") public class SensitiveWordsFilter implements Filter {public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {// 創建代理對象,增強getParameter方法ServletRequest proxy_req = (ServletRequest) Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 增強個體Parameter方法// 判斷是否是getParameter方法if (method.getName().equals("getParameter")){// 增強返回值// 獲取返回值String value = (String) method.invoke(req, args);if (value!=null){for (String str:list){if (value.contains(str)){value = value.replaceAll(str, "****");}}}}return null;}});chain.doFilter(proxy_req, resp);}private List<String> list = new ArrayList<>();public void init(FilterConfig config) throws ServletException {try {// 加載文件ServletContext servletContext = config.getServletContext();String realPath = servletContext.getRealPath("WEB-INF/classes/敏感詞匯.txt");// 讀取文件BufferedReader br = new BufferedReader(new FileReader(realPath));// 將文件中的每一行數據加載到list中String line = null;while((line=br.readLine())!=null){list.add(line);}br.close();System.out.println(list);}catch (Exception e){System.out.println(e.getStackTrace());}}public void destroy() {} }總結
以上是生活随笔為你收集整理的JavaEE之Filter过滤器、登录状态验证、敏感词汇过滤的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: WinXP系统连接网络教程
- 下一篇: 基于Java计算器 科学计算器与标准计算