——過濾器使用已經(jīng)很久了,今天遇到了一個小問題,也就想順便寫一個關(guān)于過濾器的博文,記錄一下自己使用的感受。
實(shí)際上,F(xiàn)ilter與Servlet及其相似,區(qū)別只是FIlter的doFilter()方法里多了一個FilterChain的參數(shù),通過該參數(shù)可以控制是否放行用戶的請求。網(wǎng)站有了過濾器十分的方便,可以通過過濾器來過濾這個用戶是否已經(jīng)登陸,如果沒有登陸,那么將限制TA的訪問權(quán)限,而且過濾器的設(shè)置以及配置都比較簡單。下面通過一個登陸過濾器的代碼簡單說一下過濾器的使用:
[java] view plain copy PRint?/** *登陸過濾器 */ public class LoginFilter implements Filter { @Override public void destroy() { } @Override public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException { HttpServletRequest hsq = (HttpServletRequest)req; //取得session中的loginUser對象 User user = (User)hsq.getSession().getAttribute("loginUser"); if(user==null || "".equals(user)){ //如果用戶沒有登錄,那么將會直接跳轉(zhuǎn)到登陸頁面 ((HttpServletResponse)resp).getWriter().write("<scrjsp'</script>"); // ((HttpServletResponse)resp).sendRedirect("/index.jsp"); }else{ chain.doFilter(req, resp); } } @Override public void init(FilterConfig arg0) throws ServletException { } }上面的這個過濾器就會過濾掉所有未登陸的用戶,讓TA們跳轉(zhuǎn)到登陸頁面去登陸。如果要這個登陸過濾器起作用,還需要在web.xml文件中進(jìn)行配置:
[html] view plain copy print?<!-- 配置過濾器 --> <filter> <filter-name>LoginFilter</filter-name> <filter-class>com.common.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/user/*</url-pattern> </filter-mapping> 此處表示這個任何用戶訪問/user/*下面的路徑將會通過此過濾器,如果沒有登陸,SESSION中沒有user,那么將會跳轉(zhuǎn)到登陸頁面。如果需要對多個地址進(jìn)行配置(在SSM框架中,需要對每個控制器進(jìn)行配置),那么正確的配置方法是(N個一樣的):[html] view plain copy print?<filter> <filter-name>LoginFilter</filter-name> <filter-class>com.common.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/user/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/abc/*</url-pattern> </filter-mapping> 不知道大家有沒有注意到上面過濾器的這行被注釋的代碼,正常情況下使用此代碼就可以完成跳轉(zhuǎn)任務(wù):((HttpServletResponse)resp).sendRedirect("/index.jsp");
而下面這行代碼是:
((HttpServletResponse)resp).getWriter().write("<script>window.parent.location.href='/index.jsp'</script>");
最下面這行代碼就是為了解決我這次遇到的小問題的。因?yàn)樾枰{(diào)整的頁面是frameset框架的,所以有很多鏈接定義為跳轉(zhuǎn)到框架下的某個地方,這樣如果使用上面的那種跳轉(zhuǎn),將會是局部跳轉(zhuǎn),達(dá)不到應(yīng)有的效果,只有使用下面的方式返回一句js代碼,然后執(zhí)行,整體跳轉(zhuǎn),這樣才能滿足效果。
新聞熱點(diǎn)
疑難解答