亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

Filter過濾器原理和登錄實現

2019-11-14 14:57:17
字體:
來源:轉載
供稿:網友

Filter過濾器API
     Servlet過濾器API包含了3個接口,它們都在javax.servlet包中,分別是Filter接口、FilterChain接口和FilterConfig接口。
Filter接口(源碼

public interface Filter {    public void init(FilterConfig filterConfig) throws ServletException;    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;    public void destroy();}

所有的過濾器都必須實現Filter接口。該接口定義了init,doFilter0,destory()三個方法:
  (1)init(FilterConfig filterConfig)
      在web應用程序啟動時,web服務器將根據 web.xml文件中的配置信息來創建每個注冊的Filter實例對象,并將其保存在服務器的內存中。Web容器創建Filter對象實例后,將立即調用該Filter對象的init方法。Init方法在Filter生命周期中僅執行一次,web容器在調用init方法時,會傳遞一個包含Filter的配置和運行環境的FilterConfig對象(FilterConfig的用法和ServletConfig類似)。利用FilterConfig對象可以得到ServletContext對象,以及部署描述符中配置的過濾器的初始化參數。
  (2)
doFilter(ServletRequest request, ServletResponse response, FilterChain chain)

      doFilter()方法類似于Servlet接口的service()方法。當客戶端請求目標資源的時候,容器就會調用與這個目標資源相關聯的過濾器的 doFilter()方法。其中參數 request, response 為 web 容器或 Filter 鏈的上一個 Filter 傳遞過來的請求和相應對象;參數 chain 為代表當前 Filter 鏈的對象,在特定的操作完成后,可以在當前 Filter 對象的 doFilter 方法內部需要調用 FilterChain 對象的 chain.doFilter(request,response)方法才能把請求交付給 Filter 鏈中的下一個 Filter 或者目標 Servlet 程序去處理,也可以直接向客戶端返回響應信息,或者利用RequestDispatcher的forward()和include()方法,以及 HttpServletResponse的sendRedirect()方法將請求轉向到其他資源。這個方法的請求和響應參數的類型是 ServletRequest和ServletResponse,也就是說,過濾器的使用并不依賴于具體的協議。
 (3)public void destroy()
       在Web容器卸載 Filter 對象之前被調用。該方法在Filter的生命周期中僅執行一次。在這個方法中,可以釋放過濾器使用的資源。
FilterChain接口(源碼)

public interface FilterChain {    public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException;}

(1)doFilter(ServletRequest request,ServletResponse response)
      此方法是由Servlet容器提供給開發者的,用于對資源請求過濾鏈的依次調用,通過FilterChain調用過濾鏈中的下一個過濾  器,如果是最后一個過濾器,則下一個就調用目標資源。
FilterConfig接口(源碼)  FilterConfig接口檢索過濾器名、初始化參數以及活動的Servlet上下文。

public interface FilterConfig {  //返回web.xml部署文件中定義的該過濾器的名稱    public String getFilterName();  //返回調用者所處的servlet上下文    public ServletContext getServletContext();  //返回過濾器初始化參數值的字符串形式,當參數不存在時,返回nul1.name是初始化參數名    public String getInitParameter(String name);  //以Enumeration形式返回過濾器所有初始化參數值,如果沒有初始化參數,返回為空    public Enumeration getInitParameterNames();}

 

了解了Filter的基本概念和源碼,下面具體使用下Filter過濾器來實現登錄過濾。

需求:訪問A頁面(登錄后才能訪問的頁面)-->未登錄-->跳轉到登錄頁面-->登陸成功后,跳轉到A頁面

自定義HttpFilter

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;/** * HttpFilter */public abstract class HttpFilter implements Filter{    //保存filterConfig對象    PRivate FilterConfig filterConfig;        /**     * 直接返回filterConfig對象     * @return     */    public FilterConfig getFilterConfig() {        return filterConfig;    }        /**     * 不建議子類直接覆蓋,若直接失敗,將可能導致filterConfig成員變量初始化失敗     */    @Override    public void init(FilterConfig filterConfig) throws ServletException {                this.filterConfig = filterConfig;            init();    }    /**     * 供子類繼承的初始化方法,刻通過getFilterConfig()方法獲得filterConfig對象     */    private void init() {}    /**     * 原生的doFilter方法,在方法內部把ServletRequest和ServletResponse轉化化為了HttpServletRequest和HttpServletResponse,     * 并調用了doFilter(HttpServletRequest request, HttpServletResponse response,FilterChain filterChain)方法     */    @Override    public void doFilter(ServletRequest req, ServletResponse res,            FilterChain filterChain) throws IOException, ServletException {                HttpServletRequest request = (HttpServletRequest) req;        HttpServletResponse response = (HttpServletResponse) res;                doFilter(request, response, filterChain);    }        /**     * 抽象方法,為http請求定制,必須實現的方法     * @param request     * @param response     * @param filterChain     * @throws IOException     * @throws ServletException     */    public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,            FilterChain filterChain) throws IOException, ServletException;    @Override    public void destroy() {}}
View Code

web.xml配置CommonFilter

    <filter>        <filter-name>commonFilter</filter-name>        <filter-class>com.gcx.emall.Filter.CommonFilter</filter-class>    </filter>    <filter-mapping>        <filter-name>commonFilter</filter-name>        <url-pattern>/*</url-pattern>    </filter-mapping>

登錄過濾器CommonFilter

import java.io.IOException;import javax.servlet.FilterChain;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;import org.slf4j.LoggerFactory;public class CommonFilter extends HttpFilter {    private final Logger log = LoggerFactory.getLogger(CommonFilter.class);        @Override    public void doFilter(HttpServletRequest request,            HttpServletResponse response, FilterChain filterChain)            throws IOException, ServletException {        log.info("==============攔截get請求================");        if ("GET".equalsIgnoreCase(request.getMethod())) {            RequestUtil.saveRequest(request);        }                String requestUri = request.getRequestURI();        String contextPath = request.getContextPath();        String url = requestUri.substring(contextPath.length());        if ("/login".equals(url)) {            filterChain.doFilter(request, response);            return;        } else {            String username = (String) request.getsession().getAttribute("user");            if (username == null) {                log.info("被攔截:跳轉到login頁面!");                request.getRequestDispatcher("/page/index1.jsp").forward(request, response);            } else                filterChain.doFilter(request, response);        }    }}

RequestUtil 保存、獲取request并加密請求頁面

public class RequestUtil {    private  static  final  Logger  logger = LoggerFactory.getLogger(RequestUtil.class);    private  static  final  Base64  base64 = new Base64(true);    public  static  final  String  LAST_PAGE = "lastPage";//未登錄時訪問的頁面    public  static  final  String  REDIRECT_HOME = "/";//未登錄時跳轉到首頁    public  static  final  String  LOGIN_HOME = "/index.jsp";//登錄成功后進入的頁面               /**     * 保存當前請求     */    public static void saveRequest(HttpServletRequest request) {        request.getSession().setAttribute(LAST_PAGE, RequestUtil.hashRequestPage(request));        logger.debug("被攔截的url的sessionID:{}", request.getSession().getId());        logger.debug("save request for {}", request.getRequestURI());    }        /**     * 加密請求頁面     * @param request     * @return     */    public static  String hashRequestPage(HttpServletRequest request) {        String reqUri = request.getRequestURI();        String query = request.getQueryString();        if (query != null) {            reqUri += "?" + query;        }        String targetPage = null;        try {            targetPage = base64.encodeAsString(reqUri.getBytes("UTF-8"));        } catch (UnsupportedEncodingException ex) {            //this does not happen        }        return targetPage;    }        /**     * 取出之前保存的請求     * @return     */    public static String retrieveSavedRequest(HttpServletRequest request) {        HttpSession session = request.getSession();        if (session == null) {            return REDIRECT_HOME;        }        String HashedlastPage = (String) session.getAttribute(LAST_PAGE);        if (HashedlastPage == null) {            return LOGIN_HOME;        } else {            return retrieve(HashedlastPage);        }    }    /**     * 解密請求的頁面     * @param targetPage     * @return     */    public static String retrieve(String targetPage) {        byte[] decode = base64.decode(targetPage);        try {            String requestUri = new String(decode, "UTF-8");            int i = requestUri.indexOf("/", 1);            return requestUri.substring(i);        } catch (UnsupportedEncodingException ex) {            //this does not happen            return null;        }    }}
View Code

LoginCOntroller

        @RequestMapping(value = "/hello",method = RequestMethod.GET)
     public String testHello( String test) {
         log.info("執行了Hello方法!");
         return "loginSuccess";
     }
@RequestMapping(value = "/login",method = RequestMethod.POST) public String login(HttpServletRequest request,String userName,String passWord){ log.info("執行了login方法!"); password = DigestUtils.md5Hex(password); User user = userService.findUser(userName,password); if(user!=null){ request.getSession().setAttribute("userId", user.getId()); request.getSession().setAttribute("user", userName); return "redirect:" + RequestUtil.retrieveSavedRequest(request);//跳轉至訪問頁面 }else{ log.info("用戶不存在"); request.getSession().setAttribute("message", "用戶名不存在,請重新登錄"); return "index"; } }

最后需要幾個jsp頁面login.jsp,index.jsp(首頁面,任何人都能訪問的),loginSuccess.jsp,還需要在controller中加上一個測試testHello方法用于滿足之前說的需求。

注意事項:我們過濾的是所有請求,但對于靜態資源CSS,js,image我們應該不攔截,對其放行。我們可以在web.xml中進行指定

    <!-- 不攔截靜態文件 -->    <servlet-mapping>        <servlet-name>default</servlet-name>        <url-pattern>/js/*</url-pattern>        <url-pattern>/css/*</url-pattern>        <url-pattern>/image/*</url-pattern>        <url-pattern>/fonts/*</url-pattern>    </servlet-mapping>

寫在后面:本來想把Filter和SpringMVC的interceptor攔截器一起寫總結了,但感覺篇幅有些長打算下篇在介紹。

 


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
裸体女人亚洲精品一区| 免费不卡欧美自拍视频| 亚洲精品网站在线播放gif| 亚洲男人天天操| 日韩中文字幕亚洲| 日日狠狠久久偷偷四色综合免费| 黑人巨大精品欧美一区免费视频| 全球成人中文在线| 欧美电影免费看| 亚洲一区二区三区四区视频| 久久久国产一区二区| 日韩在线精品一区| 欧美日韩ab片| 精品亚洲一区二区三区四区五区| 色噜噜国产精品视频一区二区| 亚洲人成绝费网站色www| 成人亚洲欧美一区二区三区| 欧美激情a∨在线视频播放| 日本精品视频在线| 亚洲视频第一页| 日韩在线免费观看视频| 中文字幕av一区中文字幕天堂| 精品久久久久久久久久久| 一区二区成人精品| 亚洲色图欧美制服丝袜另类第一页| 欧美一区二区三区四区在线| 久久久国产在线视频| 国产精品欧美在线| 91久久嫩草影院一区二区| 国产成人啪精品视频免费网| 午夜免费日韩视频| 97精品在线观看| 亚洲欧美制服第一页| 亚洲欧美中文在线视频| 欧洲中文字幕国产精品| 久久资源免费视频| 成人免费xxxxx在线观看| 国产精品99久久久久久白浆小说| 日本午夜精品理论片a级appf发布| 九九久久精品一区| 国产婷婷97碰碰久久人人蜜臀| 欧美风情在线观看| 亚洲精品电影网在线观看| 成人亚洲激情网| 亚洲一区精品电影| 日韩经典中文字幕在线观看| 日韩成人久久久| 色悠久久久久综合先锋影音下载| 在线观看日韩视频| 国产精品久久网| 26uuu亚洲国产精品| 国产成人高清激情视频在线观看| 国产精品欧美日韩一区二区| 91在线观看免费网站| 国产精品一区二区久久| 国产成人精品日本亚洲专区61| 在线激情影院一区| 久久亚洲春色中文字幕| 伊人伊成久久人综合网站| 在线成人免费网站| 国产一区二区三区在线视频| 黄色一区二区三区| www高清在线视频日韩欧美| 永久免费精品影视网站| 欧美亚洲另类激情另类| 69久久夜色精品国产69| 国产精品美女999| 久久久精品视频成人| 国产精品18久久久久久麻辣| 亚洲天堂男人天堂女人天堂| 中国china体内裑精亚洲片| 亚洲免费一级电影| 岛国视频午夜一区免费在线观看| 91网站在线免费观看| 成人激情视频网| 欧美成人免费全部| 日韩av一区二区在线| 国内免费精品永久在线视频| 国产精品精品视频一区二区三区| 久久久久久久久久国产精品| 97成人超碰免| 国自在线精品视频| 欧美在线视频a| 亚洲综合在线做性| 黄色成人av网| 中文字幕在线观看日韩| 久久久极品av| 日本精品性网站在线观看| 国外成人性视频| 亚洲精品av在线播放| 9.1国产丝袜在线观看| 欧美在线视频在线播放完整版免费观看| 中文字幕亚洲色图| 98精品在线视频| 国产精品偷伦免费视频观看的| 亚洲www在线观看| 欧美日韩人人澡狠狠躁视频| 亚洲男人天天操| 国产精品久久久久91| 亚洲全黄一级网站| 欧美日韩在线视频观看| 亚洲石原莉奈一区二区在线观看| 久久久国产一区二区三区| 国产69精品久久久久99| 78色国产精品| 日韩美女免费视频| 日韩欧美综合在线视频| 成人在线观看视频网站| 精品国内产的精品视频在线观看| 日韩精品一二三四区| 亚洲成人性视频| 这里只有精品视频| 久久久久久久久久久免费| 在线观看成人黄色| 亚洲精品aⅴ中文字幕乱码| 日本欧美一二三区| 日韩视频在线一区| 羞羞色国产精品| 久久av中文字幕| 欧洲成人免费视频| 国产精品久久久久99| 国产精品美女免费看| 久久影视电视剧凤归四时歌| www.久久色.com| 在线视频免费一区二区| 8x海外华人永久免费日韩内陆视频| 亚洲欧美日韩中文视频| 亚洲第一av网| 奇米4444一区二区三区| 国产精品久久久久免费a∨大胸| 日韩a**中文字幕| 亚洲精品动漫久久久久| 91久久久国产精品| 亚洲人成电影网| 97视频国产在线| 91高清视频免费| 久久久91精品国产一区不卡| 成人久久久久久久| 中文字幕在线观看亚洲| 亚洲aⅴ日韩av电影在线观看| 国产精品美女主播| 国产欧美日韩专区发布| 成人黄色免费看| 亚洲综合精品一区二区| 国产日韩欧美另类| 精品中文字幕久久久久久| 欧美一区二粉嫩精品国产一线天| 亚洲视频在线观看免费| 日韩中文字幕网| 精品欧美国产一区二区三区| 热久久视久久精品18亚洲精品| 欧美高清在线视频观看不卡| 成人网址在线观看| 精品国产区一区二区三区在线观看| 久久精品成人欧美大片古装| 国产综合色香蕉精品| 一区二区三区视频在线| 日韩大陆毛片av| 欧美激情视频在线免费观看 欧美视频免费一| 国产成人精品国内自产拍免费看| 亚洲激情电影中文字幕| 成人美女免费网站视频| 日韩一区二区三区在线播放| 成人综合网网址|