盗版网站是如何做的,百度seo关键词,微信第三方,网站转入备案jeesite#xff0c;其框架主要为#xff1a; 后端 核心框架#xff1a;Spring Framework 4.0 安全框架#xff1a;Apache Shiro 1.2 视图框架#xff1a;Spring MVC 4.0 服务端验证#xff1a;Hibernate Validator 5.1 布局框架#xff1a;SiteMesh 2.4 工作流引擎… jeesite其框架主要为 后端 核心框架Spring Framework 4.0 安全框架Apache Shiro 1.2 视图框架Spring MVC 4.0 服务端验证Hibernate Validator 5.1 布局框架SiteMesh 2.4 工作流引擎Activiti 5.15、FoxBPM 6 任务调度Spring Task 4.0 持久层框架MyBatis 3.2 数据库连接池Alibaba Druid 1.0 缓存框架Ehcache 2.6、Redis 日志管理SLF4J 1.7、Log4j 工具类Apache Commons、Jackson 2.2、Xstream 1.4、Dozer 5.3、POI 3.9 2、前端 JS框架jQuery 1.9。 CSS框架Twitter Bootstrap 2.3.1。 客户端验证JQuery Validation Plugin 1.11。 富文本CKEcitor 文件管理CKFinder 动态页签Jerichotab 手机端框架Jingle 数据表格jqGrid 对话框jQuery jBox 下拉选择框jQuery Select2 树结构控件jQuery zTree 日期控件 My97DatePicker 这里对于jeesite感觉其功能还是挺强大的但是有一点致命缺点就是其缓存机制本来缓存是为了提速但是当这里的缓存加上了MVC并且在前端进行请求后不适时宜地将请求的相关类对象进行缓存这就导致了单例化和伪持久化。怎么说来就是说当前端修改Person对象实例并提交到服务端试图保存时由于某些原因如权限不足导致保存失败这本来应该是很正常的但是偏偏由于在这之前缓存将Person对象实例更新了从而缓存中的该实例是修改后的这样后来再次获取该对象由于缓存存在优先取缓存而不是从DB里获取导致后来获取的对象的数据都是错误的修改但保存失败的这就变相单例化而且是无法获得正确数据了。 例如如下的接口 [java] view plain copy RequiresPermissions(sys:user:edit) RequestMapping(value save) public String save(User user, HttpServletRequest request, Model model, RedirectAttributes redirectAttributes) { //判断是否有权限修改用户信息 //先清缓存因为框架原因只要更新了该用户则会同步更新该用户缓存从而无法获得真正的该用户信息,所以需要清除掉该缓存这里先注释掉看问题 //UserUtils.clearCache(user); User oldUser systemService.getUser(user.getId()); ListStringroleIdListOld oldUser.getRoleIdList(); User operator UserUtils.getUser(); ListStringroleIdListOperator operator.getRoleIdList(); //自己不能修改自己的权限 // if(user.getId().equals(operator.getId())){ // addMessage(model, 修改用户信息失败, 不能修改自己的权限); // UserUtils.clearCache(); // return form(oldUser, model); // } if(!roleIdListOperator.containsAll(roleIdListOld)){ addMessage(model, 修改用户信息失败, 您的权限不足); UserUtils.clearCache(); return form(oldUser, model); } user.setRoleList(roleList); // 保存用户信息 systemService.saveUser(user); // 清除当前用户缓存 if (user.getPhone().equals(UserUtils.getUser().getPhone())){ UserUtils.clearCache(); //UserUtils.getCacheMap().clear(); } addMessage(redirectAttributes, 保存用户 user.getPhone() 成功); return redirect: adminPath /sys/user/list?repage; } 再看下getUser: [java] view plain copy public static User getUser(String id){ User user (User)CacheUtils.get(USER_CACHE, USER_CACHE_ID_ id); if (user null){ user userDao.get(id); if (user null){ return null; } user.setRoleList(roleDao.findList(new Role(user))); CacheUtils.put(USER_CACHE, USER_CACHE_ID_ user.getId(), user); CacheUtils.put(USER_CACHE, USER_CACHE_LOGIN_NAME_ user.getPhone(), user); } return user; } 这里的 [java] view plain copy systemService.getUser(user.getId()); 会一直拿到该对象实例的缓存值而该值在修改提交到服务端时框架已经更新了再进到controller中。 所以即使在 [java] view plain copy if(!roleIdListOperator.containsAll(roleIdListOld)){ addMessage(model, 修改用户信息失败, 您的权限不足); UserUtils.clearCache(); return form(oldUser, model); } 这里返回了其他地方获取该user的值 [java] view plain copy getUser(user.getId()); 还是会是缓存的值。 也相当于单例的、全局的实例值 解决方法 在关系到修改等的地方每次都需要对该实例进行缓存的清空。同时在修改时修改对象最好就是拿出db的该记录逐个参数进行修改替换 [java] view plain copy RequiresPermissions(user:list:edit) RequestMapping(value editUserInfoSave) public String editUserInfoSave(User user,Model model, RedirectAttributes redirectAttributes) { //先清除该user的缓存防止干扰到其他地方的引用。其实还是会有并发问题会在清除之前被引用到 UserUtils.clearCache(user); //从db中获取user注意这个userSave 是修改前的与user的值不一样注意一点如果直接从getUser(user.getId());中获取同时并没有清缓存的前提下 //UserUtils.clearCache(user);则会导致拿到的user并非DB里的user而是缓存前端提交的 User userSave systemService.getUserFromDB(user.getId()); /** * 替换更新修改信息 */ userSave.setName(user.getName()); userSave.setFirstnameStr(user.getFirstnameStr()); userSave.setLastnameStr(user.getLastnameStr()); userSave.setIdStr(user.getIdStr()); userSave.setUsername(user.getUsername()); userSave.setBirthdateStr(user.getBirthdateStr()); userSave.setEmail(user.getEmail()); userSave.setUserType(user.getUserType()); userSave.setGenderStr(user.getGenderStr()); // 保存用户信息 systemService.saveUser(userSave); addMessage(redirectAttributes, 保存用户 user.getPhone() 成功); return redirect: adminPath /user/user/list?repage; } 这里的getUserFromDB: [java] view plain copy /** * 根据ID获取用户——通过DB * param id * return 取不到返回null */ public static User getUserFromDB(String id){ User user userDao.get(id); user.setRoleList(roleDao.findList(new Role(user))); return user; } 因此特别需要注意缓存的使用不是任何地方都适合使用缓存。 顶0 踩