當(dāng)前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring MVC拦截器配置以及统一登陆校验实现
生活随笔
收集整理的這篇文章主要介紹了
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)行攔截然后在之前或之后加入某些操作
用途
配置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情況分析
spring MVC攔截器請求流程
spring請求流程具體如下:
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gsettings命令使用简介
- 下一篇: gradle idea java ssm