日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring MVC拦截器配置以及统一登陆校验实现

發(fā)布時間:2023/12/10 javascript 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring MVC拦截器配置以及统一登陆校验实现 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

攔截器概念

這里引用百度百科里面的說法,java里的攔截器是動態(tài)攔截Action調(diào)用的對象。它提供了一種機(jī)制可以使開發(fā)者可以定義在一個action執(zhí)行的前后執(zhí)行的代碼,也可以在一個action執(zhí)行前阻止其執(zhí)行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中攔截器用于在某個方法或字段被訪問之前,進(jìn)行攔截然后在之前或之后加入某些操作

用途

  • 日志記錄:記錄請求的一些信息和請求參數(shù)
  • 權(quán)限校驗(yàn):如登陸校驗(yàn),管理員權(quán)限校驗(yàn)
  • 性能監(jiān)控:監(jiān)控請求處理的時間
  • 通用行為:如讀取cookie信息等
  • 配置Spring MVC攔截器

    配置 dispatch-servlet.xml

    <mvc:interceptors><!-- 如果在interceptors中配置bean,那么所有定義在這里的bean都會被攔截--><!--<bean></bean>--><mvc:interceptor><mvc:mapping path="/manage/**"/><!--過濾登陸死循環(huán)情況--><!--<mvc:exclude-mapping path="/manage/login.do"/>--><bean class="com.test.controller.common.interceptor.AuthorityInterceptor"/></mvc:interceptor></mvc:interceptors>
    分析配置中的節(jié)點(diǎn)
    • interceptors節(jié)點(diǎn):這個節(jié)點(diǎn)是SpringMVC的攔截器集配置節(jié)點(diǎn),在這個節(jié)點(diǎn)里面我們可以聲明多個interceptor
    • interceptor節(jié)點(diǎn):這個節(jié)點(diǎn)是配置攔截路徑以及你攔截器實(shí)現(xiàn)類的節(jié)點(diǎn)
      • mapping節(jié)點(diǎn):符合mapping路徑匹配的請求都會經(jīng)過攔截器
      • exclude-mapping節(jié)點(diǎn):符合exclude-mapping路徑匹配的請求都不會經(jīng)過攔截器
      • bean節(jié)點(diǎn):配置我們自己的實(shí)現(xiàn)類,實(shí)現(xiàn)類要實(shí)現(xiàn)HandlerInterceptor接口
    path情況分析
  • 如果要攔截同一個controller下的所有的請求,如/manage/***.do,path應(yīng)該為 /manage/*
  • 如果要攔截請求路徑為manage包下不同controller的所有請求,如 /manage/product/b.do,/manage/order/list.do,path應(yīng)該為/manage/**
  • 如果想要某個請求不走攔截器,那么可以配置exclude-mapping,path應(yīng)該為具體的url,準(zhǔn)確到方法,如/manage/login.do
  • spring MVC攔截器請求流程
    spring請求流程具體如下:
  • 瀏覽器/客戶端發(fā)送請求給我們的服務(wù)器
  • 請求來到Spring的dispatchServlet進(jìn)行請求分發(fā)
  • dispatchServlet檢查我們在dispatch-servlet.xml定義好的規(guī)則,按照規(guī)則判斷請求是否走攔截器
  • 如果判斷請求不走攔截器,請求直接分發(fā)到對應(yīng)的controller(這里默認(rèn)有對應(yīng)的controller)
  • 如果判斷請求是走攔截器的,就走我們自己實(shí)現(xiàn)的攔截器,驗(yàn)證請求,通過就放行,走到controller,反之則提前返回給客戶端
  • spring請求流程圖

    實(shí)現(xiàn)攔截器示例(java)

    這是自己實(shí)現(xiàn)的一個統(tǒng)一登陸校驗(yàn)攔截器,具體代碼如下,寫代碼之前一定要根據(jù)自己的實(shí)際情況,把dispatch-servlet.xml中的攔截器路徑配置好,不然攔截器無法正常工作

    @Slf4j public class AuthorityInterceptor implements HandlerInterceptor{@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {log.info(("preCompletion"));//請求中controller的方法名HandlerMethod handlerMethod = (HandlerMethod)handler;//解析handlermethod//獲取方法名String methodName = handlerMethod.getMethod().getName();//獲取類名,simplename是獲取名字不帶包名,name是帶包名的String className = handlerMethod.getBean().getClass().getSimpleName();//解析參數(shù)StringBuffer stringBuffer = new StringBuffer();Map paramMap = request.getParameterMap();Iterator it = paramMap.entrySet().iterator();while ((it.hasNext())){Map.Entry entry = (Map.Entry) it.next();String mapKey = (String) entry.getKey();String mapValue = "";//request的這個參數(shù)map的value返回的是一個String[]Object obj = entry.getValue();if (obj instanceof String[]){String[] strs = (String[])obj;mapValue = Arrays.toString(strs);}stringBuffer.append(mapKey).append("=").append(mapValue);}//判斷登陸,如果是登陸就放行if(StringUtils.equals(className, UserManageController.class.getSimpleName())&&StringUtils.equals(methodName,"login")){//登陸的時候不能把參數(shù)的日志也打上,如果日志泄露,賬號密碼就會泄露log.info("權(quán)限攔截器攔截到的請求 className{} methodName{}",className,methodName);return true;}//判斷登陸User user = session.getAttribute(Const.CURRENT_USER);if(user == null )){//未登錄,返回false,不會調(diào)用controller里面的方法//response必須重置重置,否則會寶getWritter() has already been called for this response//這里我們手動接管了SpringMVC原生的返回,而是托管到攔截器中返回response.reset();//這是返回編碼,否者會亂碼response.setCharacterEncoding("UTF-8");//設(shè)置返回值類型response.setContentType("application/json;chartset=UTF-8");PrintWriter out = response.getWriter();out.print("你想返回的錯誤信息")}out.flush();out.close();return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {log.info(("postCompletion"));}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {log.info(("afterCompletion"));} }

    總結(jié)

    以上是生活随笔為你收集整理的Spring MVC拦截器配置以及统一登陆校验实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。