以下代碼是繼承OncePerRequestFilter實現登錄過濾的代碼:
1 package com.test.spring.filter; 2 3 import java.io.IOException; 4 import java.io.PrintWriter; 5 6 import javax.servlet.FilterChain; 7 import javax.servlet.ServletException; 8 import javax.servlet.http.HttpServletRequest; 9 import javax.servlet.http.HttpServletResponse; 10 11 import org.springframework.web.filter.OncePerRequestFilter; 12 13 /** 14 * 登錄過濾 15 * 16 * @author geloin 17 * @date 2012-4-10 下午2:37:38 18 */ 19 public class SessionFilter extends OncePerRequestFilter { 20 21 /* 22 * (non-Javadoc) 23 * 24 * @see 25 * org.springframework.web.filter.OncePerRequestFilter#doFilterInternal( 26 * javax.servlet.http.HttpServletRequest, 27 * javax.servlet.http.HttpServletResponse, javax.servlet.FilterChain) 28 */ 29 @Override 30 protected void doFilterInternal(HttpServletRequest request, 31 HttpServletResponse response, FilterChain filterChain) 32 throws ServletException, IOException { 33 34 // 不過濾的uri 35 String[] notFilter = new String[] { "login.html", "index.html" }; 36 37 // 請求的uri 38 String uri = request.getRequestURI(); 39 40 // uri中包含background時才進行過濾 41 if (uri.indexOf("background") != -1) { 42 // 是否過濾 43 boolean doFilter = true; 44 for (String s : notFilter) { 45 if (uri.indexOf(s) != -1) { 46 // 如果uri中包含不過濾的uri,則不進行過濾 47 doFilter = false; 48 break; 49 } 50 } 51 if (doFilter) { 52 // 執行過濾 53 // 從session中獲取登錄者實體 54 Object obj = request.getSession().getAttribute("loginedUser"); 55 if (null == obj) { 56 // 如果session中不存在登錄者實體,則彈出框提示重新登錄 57 // 設置request和response的字符集,防止亂碼 58 request.setCharacterEncoding("UTF-8"); 59 response.setCharacterEncoding("UTF-8"); 60 PrintWriter out = response.getWriter(); 61 String loginPage = "...."; 62 StringBuilder builder = new StringBuilder(); 63 builder.append("<script type=\"text/javascript\">"); 64 builder.append("alert('網頁過期,請重新登錄!');"); 65 builder.append("window.top.location.href='"); 66 builder.append(loginPage); 67 builder.append("';"); 68 builder.append("</script>"); 69 out.print(builder.toString()); 70 } else { 71 // 如果session中存在登錄者實體,則繼續 72 filterChain.doFilter(request, response); 73 } 74 } else { 75 // 如果不執行過濾,則繼續 76 filterChain.doFilter(request, response); 77 } 78 } else { 79 // 如果uri中不包含background,則繼續 80 filterChain.doFilter(request, response); 81 } 82 } 83 84 }
寫完過濾器后,需要在web.xml中進行配置:
<filter> <filter-name>sessionFilter</filter-name> <filter-class>com.test.spring.filter.SessionFilter</filter-class> </filter> <filter-mapping> <filter-name>sessionFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>