相信大家對攔截器和切面的概念已經不陌生了,本文我們就看一些在應用市場中,攔截器和切面的使用是怎樣的。
攔截器的使用:每次接收到某個請求之前,都會調用此攔截器中的方法,其中preHandle方法如果return true,表示繼續調用對應的controller,如果return false,
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
public class CheckLoginInterceptor implements HandlerInterceptor { private Logger logger = Logger.getLogger(CheckLoginInterceptor. class ); private static String TOKEN_VALID_MSG ; static { TOKEN_VALID_MSG=JsonUtil.writeObject2JSON( new AMSResultVO(CodeNum.TOKEN_VALID, CodeMessage.TOKEN_VALID)); } public Boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //request.getMethod獲取請求是get,post等 if ( "OPTIONS" .equals(request.getMethod())) { // 指定允許其他域名訪問 response.setHeader( "Access-Control-Allow-Origin" , "*" ); // 響應類型 response.setHeader( "Access-Control-Allow-Methods" , "POST, GET, OPTIONS, DELETE" ); // 響應頭設置 response.setHeader( "Access-Control-Allow-Headers" , "Content-Type, x-requested-with, X-Custom-Header" ); response.setStatus( 204 ); return true ; } // 獲取從header中得到的數據 String userName = request.getHeader(CommonConsts.PARAM_USER_NAME); String userToken = request.getHeader(CommonConsts.PARAM_USER_TOKEN); Boolean result = true ; String method = request.getRequestURI(); if (method.equals( "/ams/fileUpload" )) { return true ; } if (StringUtil.isEmpty(userName) || StringUtil.isEmpty(userToken)) { result = false ; } else { result = TokenUtil.validToken(userName, userToken); } // token校驗失敗 if (!result) { response.setContentType( "text/html;charset=UTF-8" ); response.getWriter().print(TOKEN_VALID_MSG); response.getWriter().flush(); response.getWriter().close(); } return result; } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } } |
切面的使用:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//壞繞通知:需要攜帶ProceedingJoinPoint類型的參數 //環繞通知類似于動態代理的全過程:ProceedingJoinPoint類型的參數可以決定是否執行目標方法 //且環繞通知必須有返回值,返回值即目標方法的返回值。 @Around ( "execution(* com.sowell.controller.*Controller.*(..))" ) public Object aroundMethod(ProceedingJoinPoint pjd) { Object result = null ; String methodName = pjd.getSignature().getName(); Object args = Arrays.asList(pjd.getArgs()); //執行目標方法 try { logger.info( "request channels begin, param{pageNum:" + methodName + ", pageSize:" + args); //前置通知,表示在此之前的代碼會在調用controller之前調用 result = pjd.proceed(); recordOprationLog(result, methodName, result); //后置通知 logger.info( "Arround:The method " + methodName+ " ends" ); } catch (Throwable e) { e.printStackTrace(); //異常通知 logger.error( "Arround:The method " + methodName+ "occurs exception:" +e); //throw new RuntimeException(e); //不拋出異常的話,異常就被上面抓住,執行下去,返回result,result值為null,轉換為int } //返回通知 logger.info( "Arround:The method " + methodName+ " ends with the Result " + result); return result; } |
總結
以上就是本文關于應用市場中Java攔截器和切面的使用實例詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!
原文鏈接:http://blog.csdn.net/qq_28893679/article/details/72841958