日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

重温java web过滤器filter

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 重温java web过滤器filter 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

點擊上方“好好學java”,選擇“置頂公眾號”

優秀學習資源、干貨第一時間送達!

?精彩內容?

java實戰練習項目教程

2018微服務資源springboot、springcloud、docker、dubbo實戰等傾心分享

2018年java架構師全套學習教程

最新大數據培訓完整視頻教程

2018年java最新全套培訓學習教程

1、Filter是什么?

Filter 技術是servlet 2.3 新增加的功能。Filter翻譯過來的意思就是過濾器,能對客戶端的消息進行預處理,然后將請求轉發給其它的web組件,可以對ServletHttpRequest和ServletHttpResponse進行修改和檢查。例如:在Filter中可以檢查用戶是否登錄,對未登錄的用戶跳轉到登陸界面。

2、過濾器快速入門

要定義一個過濾器,則需要實現javax.servlet.Filter接口,一個過濾器中包含了三個與生命周期相關的方法:

  • void init(FilterConfig? config)? 過濾器初始化時執行,FilterConfig 可以用來獲取過濾器的初始化參數。

  • void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

過濾器過濾請求時執行,包含了request和response,chain用來是否執行下一步請求。

  • destroy()?? web容器(tomcat)停止時執行

??? 第一步:創建DemoFilter.java

package cn.zq.filter;import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; public class DemoServlet implements Filter{ public void init(FilterConfig config) throws ServletException {System.out.println("DemoServlet.init...");} public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { System.out.println("DemoServlet.doFilter...");System.out.println("this = " + this);} public void destroy() {System.out.println("DemoServlet.destroy...");}}

第二步:在web.xml文件中添加如下配置:

?<filter><filter-name>demo</filter-name><filter-class>cn.zq.filter.DemoServlet</filter-class></filter><filter-mapping><filter-name>demo</filter-name><url-pattern>/*</url-pattern></filter-mapping>

url-pattern配置為/*,表示過濾所有請求。

啟動tomcat,可以看到如下輸出:

說明Filter的init方法在web容器啟動的時候執行,讀者可以自行驗證destroy()方法會在web容器停止時執行,訪問主頁:

在訪問主頁的時候瀏覽器是一片空白的,控制臺輸出上面的消息,Filter只會實例化一次,為什么我們訪問不到我們要訪問的內容呢?只需要在doFilter方法中加入如下的語句就可以了:

chain.doFilter(req, resp);

FilterChain(過濾器鏈)是用來干什么的呢?這個對象只包含一個void doFilter(ServletRequest request, ServletResponse response)方法,Filter調用此方法去調用下一個web組件(Filter,Servlet等),如果不調用此方法,那么下一個web組件不會被執行。

再放行之前,我們可以在Filter中設置響應頭信息,如下:

?? ???? resp.setContentType("text/html;charset=UTF-8");chain.doFilter(req, resp);

過濾器的過濾過程如下:

過濾器中的各項配置:

  • 配置初始化參數:

<filter><filter-name>demo</filter-name><filter-class>cn.zq.filter.DemoServlet</filter-class><init-param><param-name>encoding</param-name><param-value>UTF-8</param-value></init-param><init-param><param-name>name</param-name><param-value>RiccioZhang</param-value></init-param></filter><filter-mapping><filter-name>demo</filter-name><url-pattern>/*</url-pattern></filter-mapping>

然后在init方法中獲取:

public void init(FilterConfig config) throws ServletException {System.out.println("DemoServlet.init...");String encoding = config.getInitParameter("encoding");String name = config.getInitParameter("name");System.out.println("encoding="+encoding);System.out.println("name="+name);}<filter><!-- filter的名字 --><filter-name>demo</filter-name><!-- 類名 --><filter-class>cn.zq.filter.DemoServlet</filter-class></filter><!-- 可以有多個 --><filter-mapping><!-- 對哪個filter進行配置 --><filter-name>demo</filter-name><!-- ?? 配置過濾的url,不能是/ ? 其他與servlet配置類似 ? --><url-pattern>/*</url-pattern><!-- 根據名字配置對哪個servlet進行過濾--><servlet-name>DemoServlet</servlet-name><!-- ERROR: <error-page>過來的請求FORWARD: 對轉發過來的請求進行過濾,也就是對request.getRequestDispatcher(path).forward(request, response)INCLUDE:對request.getRequestDispatcher(path).include(request, response)過來的請求進行過濾REQUEST(默認): 對客戶端的請求進行攔截可以配置多個--><dispatcher>ERROR</dispatcher></filter-mapping>

3、Filter的應用

為了便于編寫Filter,本節的所有應用中提供了一個通過的Filter的實現:

package cn.zq.filter; import java.io.IOException; import java.io.Serializable; import java.util.Enumeration; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; /** * 通用的Filter的實現 *@author zq * */public abstract class GenericFilter implements Filter,FilterConfig, Serializable{ private static final long serialVersionUID = 5497978960987185665L; private FilterConfig filterConfig; /*** 需要初始化,應該覆蓋整個方法*/public void init(){} public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig;init();} abstract public void doFilter(ServletRequest request, ServletResponse response,FilterChain chain) throws IOException, ServletException; public void destroy() {}public String getFilterName() { return getFilterConfig().getFilterName();} public String getInitParameter(String name) { return getFilterConfig().getInitParameter(name);} public Enumeration<String> getInitParameterNames() { return getFilterConfig().getInitParameterNames();} public ServletContext getServletContext() { return getFilterConfig().getServletContext();} public FilterConfig getFilterConfig() { return filterConfig;} }package cn.zq.filter; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public abstract class HttpFilter extends GenericFilter{ private static final long serialVersionUID = 1029993995265394412L; public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {HttpServletRequest req = (HttpServletRequest) request;HttpServletResponse resp = (HttpServletResponse) response;doFilter(req, resp, chain);} protected abstract void doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain chain) throws IOException, ServletException; }

3.1、解決GET和POST獲取參數的亂碼問題

第一步:創建Filter

package cn.zq.filter; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.util.Iterator; import java.util.Map; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; /** * 處理字符編碼的Filter * @author zq * */public class CharacterEncodingFilter extends HttpFilter{ private static final long serialVersionUID = -4329981031091311164L; private String characterEncoding = "UTF-8"; public void init() {String ce = getInitParameter("characterEncoding"); if(ce != null && !ce.equals("")){characterEncoding = ce.toUpperCase();}} public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)throws IOException, ServletException {request.setCharacterEncoding(characterEncoding);response.setContentType("text/html;charset="+characterEncoding); //優化:只對GET請求的request進行包裝if(request.getMethod().equals("GET")){request = new ParameterHandlerRequest(request);}chain.doFilter(request, response);} private class ParameterHandlerRequest extends HttpServletRequestWrapper{ public ParameterHandlerRequest(HttpServletRequest request) { super(request);} public String getParameter(String name) {String value = super.getParameter(name); return getString(value);} private String getString(String value){ if(value != null){ try {value = ?new String( value.getBytes("ISO-8859-1"), getRequest().getCharacterEncoding() );} catch (UnsupportedEncodingException e) {e.printStackTrace();}} return value;} public String[] getParameterValues(String name) {String[] values = super.getParameterValues(name); if(null != values){ for(int i = 0; i < values.length; i++){values[i] = getString(values[i]);}} return values;} public Map<String, String[]> getParameterMap() {Map<String, String[]> paramMap = super.getParameterMap();Iterator<String[]> it = paramMap.values().iterator(); while(it.hasNext()){String[] values = it.next(); if(null != values){ for(int i = 0; i < values.length; i++){values[i] = getString(values[i]);}}} return paramMap;}} }

第二步:編寫配置文件

?<filter><filter-name>CharacterEncodingFilter</filter-name><filter-class>cn.zq.filter.CharacterEncodingFilter</filter-class></filter><filter-mapping><filter-name>CharacterEncodingFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

這個過濾器應該配置在所有過濾器的前面

第三步:測試

package cn.zq.servlet; import java.io.IOException; import java.util.Iterator; import java.util.Map; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DemoServlet extends HttpServlet {private static final long serialVersionUID = -4363281555738840730L;public void doGet(HttpServletRequest request, HttpServletResponse response)?? ??? ??? ?throws ServletException, IOException {doPost(request, response);}public void doPost(HttpServletRequest request, HttpServletResponse response)?? ??? ??? ?throws ServletException, IOException {System.out.println("--------"+request.getMethod()+"--------");System.out.println("request = " + request);System.out.println("name = " + request.getParameter("name"));String[] names = request.getParameterValues("name");if(names != null && names.length > 0){System.out.println("names[0] = " + names[0]);}Map<String, String[]> parameterMap = request.getParameterMap();for(Iterator<String> it = parameterMap.keySet().iterator();it.hasNext();){String key = it.next();String[] values = parameterMap.get(key);System.out.println(key+"="+values[0] );}}} <servlet><servlet-name>DemoServlet</servlet-name><servlet-class>cn.zq.servlet.DemoServlet</servlet-class></servlet><servlet-mapping><servlet-name>DemoServlet</servlet-name><url-pattern>/servlet/DemoServlet</url-pattern></servlet-mapping><%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> ? ? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><a href="<%=basePath%>servlet/DemoServlet?name=中國">Click</a><form action="<%=basePath%>servlet/DemoServlet" method="post"><input type="text" name="name"><br/><input type="submit"/></form></body></html>

訪問并測試:

這個過濾器應該被配置在所有過濾器的前面,就能解決全站的亂碼了,這樣就不用重復的編寫解決亂碼問題的代碼了。

3.2、設置所有的jsp頁面不緩存

因為jsp頁面的有些內容是動態生成的,所有混成jsp頁面的意義不大,我們通常會設置這些jsp頁面不緩存。

第一步:開發Filter

package cn.zq.filter; import java.io.IOException; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class DynamicPageCacheFilter extends HttpFilter { /** * */private static final long serialVersionUID = -5449451659530735173L; public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)throws IOException, ServletException { //設置3個響應頭response.setHeader("pragma", "no-cache");response.setHeader("cache-control", "no-cache");response.setDateHeader("expires", 0);chain.doFilter(request, response);}}

第二步:配置web.xml

?<filter><filter-name>DynamicPageCacheFilter</filter-name><filter-class> cn.zq.filter.DynamicPageCacheFilter</filter-class></filter><filter-mapping><filter-name>DynamicPageCacheFilter</filter-name><url-pattern>*.jsp</url-pattern><dispatcher>REQUEST</dispatcher><dispatcher>FORWARD</dispatcher><dispatcher>INCLUDE</dispatcher></filter-mapping

第三步:打開ie,清空所有的緩存,cookie,訪問本項目的jsp文件看是否有緩存文件,將Filter拿到,再訪問看是否有緩存文件。

控制是否緩存,也可以在jsp頁面中加入這幾個頭

<meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> ?

3.3、控制靜態頁面緩存(如html,圖片)

第一步:編寫Filter

package cn.zq.filter; import java.io.IOException; import java.util.Calendar; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class StaticContentCacheFilter extends HttpFilter{ /** * */private static final long serialVersionUID = 7660878144738222823L; @Overridepublic void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)throws IOException, ServletException { /**讓圖片緩存一個月,html文件緩存一個星期 ,*具體的相關信息可以通過配置文件來配置。*/String requestURI = request.getRequestURI(); long time = 0; int day = 0; if(requestURI.endsWith(".jpg")){day = 30;}else if(requestURI.endsWith(".html")){day = 7;}Calendar calendar = Calendar.getInstance();calendar.add(Calendar.DATE, day);time = calendar.getTimeInMillis();response.setDateHeader("expires", time);chain.doFilter(request, response);}}

第二步:配置

?<filter><filter-name>StaticContentCacheFilter</filter-name><filter-class>cn.zq.filter.StaticContentCacheFilter</filter-class></filter><filter-mapping><filter-name>StaticContentCacheFilter</filter-name><url-pattern>*.html</url-pattern><url-pattern>*.jpg</url-pattern> ? </filter-mapping>

第三步:測試

請求資源,再次請求。查看狀態碼為304,及緩存文件的日期為N天以后。這是返回的狀態碼:HTTP/1.1 304 Not Modified

3.4 驗證用戶是否登錄

第一步:開發filter

package cn.zq.filter; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * 驗證用戶是否登錄的過濾器 * @author Riccio Zhang * */public class LoginFilter extends HttpFilter{ private static final long serialVersionUID = -6363929637537263967L; protected void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)throws IOException, ServletException {HttpSession session = request.getSession();Object user = session.getAttribute("user"); //沒有找到user,則說明用戶沒有登錄,轉到登錄頁面讓用戶登錄if(user == null){PrintWriter out = response.getWriter();out.print("<script>" + ?"alert('您還未登錄!');" + ?"window.location.href='"+request.getContextPath()+"/login.jsp'" + ?"</script>"); return;}chain.doFilter(request, response);}}

第二步:開發登錄功能,配置web.xml

package cn.zq.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 3059445154848670189L; public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //讓用戶退出登錄request.getSession().invalidate();response.sendRedirect(request.getContextPath() + "/login.jsp");} public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { /** 讓用戶登錄成功*/String username = request.getParameter("username"); if(username == null || username.length() == 0){request.setAttribute("msg", "用戶名不能為空!");request.getRequestDispatcher("/login.jsp").forward(request, response); return;}request.getSession().setAttribute("user", username); //重定向到主頁response.sendRedirect(request.getContextPath() + "/page/index.jsp");}}

登錄頁面:/login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'login.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> ? ? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"></head><body><p style="color:red;font: 12px;">${requestScope.msg }</p><form action="<%=path%>/login" method="post">username : <input type="text" name="username" ><br/><input type="submit" value="Sign in"></form></body></html>

登錄成功跳轉頁面:/page/index.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" ?prefix="c"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><base href="<%=basePath%>"><title>My JSP 'index.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> ? ? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body>歡迎你,<c:out value="${user }"></c:out><br/><a href="<%=path%>/login">退出</a></body></html> <!-- 對/page/*進行過濾 --><filter><filter-name>LoginFilter</filter-name><filter-class>cn.zq.filter.LoginFilter</filter-class></filter><filter-mapping><filter-name>LoginFilter</filter-name><url-pattern>/page/*</url-pattern> ? </filter-mapping><servlet-mapping><servlet-name>DemoServlet</servlet-name><url-pattern>/servlet/DemoServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login</url-pattern></servlet-mapping>

第三步:測試,

在訪問/page/index.jsp頁面時,未登錄是否會跳轉到登錄頁面。登錄時顯示用戶的名字。

3.5、自動登錄

自動登錄是為了讓用戶下次訪問時,不用輸入用戶名和密碼。將用戶的信息保存到cookie中,下次直接從cookie中取。

第一步:開發登錄頁面

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%><%String path = request.getContextPath();String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><title>My JSP 'login.jsp' starting page</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0"> ? ? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"></head><body><c:choose><c:when test="${empty user }"><p style="color:red;font: 12px;">${requestScope.msg }</p><form action="<%=path%>/login" method="post">username : <input type="text" name="username" ><br/><fieldset><legend>自動登錄</legend><input type="radio" name="day" value="0">不自動登錄<br/><input type="radio" name="day" value="1">1天<br/><input type="radio" name="day" value="7">一個星期<br/><input type="radio" name="day" value="30">一個月<br/></fieldset><input type="submit" value="Sign in"></form></c:when><c:otherwise>歡迎您,<c:out value="${user }"></c:out><br/><a href="<c:url value='/login' />">退出</a></c:otherwise></c:choose></body></html>

第二步:開發登錄servlet

package cn.zq.servlet; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet { /** * */private static final long serialVersionUID = 3059445154848670189L; public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //讓用戶退出登錄request.getSession().invalidate(); //刪除cookieCookie cookie = new Cookie("autoLogin", ""); /*** 0表示刪除文件和緩存* -1表示刪除文件,但是還有緩存*/cookie.setMaxAge(0);cookie.setPath("/");response.addCookie(cookie);response.sendRedirect(request.getContextPath() + "/login.jsp");} public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { /** 讓用戶登錄成功*/String username = request.getParameter("username"); if(username == null || username.length() == 0){request.setAttribute("msg", "用戶名不能為空!");request.getRequestDispatcher("/login.jsp").forward(request, response); return;} int day = 0;String auto = request.getParameter("day"); try {day = Integer.parseInt(auto);} catch (Exception e) {} //對中文要進行編碼Cookie cookie = new Cookie("autoLogin", URLEncoder.encode(username, request.getCharacterEncoding()));cookie.setMaxAge(day*24*3600);cookie.setPath("/");response.addCookie(cookie);request.getSession().setAttribute("user", username);response.sendRedirect(request.getContextPath() + "/page/index.jsp");}} ?<servlet-mapping><servlet-name>DemoServlet</servlet-name><url-pattern>/servlet/DemoServlet</url-pattern></servlet-mapping><servlet-mapping><servlet-name>LoginServlet</servlet-name><url-pattern>/login</url-pattern></servlet-mapping>

第三步:開發自動登錄過濾器

package cn.zq.filter; import java.io.IOException; import java.net.URLDecoder; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class AutoLoginFilter extends HttpFilter{ private static final long serialVersionUID = 5891858915933022714L; @Overridepublic void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)throws IOException, ServletException { /** 優化:當用戶手動登錄或退出時,就不需要自動登錄,* 并且用戶已經登錄,也不需要自動登錄,自動登錄的代碼是* 多此一舉*/HttpSession session = request.getSession();String requestURI = request.getRequestURI();Object user = session.getAttribute("user"); if(!requestURI.contains("/login") && user == null){ //獲取cookieCookie[] cookies = request.getCookies(); if(cookies != null){ for(Cookie c : cookies){ if("autoLogin".equals(c.getName())){String username = c.getValue();username = URLDecoder.decode(username, request.getCharacterEncoding());session.setAttribute("user", username); break;}}}}chain.doFilter(request, response);}} ?<filter><filter-name>AutoLoginFilter</filter-name><filter-class>cn.zq.filter.AutoLoginFilter</filter-class></filter><filter-mapping><filter-name>AutoLoginFilter</filter-name><url-pattern>/*</url-pattern> ?</filter-mapping>

3.6、過濾非法語句(臟話)

在過濾器中,包裝HttpServletRequest,修改getParameter方法

package cn.zq.filter; import java.io.IOException; import java.util.Arrays; import java.util.List; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse;public class DirtyWordsFilter extends HttpFilter{ private static final long serialVersionUID = -5025789414017693051L; public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain)throws IOException, ServletException {request = new MyHttpServletRequest(request);chain.doFilter(request, response);}}class MyHttpServletRequest extends HttpServletRequestWrapper{List<String> dirtyWords = Arrays.asList(new String[]{"SB", "sb", "傻B", "2B"}); public MyHttpServletRequest(HttpServletRequest request) { super(request);} public String getParameter(String name) {String value = super.getParameter(name); if(value != null && value.length() > 0){ for(String dw : dirtyWords){value = value.replaceAll(dw, "***");}} return value;} }

3.7、全站壓縮

實現對輸出流的壓縮:

在tomcat將數據輸出到瀏覽器前,進行壓縮,可以減少傳送過去的數據,節約成本。如果在流量很少的情況下查看相同的內容和樂而不為呢?

思路:

  • 在調用request.getOutputStream()或request.getWriter()時獲取自己的輸出流,將數據寫到事先準備的緩沖中。

  • 在輸出完成后獲取我們自己的緩沖數據

  • 然后在對緩沖的數據進行壓縮,在過濾器中將數據傳輸給瀏覽器

第一步:編寫壓縮數據的過濾器

package cn.zq.filter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.zip.GZIPOutputStream; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper;public class GzipFilter extends HttpFilter{ private static final long serialVersionUID = 3410826595861585118L; public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)throws IOException, ServletException {String ac = request.getHeader("Accept-Encoding"); //支持gzip壓縮if(ac != null && ac.toLowerCase().indexOf("gzip") != -1){BufferedHttpServletResponse bRes = new BufferedHttpServletResponse(response);chain.doFilter(request, bRes); byte[] data = bRes.getData();System.out.println("->壓縮前數據大小:" + data.length);ByteArrayOutputStream bos = new ByteArrayOutputStream();GZIPOutputStream gout = new GZIPOutputStream(bos);gout.write(data);gout.close(); byte[] compressedData = bos.toByteArray();System.out.println("->壓縮后的數據大小:"+compressedData.length); //設置頭信息response.setContentLength(compressedData.length);response.setHeader("Content-Encoding", "gzip");ServletOutputStream out = response.getOutputStream();out.write(compressedData);}else{chain.doFilter(request, response);}}} class BufferedHttpServletResponse extends HttpServletResponseWrapper{ private ByteArrayOutputStream buf = new ByteArrayOutputStream(); private PrintWriter pw; public BufferedHttpServletResponse(HttpServletResponse response) { super(response);} public PrintWriter getWriter() throws IOException {pw = new PrintWriter( new OutputStreamWriter(buf, getResponse().getCharacterEncoding())); return pw;}public ServletOutputStream getOutputStream() throws IOException {ServletOutputStream sos = new ServletOutputStream() { public void write(int b) throws IOException {buf.write(b);}}; return sos;} public byte[] getData(){ if(pw != null){pw.close();} return buf.toByteArray();} }

第二步:配置對所有的jsp進行壓縮

? <filter><filter-name>GzipFilter</filter-name><filter-class>cn.zq.filter.GzipFilter</filter-class></filter><filter-mapping><filter-name>GzipFilter</filter-name><servlet-name>DemoServlet</servlet-name><url-pattern>*.jsp</url-pattern></filter-mapping>

第三步:測試壓縮過濾器

使用壓縮過濾器應該注意:應該只用這個壓縮過濾器對文本進行壓縮,例如jsp,html,css,js等進行壓縮,對視頻和圖片的壓縮率很低,不要用來壓縮視頻和圖片,如果是下載,那也不應該用來壓縮,這樣不但壓縮率很低,而且還有可能讓服務器奔潰。

關于壓縮過濾器的優化:

在doFilter方法中先將數據拿出來,然后放到GzipOutputStream中進行壓縮,然后得到壓縮后的字節再輸出給客戶端,這樣2次都得到了字節,假如數據量較大,這2次都會占用較多的內存,能不能從包裝的response拿出來時直接就是壓縮過后的數據呢?改造后的代碼如下:

package cn.zq.filter; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.util.zip.GZIPOutputStream; import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponseWrapper; public class GzipFilter extends HttpFilter{ private static final long serialVersionUID = 3410826595861585118L; public void doFilter(HttpServletRequest request,HttpServletResponse response, FilterChain chain)throws IOException, ServletException {String ac = request.getHeader("Accept-Encoding"); //支持gzip壓縮if(ac != null && ac.toLowerCase().indexOf("gzip") != -1){BufferedHttpServletResponse bRes = new BufferedHttpServletResponse(response);chain.doFilter(request, bRes); byte[] compressedData = bRes.getData(); //設置頭信息response.setContentLength(compressedData.length);response.setHeader("Content-Encoding", "gzip");ServletOutputStream out = response.getOutputStream();out.write(compressedData);}else{chain.doFilter(request, response);}}}class BufferedHttpServletResponse extends HttpServletResponseWrapper{ private ByteArrayOutputStream buf = new ByteArrayOutputStream(); private GZIPOutputStream gout; private PrintWriter pw; public BufferedHttpServletResponse(HttpServletResponse response) throws IOException { super(response);gout = new GZIPOutputStream(buf);} public PrintWriter getWriter() throws IOException {pw = new PrintWriter( new OutputStreamWriter(gout, getResponse().getCharacterEncoding())); return pw;} public ServletOutputStream getOutputStream() throws IOException {ServletOutputStream sos = new ServletOutputStream() { public void write(int b) throws IOException {gout.write(b);}}; return sos;} public byte[] getData() throws IOException{ if(pw != null){pw.close();}gout.close(); return buf.toByteArray();} }

4.總結

利用Filter能對請求和響應進行預處理,在到達目標組件之前,對強求進行處理,諸如:對請求頭和響應頭進行處理。充分的利用了包裝器設計模式,對request或response進行包裝,對其方法進行增強。假如我們拒絕某個請求,就可以寫一個過濾器對不希望的請求不放行,即不執行chain.doFilter(request, response)方法,過濾器能幫助我們干很多的事情。

作者:RiccioZhang 出處:https://blog.csdn.net/ricciozhang/article/details/43833401

????覺得有用就轉發分享一下吧


1.?java設計模式簡單工廠模式

2.?一文讀懂HttpServletRequest

3.?一文讀懂HttpServletResponse

4.?tomcat基本使用,就是這么簡單

附上熱門QQ群,存放資源和歷史資料,2000容量(低門檻付費群),長按二維碼入群

總結

以上是生活随笔為你收集整理的重温java web过滤器filter的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: av一区在线播放 | 手机看片福利视频 | 国产色视频网站 | chinese精品自拍hd | www夜片内射视频日韩精品成人 | 欧美经典一区二区三区 | 免费av一级 | 国产精品露脸视频 | 欧美男人天堂网 | 精品性久久 | 欧美日韩有码 | 天天色天天射天天操 | 精品国产丝袜一区二区三区乱码 | 超碰97干 | 国产三级在线免费观看 | 欧美大片免费在线观看 | 日日碰日日操 | 国产视频在 | 欧美综合网 | 国产精品探花一区二区在线观看 | 久久久久99精品成人片我成大片 | 精品视频一区二区三区在线观看 | av毛片在线免费看 | 色姑娘久 | 亚洲第一天堂在线观看 | 日韩久久成人 | 天堂资源最新在线 | 欧美激情在线免费观看 | 91成人亚洲| 日韩在线中文字幕 | 欧美男人亚洲天堂 | 亚洲国产aⅴ精品一区二区的游戏 | 在线成人免费视频 | 免费毛片一级 | 国产乱在线 | 国产原创剧情av | 在线观看视频 | 精品日韩制服无码久久久久久 | 中文字幕av片 | 免费看国产精品 | 在线观看污污网站 | xxxx国产精品 | 日本黄页网站 | 国产真实乱人偷精品人妻 | 亚洲三区视频 | 日本特黄一级片 | 国产精品一区久久 | 婷婷四房综合激情五月 | 欧美精品一区二区蜜桃 | 日本免费a视频 | 亚洲欧美日韩免费 | 伊人影院在线观看视频 | 国产特黄aaaaa毛片 | 欧美三级小视频 | 亚洲女人天堂网 | 狠狠鲁视频 | 日韩成人中文字幕 | 欧州一区 | 国产91亚洲精品 | 成人午夜免费观看 | 天天爱天天插 | 人人看人人草 | 伊人久久久久久久久久久久久 | 欧美精品久久久久久久 | eeuss鲁丝片一区二区三区 | 欧洲最强rapper网站直播 | 黄色大片网站在线观看 | 91精品人妻一区二区三区果冻 | 先锋资源在线视频 | www.久久久久久 | 欧美在线播放视频 | 伊人福利视频 | 丝袜人妻一区二区三区 | 亚洲成人精品久久 | 91福利专区| 国产激情免费视频 | 成年免费视频黄网站在线观看 | 大乳护士喂奶hd | 国产日韩高清在线 | 国产传媒在线 | 久久精品黄 | 日韩av资源网 | 综合久久婷婷 | 国产麻豆电影在线观看 | av在线看片 | 97视频一区二区 | 96国产视频| 亚洲影视网 | 欧美丰满熟妇xxxxx | 欧美日韩美女 | 日本老妇高潮乱hd | 亚洲精品大全 | 久久大胆 | 日本学生初尝黑人巨免费视频 | 99精品亚洲| 日韩激情网 | 久久久精品日韩 | 秋霞影院午夜老牛影院 | 三上悠亚在线播放 |