Web筆記-Filter

1. 利用過濾器解決全站編碼問題:
package cn.imeina.web.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 SetCharacterEncodingFilter implements Filter {
    /**
     * web.xml中該過濾器的配置參數(shù)
     */
    private FilterConfig fConfig;
    public SetCharacterEncodingFilter() {
    }
    public void destroy() {
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {
        //FilterConfig獲取配置參數(shù)
        String encoding = fConfig.getInitParameter("encoding");
        if (encoding == null) {
            encoding = "UTF-8";
        }
        request.setCharacterEncoding(encoding);
        //更改字符流輸出時(shí)的編碼為UTF-8
        response.setCharacterEncoding(encoding);
        //更改字符流輸出時(shí)的編碼為UTF-8,同時(shí)通知瀏覽器以UTF-8編碼顯示
        response.setContentType("text/html;charset=" + encoding);
        chain.doFilter(request, response);
    }
    public void init(FilterConfig fConfig) throws ServletException {
        
        this.fConfig = fConfig;
    }
}

web.xml中配置

  <filter>
      <filter-name>SetCharacterEncodingFilter</filter-name>
      <filter-class>com.gaoshiyi.web.filter.SetCharacterEncodingFilter</filter-class>
      <!-- 過濾器添加配置參數(shù) -->
      <init-param>
          <param-name>encoding</param-name>
          <param-value>UTF-8</param-value>
      </init-param>
  </filter>
  <filter-mapping>
      <filter-name>SetCharacterEncodingFilter</filter-name>
      <url-pattern>/*</url-pattern>
  </filter-mapping>

2. 控制動(dòng)態(tài)資源禁止緩存過濾器
package cn.imeina.web.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DynamicResourceNoCacheFilter implements Filter {
    public DynamicResourceNoCacheFilter() {
        
    }
    public void destroy() {
        
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        //該段代碼可以在HttpServlet源碼中service方法中找到...
        HttpServletRequest req;
        HttpServletResponse resp;
        try {
            
            req = (HttpServletRequest) request;
            resp = (HttpServletResponse) response;
        } catch (Exception e) {
            throw new RuntimeException("non-http request or response");
        }
        //設(shè)置控制禁止緩存的三個(gè)響應(yīng)頭
        resp.setHeader("Expries", "-1");//HTTP1.0和1.1都有
        resp.setHeader("Cache-Control", "no-cache");//HTTP1.1
        resp.setHeader("Pragma", "no-cache");//HTTP1.0
        chain.doFilter(request, response);
    }
    public void init(FilterConfig fConfig) throws ServletException {
        
    }
}

web.xml配置

    <filter>
        <filter-name>DynamicResourceNoCacheFilter</filter-name>
        <filter-class>com.gaoshiyi.web.filter.DynamicResourceNoCacheFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>DynamicResourceNoCacheFilter</filter-name>
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>
3. 控制靜態(tài)資源時(shí)間緩存的過濾器
package cn.imeina.web.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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class StaticResourceNeedCacheFilter implements Filter {
    private FilterConfig fConfig;
    
    public StaticResourceNeedCacheFilter() {
    }
    public void destroy() {
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        
        //該段代碼可以在HttpServlet源碼中service方法中找到...
        HttpServletRequest req;
        HttpServletResponse resp;
        try {
            
            req = (HttpServletRequest) request;
            resp = (HttpServletResponse) response;
        } catch (Exception e) {
            
            throw new RuntimeException("non-http request or response");
        }
        //根據(jù)用戶訪問的資源類型,讀取配置文件設(shè)置指定資源的緩存時(shí)間
        String requestURI = req.getRequestURI();
        String cacheTime = "0";
        
        if (requestURI.endsWith(".html")) {
            //訪問html資源
            cacheTime = fConfig.getInitParameter("html");
        }else if (requestURI.endsWith("css")) {
            //訪問css資源
            cacheTime = fConfig.getInitParameter("css");
        }else if (requestURI.endsWith("js")) {
            //訪問js資源
            cacheTime = fConfig.getInitParameter("js");
        }
        
        //設(shè)置靜態(tài)資源緩存時(shí)間
        long time = Long.parseLong(cacheTime) * 60 * 60 * 1000;
        resp.setDateHeader("Expires", System.currentTimeMillis() + time);
        chain.doFilter(request, response);
    }
    public void init(FilterConfig fConfig) throws ServletException {
        
        this.fConfig = fConfig;
    }
}

web.xml配置

    <filter>
        <filter-name>StaticResourceNeedCacheFilter</filter-name>
        <filter-class>com.gaoshiyi.web.filter.StaticResourceNeedCacheFilter</filter-class>
        <init-param>
            <param-name>html</param-name>
            <param-value>1</param-value>
        </init-param>
        <init-param>
            <param-name>css</param-name>
            <param-value>2</param-value>
        </init-param>
        <init-param>
            <param-name>js</param-name>
            <param-value>3</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>StaticResourceNeedCacheFilter</filter-name>
        <url-pattern>*.html</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>StaticResourceNeedCacheFilter</filter-name>
        <url-pattern>*.css</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>StaticResourceNeedCacheFilter</filter-name>
        <url-pattern>*.js</url-pattern>
    </filter-mapping>

4. 自動(dòng)登錄過濾器
package cn.imeina.web.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;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.gaoshiyi.web.domain.User;
import com.gaoshiyi.web.service.BusinessService;
import com.gaoshiyi.web.service.impl.BusinessServiceImpl;
import com.gaoshiyi.web.utils.Base64;
public class AutoLoginFilter implements Filter {
    private BusinessService service = new BusinessServiceImpl();
    public AutoLoginFilter() {
    }
    public void destroy() {
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 該段代碼可以在HttpServlet源碼中service方法中找到...
        HttpServletRequest req;
        HttpServletResponse resp;
        try {
            req = (HttpServletRequest) request;
            resp = (HttpServletResponse) response;
        } catch (Exception e) {
            throw new RuntimeException("non-http request or response");
        }
        HttpSession session = req.getSession();
        Object loginUser = session.getAttribute("user");
        if (loginUser == null) {// 未登錄
            //獲取Cookie并自動(dòng)登錄
            Cookie[] cookies = req.getCookies();
            for (int i = 0; cookies != null && i < cookies.length; i++) {
                if ("loginInfo".equals(cookies[i].getName())) {
                    String value = cookies[i].getValue();
                    String username = Base64.decode(value.split("\\_")[0]);
                    String password = value.split("\\_")[1];
                    User user = new User(username, password, null);
                    user = service.login(user);
                    if (user != null) {
                        session.setAttribute("user", user);
                        System.out.println("自動(dòng)登錄成功...");
                    }
                    break;
                }
            }
        }
        chain.doFilter(request, response);
    }
    @Override
    public void init(FilterConfig arg0) throws ServletException {
    }
}
package com.gaoshiyi.web.servlet;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.commons.beanutils.BeanUtils;
import com.gaoshiyi.web.domain.User;
import com.gaoshiyi.web.service.BusinessService;
import com.gaoshiyi.web.service.impl.BusinessServiceImpl;
import com.gaoshiyi.web.utils.Base64;
/**
 * 控制器
 * @author AKid
 *
 */
public class ControllerServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    public ControllerServlet() {
        super();
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        String opt = request.getParameter("opt");
        if ("login".equals(opt)) {
            login(request, response);
        }
    }
    /**
     * 登錄
     * @param request
     * @param response
     * @throws IOException 
     */
    private void login(HttpServletRequest request, HttpServletResponse response) throws IOException {
        
        Map<String, String[]> map = request.getParameterMap();
        User user = new User();
        try {
            BeanUtils.populate(user, map);
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        }
        BusinessService service = new BusinessServiceImpl();
        User loginUser = service.login(user);
        if (loginUser == null) {
        
            response.getWriter().write("用戶名或密碼錯(cuò)誤,請重新登錄...");
            response.setHeader("refresh", "1,url=" + request.getContextPath() + "/login.jsp");
            return;
        }
        
        //判斷用戶是否為自動(dòng)登錄
        String autologin = request.getParameter("autologin");
        if (autologin != null) {
            System.out.println("用戶設(shè)置為自動(dòng)登錄...");
            //Cookie為用戶登錄信息 base64加密用戶名_原始密碼
            Cookie cookie = new Cookie("loginInfo", Base64.encode(user.getUsername()) + "_" + user.getPassword());
            cookie.setMaxAge(10 * 24 * 60 * 60);//單位s
            cookie.setPath(request.getContextPath());//創(chuàng)建cookie時(shí)默認(rèn)path為當(dāng)前servlet的上級目錄
            response.addCookie(cookie);
        }
        
        HttpSession session = request.getSession();
        session.setAttribute("user", loginUser);
        response.getWriter().write("登錄成功,跳轉(zhuǎn)中...");
        response.setHeader("refresh", "1,url=" + request.getContextPath() + "/main.jsp");
    }
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
5. 過濾器高級設(shè)置
    <filter>
        <filter-name>HighConfigFilter</filter-name>
        <filter-class>com.gaoshiyi.web.filter.HighConfigFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>HighConfigFilter</filter-name>
        <url-pattern>/*</url-pattern>
        <dispatcher>REQUEST</dispatcher><!-- 針對直接訪問的資源進(jìn)行過濾 -->
        <dispatcher>FORWARD</dispatcher><!-- 針對間接動(dòng)態(tài)包含的資源進(jìn)行過濾 -->
        <dispatcher>INCLUDE</dispatcher><!-- 針對間接轉(zhuǎn)發(fā)的資源進(jìn)行過濾 -->
    </filter-mapping>

小知識:
Base64編碼原理:
將3字節(jié)(24位)-->4字節(jié)(32位):取每個(gè)字節(jié)的前6位最高位補(bǔ)00
1001 1010 0011 1100 1011 1110
0010010 00100011 00110010 00111110 每個(gè)字節(jié)的取值范圍00000000~00111111(0-63共64個(gè)整數(shù))
Base64是一個(gè)碼表
Base64編碼會(huì)把3字節(jié)的二進(jìn)制數(shù)據(jù)編碼為4字節(jié)的文本數(shù)據(jù),長度增加33%,好處是編碼后的文本數(shù)據(jù)可以在郵件正文、網(wǎng)頁等直接顯示。如果要編碼的二進(jìn)制數(shù)據(jù)不是3的倍數(shù),最后會(huì)剩下1個(gè)或2個(gè)字節(jié)怎么辦?Base64用\x00字節(jié)在末尾補(bǔ)足后,再在編碼的末尾加上1個(gè)或2個(gè)=號,表示補(bǔ)了多少字節(jié),解碼的時(shí)候,會(huì)自動(dòng)去掉。

Base64碼表

base64碼表
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,276評論 6 342
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,740評論 18 399
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 4,017評論 0 11
  • 長街燈影隨風(fēng)動(dòng),斜飛細(xì)雨黃花重。舉酒笑相迎,青樽動(dòng)客情。 一別親故遠(yuǎn),萬里獨(dú)歸雁。身似水中禽,詩如地上塵。
    莫愁Jessie閱讀 364評論 5 12

友情鏈接更多精彩內(nèi)容