您好,登錄后才能下訂單哦!
這篇文章主要介紹了java如何使用過(guò)濾器實(shí)現(xiàn)登錄攔截處理,具有一定借鑒價(jià)值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
過(guò)濾器是處于客戶端與服務(wù)器資源文件之間的一道過(guò)濾網(wǎng)(駐留在服務(wù)器端的Web組件),在訪問(wèn)資源文件之前,通過(guò)一系列的過(guò)濾器對(duì)請(qǐng)求進(jìn)行修改、判斷等,把不符合規(guī)則的請(qǐng)求在中途攔截或修改。也可以對(duì)響應(yīng)進(jìn)行過(guò)濾,攔截或修改響應(yīng)
舉個(gè)例子 當(dāng)我們登錄系統(tǒng)可以訪問(wèn)到頁(yè)面,當(dāng)退出登錄后,要訪問(wèn)就必須重新登錄,這就是過(guò)濾器起到的作用。當(dāng)我們?cè)L問(wèn)某個(gè)接口時(shí),過(guò)濾器會(huì)攔截請(qǐng)求,判斷當(dāng)前用戶是否是登錄狀態(tài),若登錄則放行訪問(wèn),若未登錄則返回指定頁(yè)面(通常為登錄頁(yè)或一個(gè)客戶友好的提示頁(yè))
這個(gè)過(guò)程包含了過(guò)濾器的生命周期:
1.實(shí)例化
2.初始化
3.執(zhí)行過(guò)濾操作(包括訪問(wèn)前對(duì)request操作和返回時(shí)對(duì)response的操作處理)
4.銷毀
在springboot項(xiàng)目簡(jiǎn)單使用過(guò)濾器進(jìn)行登錄攔截處理
1.實(shí)現(xiàn)過(guò)濾器
public class MyFilter implements Filter { private static final String CURRENT_USER = "current_user"; //配置白名單 protected static List<Pattern> patterns = new ArrayList<Pattern>(); //靜態(tài)代碼塊,在虛擬機(jī)加載類的時(shí)候就會(huì)加載執(zhí)行,而且只執(zhí)行一次 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,放行訪問(wèn) filterChain.doFilter(httpRequest, httpResponse); return; } if (SessionUtils.getSessionAttribute(CURRENT_USER) != null) { //若為登錄狀態(tài) 放行訪問(wèn) filterChain.doFilter(httpRequest, httpResponse); return; } else { //否則默認(rèn)訪問(wèn)index接口 wrapper.sendRedirect("/index"); } } @Override public void destroy() { } //判斷當(dāng)前請(qǐng)求是否在白名單 private boolean isInclude(String url) { for (Pattern pattern : patterns) { Matcher matcher = pattern.matcher(url); if (matcher.matches()) { return true; } } return false; } }
2.注冊(cè)過(guò)濾器
@Configuration public class WebConfig { /** * 配置過(guò)濾器 * @return */ @Bean public FilterRegistrationBean someFilterRegistration() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(myFilter()); //攔截/*的訪問(wèn) 多級(jí)匹配(springboot 過(guò)濾器/*以及匹配 /**多級(jí)匹配) registration.addUrlPatterns("/*"); registration.setName("myFilter"); return registration; } /** * 創(chuàng)建一個(gè)bean * @return */ @Bean(name = "myFilter") public Filter myFilter() { return new MyFilter(); } }
3.運(yùn)行項(xiàng)目
訪問(wèn)/index,會(huì)發(fā)現(xiàn)沒(méi)有被攔截,返回正確結(jié)果
在未登錄狀態(tài),訪問(wèn)/update接口,會(huì)被攔截跳轉(zhuǎn)至/index頁(yè)
在登錄狀態(tài),訪問(wèn)/update接口,可以訪問(wèn)
這里也可以在程序debug看下。簡(jiǎn)單的過(guò)濾器功能完成。
常用過(guò)濾器及其使用后續(xù)再來(lái)學(xué)習(xí)。
暑期項(xiàng)目實(shí)習(xí)第八課, filter簡(jiǎn)易實(shí)現(xiàn)登錄功能攔截
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() { } }
@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; }
感謝你能夠認(rèn)真閱讀完這篇文章,希望小編分享的“java如何使用過(guò)濾器實(shí)現(xiàn)登錄攔截處理”這篇文章對(duì)大家有幫助,同時(shí)也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識(shí)等著你來(lái)學(xué)習(xí)!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。