1. 程式人生 > >springMVC全域性異常以及攔截器,過濾器不能拿到請求的方法

springMVC全域性異常以及攔截器,過濾器不能拿到請求的方法

一、springMVC全域性異常有點

         若有很多異常沒有被包裝,那麼我們專案的類,包名,sql語句,資料庫ip等關鍵資訊都會暴露。

二、spring以及springMVC包掃描進行隔離。

         1.springMVC應該掃描controller,spring掃描其他bean

         2.coding:

spring配置檔案:排除controller註解

<context:component-scan base-package="com.mmall" annotation-config="true">

        <context:exclude-filter type="annotation"  expression= "org.springframework.stereotype.Controller" />

</context:component-scan>

springMVC配置檔案:關閉預設掃描,只掃描controller註解

<context:component-scan base-package="com.mmall.controller" annotation-config="true" use-default-filters="false">

        <context:include-filter type="annotation"  expression = "org.springframework.stereotype.Controller"/>

</context:component-scan>

三、使用@Component註解

         1.預設控制層用@controller,服務層用@service,Dao層用@Repository,其他一律使用@Component。

四、ModelAndView

         不在作用於伺服器轉發就是跳轉頁面,使之返回Json物件,對異常進行重寫包裝。

五、SpringMVC全域性異常流程圖

         包裝的異常即ModelAndView物件。

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.stereotype.Component;

import org.springframework.web.servlet.HandlerExceptionResolver;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

@Component

public class ExceptionResolver implements HandlerExceptionResolver{

         private static  final Logger log = LoggerFactory.getLogger(ExceptionResolver.class);

    public ModelAndView resolveException(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) {

       //使用日誌打印出異常

        log.error("{} Exception",httpServletRequest.getRequestURI(),e);

       //使用jackson封裝異常

        ModelAndView modelAndView = new ModelAndView(new MappingJackson2JsonView());

        //使用jackson2.x的時候使用MappingJackson2JsonView,目前使用的是1.9。

        modelAndView.addObject("status",ResponseCode.ERROR.getCode());

        modelAndView.addObject("msg","介面異常,詳情請檢視服務端日誌的異常資訊");

        modelAndView.addObject("data",e.toString());

        return modelAndView;

    }

}

六、springMVC攔截器流程圖

         1.攔截器配置

         <mvc:mappingpath=“”>

         /**表示所有路徑及其子路徑

         /*  表示當前路徑,但不包括子路徑

         /web專案的根目錄請求

<mvc:interceptors>

    <mvc:interceptor>

         <mvc:mapping path="/manage/**"/>

         <mvc:exclude-mapping path="/manage/user/login.do"/>

         <bean class="com.mmall.controller.common.interceptor.AuthorityInterceptor" />

    </mvc:interceptor>

</mvc:interceptors>

         2.攔截器執行流程

         3.重置HttpServletResponse

         4.解決攔截登陸迴圈問題

七、HandlerInterceptor(preHandler(),postHandler(),afterHandler())

PreHandler返回false那麼不進入Controller,直接返回。返回true,跳到postHandler,最後調到afterHandler。

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        log.info("preHandle");

        //請求中Controller中的方法名

        HandlerMethod handlerMethod = (HandlerMethod)handler;

        //解析HandlerMethod

        String methodName = handlerMethod.getMethod().getName();

        String className = handlerMethod.getBean().getClass().getSimpleName();

        //解析引數,具體的引數key以及value是什麼,我們列印日誌

        StringBuffer requestParamBuffer = 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 = StringUtils.EMPTY;

            //request這個引數的map,裡面的value返回的是一個String[]

            Object obj = entry.getValue();

            if(obj instanceof String[]){

                String[] strs = (String[])obj;

                mapValue = Arrays.toString(strs);

            }

            requestParamBuffer.append(mapKey).append("=").append(mapValue);

        }

        if(StringUtils.equals(className,"UserManageController") && StringUtils.equals(methodName,"login")){

            log.info("許可權攔截器攔截到請求,className:{},methodName:{}",className,methodName);

            //如果是攔截到登入請求,不列印引數,因為引數裡面有密碼,全部會列印到日誌中,防止日誌洩露

            return true;

        }

        log.info("許可權攔截器攔截到請求,className:{},methodName:{},param:{}",className,methodName,requestParamBuffer.toString());

        User user = null;

        String loginToken = CookieUtil.readLoginToken(request);

        if(StringUtils.isNotEmpty(loginToken)){

            String userJsonStr = RedisShardedPoolUtil.get(loginToken);

            user = JsonUtil.string2Obj(userJsonStr,User.class);

        }

        if(user == null || (user.getRole().intValue() != Const.Role.ROLE_ADMIN)){

            //返回false.即不會呼叫controller裡的方法

            response.reset();//這裡要新增reset,否則報異常 getWriter() has already been called for this response.

            response.setCharacterEncoding("UTF-8");//geelynote 這裡要設定編碼,否則會亂碼

            response.setContentType("application/json;charset=UTF-8");//geelynote 這裡要設定返回值的型別,因為全部是json介面。

            PrintWriter out = response.getWriter();

            out.print(JsonUtil.obj2String(ServerResponse.createByErrorMessage("攔截器攔截,使用者無許可權操作")));

            out.flush();

            out.close();//geelynote 這裡要關閉

            return false;

        }

        return true;

    }

相關推薦

springMVC全域性異常以及攔截過濾器不能請求方法

一、springMVC全域性異常有點         若有很多異常沒有被包裝,那麼我們專案的類,包名,sql語句,資料庫ip等關鍵資訊都會暴露。二、spring以及springMVC包掃描進行隔離。         1.springMVC應該掃描controller,spri

struts2攔截的執行原理以及攔截過濾器的區別

struts2攔截器的執行原理:     注意:struts2.1.3以後的版中下邊這張圖中的FilterDispatcher已經改為StrutsPrepareAndExecuteFilter     1.首先伺服器接受請求,首先載入web.xml,通過核心控制器Stru

jsp四大作用域以及攔截過濾器分析

jsp中四個作用域的區別   application 在所有應用程式中有效   session 在當前會話中有效   request 在當前請求中有效   page 在當前頁面有效 首先要宣告一點,所謂"作用域"就是"資訊共享的範圍",也就是說一個資訊能夠在多大的範圍內有效

攔截過濾器監聽器各有什麼作用?

大家好,我是IT修真院武漢分院第15期的學員,一枚正直純潔善良的java程式設計師今天給大家分享一下,修真院官網Java任務五,深度思考中的知識點——攔截器,過濾器,監聽器1.背景介紹攔截器Interceptor是動態攔截Action呼叫的物件。它提供了一種機制可以使開發者可

okhttp新增自定義攔截封裝公共請求引數

okhttp 進行網路請求 /** * date:2018/11/22 * author:QMY(QMY) * function: */ public class OkhttpUtils { Handler handler; OkHttpClient o

springboot中新增攔截mapping等的方法

@Configuration public class WebJavaBeanConfiguration { /** * 日誌攔截器 */ @Autowired

Springmvc異常攔截、格式轉換、國際化處理配置文件以及java類

2.3 gin ltm erb nal ges contex utf on() 1.springmvc配置文件自動註解設置。 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.sp

SpringMVC中的攔截過濾器的區別、處理異常

1. SpringMVC中的攔截器(Interceptor) 1.1. 作用 攔截器是執行在DispatcherServlet之後,在每個Controller之前的,且執行結果可以選擇放行或攔截! 除此以外,攔截器還會執行在Controller之後,關於攔截器,在處理某一個請求時,最多有3次執行!只不過

攔截過濾器區別Struts2與SpringMVC的區別

攔截器和過濾器 1.攔截器是基於java反射機制的,而過濾器是基於函式回撥的; 2.攔截器不依賴於servlet容器,而過濾器依賴於servlet容器; 3.攔截器只能對Action請求起作用,而過濾器則可以對幾乎所有請求起作用; 4.攔截器可以訪問Action上下文、值棧裡的物件,而過

springMVC攔截過濾器總結

cal .org 文件 bat system als request ping blog 攔截器: 用來對訪問的url進行攔截處理 用處: 權限驗證,亂碼設置等 spring-mvc.xml文件中的配置: <beans xmlns="http://www.sprin

一些理解-過濾器攔截ajax提交後不跳轉document.location.href無效回調函數。

客戶 發送 觀察 要去 jaxb 源碼 流程 type類 攔截器的工作流程 1.struts2中過濾器和攔截器的工作流程: request-->執行自定義過濾器doFilter方法中的chain.doFilter()方法前的代碼-->執行默認過濾器doFilte

攔截過濾器的區別以及兩者的執行順序?

過濾器,是在java web中,你傳入的request,response提前過濾掉一些資訊,或者提前設定一些引數,然後再傳入servlet或者struts的 action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果使用者沒有登陸都過濾掉),或者在傳入servlet或者 s

springboot-監聽器過濾器攔截aop,自定義註解

springboot基礎-監聽器,過濾器,攔截器,aop,自定義註解 文章目錄 springboot基礎-監聽器,過濾器,攔截器,aop,自定義註解 1.監聽器 2.過濾器 3.攔截器 4.aop 5.自定義註解

springboot分別使用過濾器攔截切片

1,springboot使用過濾器; 第一步:自定義一個類實現Filter類,然後在類上面使用@Component自定義為一個bean即可,這種方式最簡便,但是有時候我們使用第三方過濾器,人家的程式碼不能改動,我們又不能在它上面使用註解,那麼springboot怎麼使用它呢?如下: 定

spring 框架下如何通過攔截過濾器讀取request裡的內容

當我們用spring 攔截器實現許可權校驗的時候,往往我們需要從request中獲取一些資料進行校驗,但是當我們在攔截器獲取到資料,getinputStream,那麼在後續的action即:controller中我們獲取不到request,這是為什麼呢?因為java.util

springmvc設定servelet、攔截(interceptor)、監聽器(listener)、過濾器(filter),型別轉換

1.攔截器<mvc:interceptors>   <!-- 登入攔截器 -->   <mvc:interceptor>    <mvc:mapping path="/**" /> <

SpringBoot攔截過濾器中使用流讀取引數後controller中註解讀取不到引數

今天出現這樣一個問題: 現在開發的專案是基於SpringBoot的maven專案,有個需求就是要加一個攔截器和過濾器,在攔截器中我需要獲取到前端傳過來的json資料,按照常理來說,獲取請求引數使用request.getParameter()方法就可以,但是不知

五十、Filter過濾器,Interceptor攔截ControllerAdvice,Aspect切片

Filter過濾器,Interceptor攔截器,ControllerAdvice,Aspect切片 上圖為在web專案中,在處理request請求時得處理順序 在專案中我們改怎麼使用呢?  Filter過濾器 /** * Created by GAOMINGQIA

攔截過濾器的區別以及他們的配置

1、 過濾器,是在java web中,你傳入的request,response提前過濾掉一些資訊,或者提前設定一些引數,然後再傳入servlet或者struts的 action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果使用者沒有登陸都過濾掉),

springmvc和springboot分別設定攔截列印記憶體資訊訪問時間等日誌資訊

SpringMVC提供了一個攔截器介面供我們呼叫:HandlerInterceptor,這個介面有三個待實現的方法: preHandle方法 進入 Handler方法之前執行 用於身份認證、身份授權 比如身份認證,如果認證不通