java项目(SpringMVC框架)中重复的代码能用AOP解决吗?(比如我想在每个Service层中的某一个方法里加入相同的代码)

漂洋过海来见你 2017-12-07 02:22:28
本人想学习aop并实际应用到当前的项目中,为了避免表单重复提交的问题,在有需要判断的表单提交后台代码Service层中加了如下代码:
/**
* 跳到添加管理员页面
* @return
*/
@RequestMapping(value = "add", method={RequestMethod.GET})
public String add(HttpSession session) {
//生成表单唯一指令码
commonService.setToken(session);
return "../managerAdd";
}

/**
* 添加管理员信息
* @param manager
* @param session
* @return
*/
@RequestMapping(value = "add", method={RequestMethod.POST})
public String add(Manager manager, String passwordR, Model model, HttpServletRequest request) {

HttpSession session = request.getSession();
Manager mng = (Manager) session.getAttribute("_manager");

//判断用户是否是重复提交表单
boolean b = commonService.isRepeatSubmit(request);
session.removeAttribute("token");
if (b) {
return "redirect:list";
}

passwordR = StringUtil.trim(passwordR);

ResultSetInfo rsi = managerService.add(manager,passwordR,mng);

if (!rsi.getResult()) {
model.addAttribute("entity", manager);
model.addAttribute("passwordR", passwordR);
model.addAttribute("msg", rsi.getMessage());
return "../managerAdd";
}

return "redirect:list";
}
,现在应为以后每个表单都要有后面这段代码,在考虑是否可以利用SpringAOP来将此段代码用注解替换
//判断用户是否是重复提交表单
boolean b = commonService.isRepeatSubmit(request);
session.removeAttribute("token");
if (b) {
return "redirect:list";
}
求懂AOP的前辈指教
...全文
287 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 3 楼 POwner 的回复:
上面一个用于生成token,供表单页面使用,页面提交时 ,使用下面的 验证 @Interceptor(interceptor = { com.xxxxx.interceptor.TokenValidInterceptor.class }) ---------------------------------- public class TokenHandlerInterceptor extends HandlerInterceptorAdapter { public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3) throws Exception { TokenHandler.generateGUID(request); } public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { return true; } } TokenHandler.generateGUID () 里可以把生成一个随机字串,保存在session就行了。这样页面就能取到了 request.getSession().setAttribute("XX.TOKEN", 随机字串); public class TokenValidInterceptor extends HandlerInterceptorAdapter { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3) throws Exception { } public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { if(!TokenHandler.validToken(request)){ // 验证 response.sendRedirect(request.getContextPath()+Constants.DEFAULT_TOKEN_MSG_JSP); return false; } return true; } } public static boolean validToken(HttpServletRequest request) { String inputToken = getInputToken(request); if (inputToken == null) { logger.warn("token is not valid!inputToken is NULL"); return false; } HttpSession session = request.getSession(); Map<String, String> tokenMap = (Map<String, String>)session.getAttribute("XX.TOKEN"); if (tokenMap == null || tokenMap.size() < 1) { logger.warn("token is not valid!sessionToken is NULL"); return false; }
非常感谢直接代码解释教授,理解了
POwner 2017-12-07
  • 打赏
  • 举报
回复
其实你已经实现了 防重复提交只是想用一个统一的办法 不想重复写,那就做一个拦截器,把同样的实现逻辑放进去就行了,一个拦截器生成,一个拦截器 验证就是这样
POwner 2017-12-07
  • 打赏
  • 举报
回复
上面一个用于生成token,供表单页面使用,页面提交时 ,使用下面的 验证 @Interceptor(interceptor = { com.xxxxx.interceptor.TokenValidInterceptor.class }) ---------------------------------- public class TokenHandlerInterceptor extends HandlerInterceptorAdapter { public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { } public void postHandle(HttpServletRequest request, HttpServletResponse response, Object arg2, ModelAndView arg3) throws Exception { TokenHandler.generateGUID(request); } public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { return true; } } TokenHandler.generateGUID () 里可以把生成一个随机字串,保存在session就行了。这样页面就能取到了 request.getSession().setAttribute("XX.TOKEN", 随机字串); public class TokenValidInterceptor extends HandlerInterceptorAdapter { public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object arg2, Exception arg3) throws Exception { } public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { } public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { if(!TokenHandler.validToken(request)){ // 验证 response.sendRedirect(request.getContextPath()+Constants.DEFAULT_TOKEN_MSG_JSP); return false; } return true; } } public static boolean validToken(HttpServletRequest request) { String inputToken = getInputToken(request); if (inputToken == null) { logger.warn("token is not valid!inputToken is NULL"); return false; } HttpSession session = request.getSession(); Map<String, String> tokenMap = (Map<String, String>)session.getAttribute("XX.TOKEN"); if (tokenMap == null || tokenMap.size() < 1) { logger.warn("token is not valid!sessionToken is NULL"); return false; }
  • 打赏
  • 举报
回复
是不是范围太大了,能在具体方法上用吗?
POwner 2017-12-07
  • 打赏
  • 举报
回复
在controller层 用拦截器 (也就是aop) @Interceptor(interceptor = { com.xxxx.interceptor.TokenHandlerInterceptor.class }),做令牌防重复

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧