當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
Spring MVC拦截器配置以及统一登陆校验实现
生活随笔
收集整理的這篇文章主要介紹了
Spring MVC拦截器配置以及统一登陆校验实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
攔截器概念
這里引用百度百科里面的說法,java里的攔截器是動態攔截Action調用的對象。它提供了一種機制可以使開發者可以定義在一個action執行的前后執行的代碼,也可以在一個action執行前阻止其執行,同時也提供了一種可以提取action中可重用部分的方式。在AOP(Aspect-Oriented Programming)中攔截器用于在某個方法或字段被訪問之前,進行攔截然后在之前或之后加入某些操作
用途
配置Spring MVC攔截器
配置 dispatch-servlet.xml
<mvc:interceptors><!-- 如果在interceptors中配置bean,那么所有定義在這里的bean都會被攔截--><!--<bean></bean>--><mvc:interceptor><mvc:mapping path="/manage/**"/><!--過濾登陸死循環情況--><!--<mvc:exclude-mapping path="/manage/login.do"/>--><bean class="com.test.controller.common.interceptor.AuthorityInterceptor"/></mvc:interceptor></mvc:interceptors>分析配置中的節點
- interceptors節點:這個節點是SpringMVC的攔截器集配置節點,在這個節點里面我們可以聲明多個interceptor
- interceptor節點:這個節點是配置攔截路徑以及你攔截器實現類的節點
- mapping節點:符合mapping路徑匹配的請求都會經過攔截器
- exclude-mapping節點:符合exclude-mapping路徑匹配的請求都不會經過攔截器
- bean節點:配置我們自己的實現類,實現類要實現HandlerInterceptor接口
path情況分析
spring MVC攔截器請求流程
spring請求流程具體如下:
spring請求流程圖
實現攔截器示例(java)
這是自己實現的一個統一登陸校驗攔截器,具體代碼如下,寫代碼之前一定要根據自己的實際情況,把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();//解析參數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的這個參數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")){//登陸的時候不能把參數的日志也打上,如果日志泄露,賬號密碼就會泄露log.info("權限攔截器攔截到的請求 className{} methodName{}",className,methodName);return true;}//判斷登陸User user = session.getAttribute(Const.CURRENT_USER);if(user == null )){//未登錄,返回false,不會調用controller里面的方法//response必須重置重置,否則會寶getWritter() has already been called for this response//這里我們手動接管了SpringMVC原生的返回,而是托管到攔截器中返回response.reset();//這是返回編碼,否者會亂碼response.setCharacterEncoding("UTF-8");//設置返回值類型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"));} }總結
以上是生活随笔為你收集整理的Spring MVC拦截器配置以及统一登陆校验实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: gsettings命令使用简介
- 下一篇: mybatis学习(46):二级缓存被刷