濾器實現登錄攔截處理
一、什么是過濾器
過濾器是處于客戶端與服務器資源文件之間的一道過濾網(駐留在服務器端的Web組件),在訪問資源文件之前,通過一系列的過濾器對請求進行修改、判斷等,把不符合規則的請求在中途攔截或修改。也可以對響應進行過濾,攔截或修改響應
二、工作原理及生命周期
舉個例子 當我們登錄系統可以訪問到頁面,當退出登錄后,要訪問就必須重新登錄,這就是過濾器起到的作用。當我們訪問某個接口時,過濾器會攔截請求,判斷當前用戶是否是登錄狀態,若登錄則放行訪問,若未登錄則返回指定頁面(通常為登錄頁或一個客戶友好的提示頁)
這個過程包含了過濾器的生命周期:
1.實例化
2.初始化
3.執行過濾操作(包括訪問前對request操作和返回時對response的操作處理)
4.銷毀
三、過濾器使用
在springboot項目簡單使用過濾器進行登錄攔截處理
1.實現過濾器
public class MyFilter implements Filter { private static final String CURRENT_USER = "current_user"; //配置白名單 protected static List<Pattern> patterns = new ArrayList<Pattern>(); //靜態代碼塊,在虛擬機加載類的時候就會加載執行,而且只執行一次 static { patterns.add(Pattern.compile("/index")); patterns.add(Pattern.compile("/login")); patterns.add(Pattern.compile("/register")); } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; HttpServletResponseWrapper wrapper = new HttpServletResponseWrapper(httpResponse); String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length()); if (isInclude(url)) { //在白名單中的url,放行訪問 filterChain.doFilter(httpRequest, httpResponse); return; } if (SessionUtils.getSessionAttribute(CURRENT_USER) != null) { //若為登錄狀態 放行訪問 filterChain.doFilter(httpRequest, httpResponse); return; } else { //否則默認訪問index接口 wrapper.sendRedirect("/index"); } } @Override public void destroy() { } //判斷當前請求是否在白名單 private boolean isInclude(String url) { for (Pattern pattern : patterns) { Matcher matcher = pattern.matcher(url); if (matcher.matches()) { return true; } } return false; } }
2.注冊過濾器
@Configuration public class WebConfig { /** * 配置過濾器 * @return */ @Bean public FilterRegistrationBean someFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(myFilter()); //攔截/*的訪問 多級匹配(springboot 過濾器/*以及匹配 /**多級匹配) registration.addUrlPatterns("/*"); registration.setName("myFilter"); return registration; } /** * 創建一個bean * @return */ @Bean(name = "myFilter") public Filter myFilter() { return new MyFilter(); } }
3.運行項目
訪問/index,會發現沒有被攔截,返回正確結果
在未登錄狀態,訪問/update接口,會被攔截跳轉至/index頁
在登錄狀態,訪問/update接口,可以訪問
這里也可以在程序debug看下。簡單的過濾器功能完成。
常用過濾器及其使用后續再來學習。
filter簡易實現登錄功能攔截
暑期項目實習第八課, filter簡易實現登錄功能攔截
LoginFliter
public class LoginFliter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; HttpSession session = request.getSession(); User user = (User)session.getAttribute("user"); String uri = request.getRequestURI(); System.out.println(uri.indexOf("findAll.do")); System.out.println(uri.indexOf("login.do")); if(user==null && uri.indexOf("login.do")==-1){ response.sendRedirect(request.getContextPath()+"/"); }else { filterChain.doFilter(request,response); } } @Override public void destroy() { } }
controller
@RequestMapping("/login.do") public ModelAndView login(User user, HttpSession session){ boolean flag = userService.login(user.getName(),user.getPassword()); ModelAndView modelAndView = new ModelAndView(); if(flag){ session.setAttribute("user",user); modelAndView.setViewName("../ok"); }else { modelAndView.setViewName("../failure"); } return modelAndView; }
結果圖
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。
原文鏈接:https://blog.csdn.net/ChengChengxn/article/details/88619575