——過濾器使用已經很久了,今天遇到了一個小問題,也就想順便寫一個關于過濾器的博文,記錄一下自己使用的感受。
實際上,Filter與Servlet及其相似,區別只是FIlter的doFilter()方法里多了一個FilterChain的參數,通過該參數可以控制是否放行用戶的請求。網站有了過濾器十分的方便,可以通過過濾器來過濾這個用戶是否已經登陸,如果沒有登陸,那么將限制TA的訪問權限,而且過濾器的設置以及配置都比較簡單。下面通過一個登陸過濾器的代碼簡單說一下過濾器的使用:
[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)){ //如果用戶沒有登錄,那么將會直接跳轉到登陸頁面 ((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們跳轉到登陸頁面去登陸。如果要這個登陸過濾器起作用,還需要在web.xml文件中進行配置:
[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,那么將會跳轉到登陸頁面。如果需要對多個地址進行配置(在SSM框架中,需要對每個控制器進行配置),那么正確的配置方法是(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> 不知道大家有沒有注意到上面過濾器的這行被注釋的代碼,正常情況下使用此代碼就可以完成跳轉任務:((HttpServletResponse)resp).sendRedirect("/index.jsp");
而下面這行代碼是:
((HttpServletResponse)resp).getWriter().write("<script>window.parent.location.href='/index.jsp'</script>");
最下面這行代碼就是為了解決我這次遇到的小問題的。因為需要調整的頁面是frameset框架的,所以有很多鏈接定義為跳轉到框架下的某個地方,這樣如果使用上面的那種跳轉,將會是局部跳轉,達不到應有的效果,只有使用下面的方式返回一句js代碼,然后執行,整體跳轉,這樣才能滿足效果。
|
新聞熱點
疑難解答