自定义注解 一时失言乱红尘 2022-07-20 15:18 297阅读 0赞 首先定义注解类: import java.lang.annotation.*; @Documented @Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME) public @interface Token { boolean save() default false; boolean remove() default false ; } 该注解类定义了两个方法,save与remove,其作用在后面的示例中可以看到。下面是该注解应用的拦截器: import com.jd.fastjson.JSON; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; import java.lang.reflect.Method; import java.util.HashMap; import java.util.Map; import java.util.UUID; public class TokenInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { if (handler instanceof HandlerMethod) { HandlerMethod handlerMethod = (HandlerMethod) handler; Method method = handlerMethod.getMethod(); Token annotation = method.getAnnotation(Token.class); if (annotation != null) { boolean needSaveSession = annotation.save(); if (needSaveSession) { request.getSession(false).setAttribute("token", UUID.randomUUID().toString()); } boolean needRemoveSession = annotation.remove(); if (needRemoveSession) { if (isRepeatSubmit(request)) { Map map = new HashMap(); map.put("message","请勿频繁提交!"); map.put("error","2"); try { PrintWriter printWriter = response.getWriter(); printWriter.println(JSON.toJSONString(map)); } catch (IOException e) { e.printStackTrace(); } return false; } request.getSession(false).removeAttribute("token"); } } return true; } else { try { return super.preHandle(request, response, handler); } catch (Exception e) { e.printStackTrace(); } } return false; } private boolean isRepeatSubmit(HttpServletRequest request) { String serverToken = (String) request.getSession(false).getAttribute("token"); if (serverToken == null) { return true; } String clinetToken = ""; if (request.getMethod().equals("GET")) { clinetToken = request.getParameter("token"); } else if (request.getMethod().equals("POST")) { clinetToken = request.getParameter("token"); } if (clinetToken == null) { return true; } if (!serverToken.equals(clinetToken)) { return true; } return false; } } 上面的拦截器是实现拦截所有请求,如果请求的方法上面有Token的注解,则判断是否是save,如果是save,则在session中存入一个token值并传值给页面,这是一个特殊值,用于标示是否是首次请求。如果是remove,则判断页面传回来的token值是否与session中的值相同。首次请求肯定是相同的,首次请求过后会执行session对token属性的删除,这样第二次请求时,页面有token值,而session没有,二者对比不相等,就能判断出这是重复的请求,会传给页面一个提示。 页面的ajax请求的提示如下: $.ajax({ url: "/xxxxxController/xxxxxMethod?token="+$("input[name=token]").val(), type: 'post', data: JSON.stringify({ "param":param}), cache: true, contentType: "application/json; charset=utf-8", dataType: 'json', success: function (data) { if (data.error == 0) { window.location.href = "/xxxxxxController/xxxxxMethod"; }else if(data.error ==2){ alert(data.message); } else { alert(data.errMsg); } }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert("操作异常"); window.location.href = "/xxxxxxController/xxxxxMethod"; } }); 注解在应用中的代码如下: 第一段代码(访问页面): @RequestMapping(value = "audit", method = RequestMethod.POST) @Token(save = true) public String toStrategyAudit(Model model, @RequestParam String param) { JSONObject params = JSONObject.parseObject(param); String detailId = params.getString("param"); ························省略······················································································ model.addAttribute("detailId", detailId); return "page/xxxxJsp"; } 第二段代码(页面提交请求): @RequestMapping(value = "addTable", method = RequestMethod.POST) @ResponseBody @Token(remove = true) public JSONObject saveTableStructure(@RequestBody String body) { try{ JSONObject result = new JSONObject(); JSONObject bodyJson = JSONObject.parseObject(body); String paramS = bodyJson.getString("tableStructures"); ········································省略··························································· tableMapper.addTable(list); result.put("error", "0"); }catch(Exception e) { e.printStackTrace(); result.put("errMsg", "error"); result.put("error", 1); } return result; } 整个拦截器类是为了防止用户点击提交太频繁,导致后台提交的代码执行多次,会产生很严重的错误。
相关 自定义注解 自定义注解关键词 @interface。具体实现可参考下面代码。 @Target({ ElementType.FIELD}) @Retention(Reten 本是古典 何须时尚/ 2022年12月05日 09:59/ 0 赞/ 240 阅读
相关 自定义注解 自定义注解 一、注解是什么? 二、使用步骤 1.使用关键字@interface @Target @Retention详解 一、注解是什么 ﹏ヽ暗。殇╰゛Y/ 2022年12月01日 11:57/ 0 赞/ 25 阅读
相关 自定义注解 1、简单介绍注解 注解(Annotation),也叫元数据。一种代码级别的说明。它是JDK1.5及以后版本引入的一个特性,与类、接口、枚举是在同一个层次。它可以声明 旧城等待,/ 2022年10月09日 03:11/ 0 赞/ 241 阅读
相关 自定义注解 什么是注解? 从JDK5开始,Java增加对元数据的支持,也就是注解,注解与注释是有一定区别的,可以把注解理解为代码里的特殊标记,这些标记可以在编译,类加 素颜马尾好姑娘i/ 2022年09月02日 04:18/ 0 赞/ 262 阅读
相关 自定义注解 首先定义注解类: import java.lang.annotation.; @Documented @Target(ElementType.METHOD) @Ret 一时失言乱红尘/ 2022年07月20日 15:18/ 0 赞/ 298 阅读
相关 自定义注解 package cn.stu; import java.lang.annotation.Documented; import java.lan 本是古典 何须时尚/ 2022年07月15日 18:50/ 0 赞/ 224 阅读
相关 自定义注解 自定义注解 @Retention(RetentionPolicy.RUNTIME) // 元注解:注解的注解。此注解表示使注解保留到运行时。 @Target( ゝ一世哀愁。/ 2022年05月31日 12:24/ 0 赞/ 343 阅读
相关 自定义注解 import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; 谁践踏了优雅/ 2022年03月30日 03:30/ 0 赞/ 341 阅读
相关 自定义注解 转载:[https://my.oschina.net/itblog/blog/1525665][https_my.oschina.net_itblog_blog_1525665 红太狼/ 2022年03月19日 08:51/ 0 赞/ 323 阅读
相关 自定义注解 注解是一种元数据形式,即注解是属于java的一种数据类型,和类、接口、数组、枚举类似。注解用来修饰,类、方法、变量、参数、包。注解不会对所修饰的代码产生直接的 痛定思痛。/ 2021年12月21日 11:51/ 0 赞/ 375 阅读
还没有评论,来说两句吧...