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方法之前執行 用於身份認證、身份授權 比如身份認證,如果認證不通