老师救...
来源:3-4 引入kaptcha实现验证码
qq_粽翎_0
2020-02-23 11:38:45
救命,加了验证码没有显示。。
还有想问一下,最下面图片的js路径,为啥只需要退一级目录就能获取到了?参照我这里的目录结构,shop_operation.html退一级目录不是到与html文件夹同级目录下么?求解,谢谢
14回答
同学你好!
老师使用你的代码是可以的。你可以直接在浏览器输入地址测试一下
比如:http://localhost:8080/o2o/kaptcha?66
你第一次加载页面时,图片可以出来吗?你是点击的时候出现的问题吗?如果是:你刷新一下页面重新测试一下。可能访问加载比较慢导致的
注意:是否有大小写不一致问题
祝学习愉快~
好帮手慕柯南
2020-02-25
同学你好!
老师这里测试没有复现你所说的现象。
建议你对最新的代码做以下检查:
验证码错误之后是否直接返回了
在浏览器的控制台看一下发送了几次请求。如果是两次可以是误操作
在后台打断点,跟踪一下数据,可能是调用了两次添加数据的代码
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
好帮手慕柯南
2020-02-25
同学你好!
formData不是一个字符串,而是一个变量,所以建议你将上面的引号去掉
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
qq_粽翎_0
提问者
2020-02-24
增加一些:
ajax这里URL,type,data这些都是未定义...
qq_粽翎_0
提问者
2020-02-24
前端传递的值是可以正常接收到的,那些分类和区域的下拉选项都能正常读出来,IDE的控制台没有打印如何错误信息
我打印了这个,获取不到值。程序跑到处理验证码那里判断为空,就直接在前端页面返回验证码不能为空的错误信息了
好帮手慕柯南
2020-02-24
同学你好!
你前端传递的数据是否正确
你在测试是区域和分类的数据是否有加载出来,如果没有可能会导致问题
idea以及浏览器的控制台是否报错了
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
好帮手慕柯南
2020-02-24
同学你好!
你的代码少写了@ResponseBody注解,建议你添加测试一下
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
qq_粽翎_0
提问者
2020-02-24
@Controller("shopManagementController") @RequestMapping("/shop_admin") public class ShopManagementController { @Autowired private ShopService shopService; @Autowired private ShopCategoryService shopCategoryService; @Autowired private AreaService areaService; @RequestMapping("/shop_init") @ResponseBody private Map<String, Object> initShop() { Map<String, Object> modelMap = null; List<Area> areaList = null; List<ShopCategory> shopCategoryList = null; try { modelMap = new HashMap<>(); areaList = areaService.getAllArea(); shopCategoryList = shopCategoryService.getShopCategory(new ShopCategory()); modelMap.put("areaList",areaList); modelMap.put("shopCategoryList",shopCategoryList); modelMap.put("success",true); } catch (Exception e) { modelMap.put("success",false); modelMap.put("msg", e.getMessage()); } return modelMap; } @RequestMapping("/shop_register") private Map<String, Object> registerShop(HttpServletRequest request) { Map<String, Object> modelMap = new HashMap<>(); //先处理验证码 if (!VerifyCodeUtil.checkVerifyCode(request)) { modelMap.put("success", false); modelMap.put("msg", "验证码错误!"); return modelMap; } //1.接收并转换相应参数,包括店铺信息和图片信息 String shopStr = HttpServletRequestUtil.getString(request, "shopStr"); ObjectMapper mapper = new ObjectMapper(); Shop shop = null; try { shop = mapper.readValue(shopStr, Shop.class); //将页面读取到的参数转换为shop实体类 } catch (Exception e) { modelMap.put("success", false); modelMap.put("msg", e.getMessage()); return modelMap; } CommonsMultipartFile shopImg = null; //定义文件上传解析器,去解析request里面的文件信息 CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver( request.getSession().getServletContext()); //判断是否有上传的文件流 if (commonsMultipartResolver.isMultipart(request)) { MultipartHttpServletRequest multipartHttpServletRequest = (MultipartHttpServletRequest) request; //通过指定参数获取文件流,并进行转换成spring能够处理的CommonsMultipartFile类型 shopImg = (CommonsMultipartFile) multipartHttpServletRequest.getFile("shopImg"); } else { modelMap.put("msg", "上传图片不能为空"); return modelMap; } //2.注册店铺 if (shopImg != null && shop != null) { User user = (User)request.getSession().getAttribute("user"); shop.setUser(user); ShopExecution shopExecution = null; try { shopExecution = shopService.addShop(shopImg.getInputStream(), shopImg.getOriginalFilename(), shop); if (shopExecution.getStatus() == ShopStatusEnum.CHECK.getStatus()) { modelMap.put("success", true); } else { modelMap.put("success", false); modelMap.put("msg", shopExecution.getStatusInfo()); } } catch (IOException e) { modelMap.put("success", false); modelMap.put("msg", e.getMessage()); return modelMap; } return modelMap; } else { modelMap.put("success", false); modelMap.put("msg", "请输入店铺信息"); return modelMap; } } }
qq_粽翎_0
提问者
2020-02-24
$(function () { var initUrl = '/o2o/shop_admin/shop_init'; var registerShopUrl = '/o2o/shop_admin/shop_register'; getShopInit(); function getShopInit() { $.getJSON(initUrl,function (data) { if (data.success) { var tempHtml = ''; var tempAreaHtml = ''; data.shopCategoryList.map(function (item,index){ tempHtml += '<option data-id="'+ item.shopCategoryId + '">' + item.shopCategoryName + '</option>'; }); data.areaList.map(function (item,index){ tempAreaHtml += '<option data-id="'+ item.areaId + '">' + item.areaName + '</option>'; }); $('#shop-category').html(tempHtml); $('#shop-area').html(tempAreaHtml); } }) } $('#submit').click(function () { var shop = {}; shop.shopName = $('#shop-name').val(); shop.shopAddr = $('#shop-addr').val(); shop.phone = $('#shop-phone').val(); shop.shopDesc = $('#shop-desc').val(); shop.shopCategory = { shopCategoryId : $('#shop-category').find('option').not(function () { return !this.selected; }).data('id') }; shop.area = { areaId : $('#shop-area').find('option').not(function () { return !this.selected; }).data('id') }; var shopImg = $('#shop-img')[0].files[0]; var formData = new FormData(); formData.append('shopImg', shopImg); formData.append('shopStr', JSON.stringify(shop)); var verifyCodeActual = $('#shop-kaptcha').val(); if (!verifyCodeActual) { $.toast('请输入验证码!'); return; } formData.append('verifyCodeActual', verifyCodeActual); $.ajax({ url : registerShopUrl, type : 'POST', data : 'formData', contentType : false, processData : false, cache : false, success : function(data){ if (data.success) { $.toast('提交成功!'); } else { $.toast('提交失败!'+data.msg); } $('#kaptcha_img').click(); } }); }); });
好帮手慕柯南
2020-02-24
同学你好!
你这里时点击注册之后404吗?
这里是ajax请求,并且注册成功之后会跳转至商铺列表页面
你的为什么时到注册页面呢?另外根据你之前的目录结构,是找不到跳转的地址的?你是否做了一些修改呢?
关于无法贴代码的问题,我们会向相关的工作人员进行反馈~
同学现在可以贴代码吗?
祝学习愉快~
qq_粽翎_0
提问者
2020-02-23
点击右下角的错误连接:
而下面的提示是这样:
qq_粽翎_0
提问者
2020-02-23
好了,新问题出来了,图片加载不出来,求救~
<!--验证码相关配置--> <servlet> <servlet-name>kaptcha</servlet-name> <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> <!--是否有边框--> <init-param> <param-name>kaptcha.border</param-name> <param-value>no</param-value> </init-param> <!--图片宽度--> <init-param> <param-name>kaptcha.image.width</param-name> <param-value>135</param-value> </init-param> <!--图片高度--> <init-param> <param-name>kaptcha.image.height</param-name> <param-value>50</param-value> </init-param> <!--字体--> <init-param> <param-name>kaptcha.textproducer.font.names</param-name> <param-value>Arial</param-value> </init-param> <!--字体颜色--> <init-param> <param-name>kaptcha.textproducer.font.color</param-name> <param-value>red</param-value> </init-param> <!--字体大小--> <init-param> <param-name>kaptcha.textproducer.font.size</param-name> <param-value>43</param-value> </init-param> <!--干扰线颜色--> <init-param> <param-name>kaptcha.noise.color</param-name> <param-value>black</param-value> </init-param> <!--使用哪些字符生成验证码--> <init-param> <param-name>kaptcha.textproducer.char.string</param-name> <param-value>ACDGHLINRTXM23579</param-value> </init-param> <!--验证码字符个数--> <init-param> <param-name>kaptcha.textproducer.char.length</param-name> <param-value>4</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>kaptcha</servlet-name> <url-pattern>/kaptcha</url-pattern> </servlet-mapping>
好帮手慕柯南
2020-02-23
同学你好!
验证码在xml中是否配置完整了
这里的路径是相对与浏览器中的路径写的。所以退一级就可以访问到,你的理解正确。
如果验证码在xml中的配置正确,建议在浏览器上中看一下验证码具体访问的路径是什么。可能浏览器最终加载的路径是错误的
如果我的回答解决了你的疑惑,请采纳,祝学习愉快~
qq_粽翎_0
提问者
2020-02-23
哦对于这个路径问题,是不是根据页面的访问路径来说的啊?因为页面访问路径只有两级,所以我们退一级就回到了webapp根目录下了,再去访问js资源文件是这样吧
相似问题