昨天剛剛完成老師布置的一個Web小項目,項目中用到了兩個過濾器(編碼過濾、登錄過濾)
比如電商網頁中有些不需要登錄也能訪問(首頁、商品詳細信息...),其他都需要過濾在會話作用域(session)中是否含有個人信息對象
示例代碼:
package com.star.miniShop.Filter; import java.io.IOException; import java.util.ArrayList; import java.util.List; 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; @WebFilter("/*") public class LoginFiter implements Filter{ //實例化一個靜態的集合(這里可以改用map集合,提高性能,每次過濾可以不用for匹配) private static List<String> urls = new ArrayList<>(); //靜態代碼塊中向集合中存放所有可以放行的請求或網頁地址(不用賬號密碼即可訪問) static { urls.add("/logining"); urls.add("/shopLogin.html"); urls.add("/css"); urls.add("/js"); urls.add("/images"); urls.add("/shopHome.html"); urls.add("/HomeShop"); urls.add("/Searchs"); urls.add("/regist"); urls.add("/shopRegist.html"); } @Override public void destroy() { // TODO Auto-generated method stub } /** * 攔截請求,看看用戶是否登陸,如果沒有登陸, * 則跳轉回登錄頁面,否則就放行 */ @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { //注意:ServletRequest是HttpServletRequest父接口,因此需要強轉 //同樣,ServletResponse是HttpServletResponse父接口,因此需要強轉 HttpServletRequest req=(HttpServletRequest)request; HttpServletResponse res=(HttpServletResponse)response; //得到當前頁面所在目錄下全名稱 String urlPattern=req.getServletPath(); //得到頁面所在服務器的絕對路徑 String path = req.getRequestURI(); //System.out.println(urlPattern); for (String url : urls) { if(url.equals(urlPattern) || path.contains(url)) { // System.out.println("reaource do chain..."); chain.doFilter(request, response); //防止重復響應 return; } } //如果person為null,表示沒有登錄 if(req.getSession().getAttribute("person")==null) { res.sendRedirect("shopLogin.html"); }else { //放行 chain.doFilter(request, response); } } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }