基于spring自动注入及AOP的表单二次提交验证
生活随笔
收集整理的這篇文章主要介紹了
基于spring自动注入及AOP的表单二次提交验证
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
這幾天在網(wǎng)上閑逛,看到了幾個關(guān)于spring的token二次提交問題,受到不少啟發(fā),于是自己動手根據(jù)自己公司的項目框架結(jié)構(gòu),制作了一個基于spring自動注入加上AOP的表單二次提交。
原理:建立兩個注解類,一個進行token的設置,一個進行token的驗證。在一個Aspect中,對這兩個注解進行捕獲并進行相應的驗證。
廢話不多說,下面是代碼:
Token注解類,標記需要設置token的方法。
@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) //設定此注解對應的是方法。 public @interface Token { } TokenValid注解類,標記需要驗證token的方法。@Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface TokenValid { }
TokenAspect類,對上面兩個注解標識的方法的訪問進行捕獲并處理。?
?
@Aspect @Component public class TokenAspect {@Around("@annotation(token)") //可以直接捕獲下面這個方法中參數(shù)所設定的注解類型public void addToken(ProceedingJoinPoint joinPoint, Token token) throws Throwable{Object[] args = joinPoint.getArgs();String className = joinPoint.getTarget().getClass().getName();for(Object a : args){if(a != null && a instanceof HttpServletRequest){HttpServletRequest request = (HttpServletRequest)a;HttpSession session = request.getSession(true);String flag = MD5Eencryption.md5_32(className + new Date().getTime()); //創(chuàng)建一個token的flagsession.setAttribute("TokenFlag" + className, flag);request.setAttribute("token", flag);joinPoint.proceed();}}}@Around("@annotation(tokenValid)")public void checkToken(ProceedingJoinPoint joinPoint, TokenValid tokenValid) throws Throwable{Object[] args = joinPoint.getArgs();String className = joinPoint.getTarget().getClass().getName();for(Object a : args){if(a != null && a instanceof HttpServletRequest){HttpServletRequest request = (HttpServletRequest)a;System.out.println(request.getRequestedSessionId());HttpSession session = request.getSession(true);Object sessionFlag = session.getAttribute("TokenFlag" + className);Object requestFlag = request.getParameter("token");if(sessionFlag != null &&sessionFlag.equals(requestFlag)){ //驗證結(jié)果一致,既為第一次提交,刪除會話中存儲的token,并繼續(xù)執(zhí)行方法。否則不做任何處理。session.removeAttribute("TokenFlag" + className);joinPoint.proceed();}}}} } 使用:
需要工程開啟spring的自動注入及AOP功能。
在需要設定token的方法前面增加注解:@Token,需要驗證token的方法前面增加注解:@TokenValid。例如:
前臺頁面的表單中,增加下面內(nèi)容來提交token以便TokenValid的驗證。
<input type="hidden" name="token" value="${requestScope.token}" /> 如果表單為二次提交,將不會執(zhí)行 @TokenValid標記的方法。
目前的問題:
1.局限了兩個調(diào)用方法必須有一個參數(shù)為HttpServletRequest的對象。否則無法對請求和會話進行處理。
2.如果二次提交,沒有返回提醒,直接返回的結(jié)果為空白頁面。
轉(zhuǎn)載于:https://my.oschina.net/wangr15/blog/151553
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的基于spring自动注入及AOP的表单二次提交验证的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 我对Linux输入输出重定向的小结
- 下一篇: Oracle 从入门到精通视频教程(11