论如何实现简单的验证码以及处理Word,Excel
并不想写太多,就大概记录一下处理的思路
思路
首先是验证码,大体的流程就是前端向后端发起一个get请求,然后后端生成随机的图片,将正确的答案放到session中,而生成的图片以流的形式传回给前端,用户在看到图片之后将答案填写到form中提交给后端,后端把用户提交的数据和当前session中的数据相比对,而生成验证码图片可以使用java原生的awt类,也可以使用第三方的库
而对于word,excel的处理,都是用apache提供的第三方组件,对于文件的读入操作,就是交由第三方组件处理之后将其解析封装成为对象,这样便于用户操作,而创建并写入文件也是同理的,先使用第三方组件的类将数据写入其中,在交由它转化为文件流写入磁盘或者提供给客户端下载。需要使用到如下jar包
- commons-fileupload
- commons-io
- commons-poi
- poi-3.16.jar
- poi-ooxml-3.16.jar
- poi-ooxml-schemas-3.16.jar
- poi-scratchpad-3.16.jar
- xmlbeans-2.6.0.jar
经验
对于第一个课程,要保证浏览器器端验证码的时效性,需要对请求的链接加时间戳,并设置response的header要求清除缓存,清除缓存代码如下
1 | response.setHeader("pragma", "no-cache"); |
使用js脚本对请求图片链接以请求参数的方式加时间戳,服务端可以无视这个参数
1 | <img src="" alt="" id="code_img" onclick="changeCode()"> |
对于第二个课程,我学到了两个开发技巧。
第一个就是对同名文件的处理,之前一个老师介绍的方式是使用UUID生成随机随机的文件名来替换,但是其实还是用有个解决方案的,和上面一样,加时间戳!
1 | String filename = System.currentTimeMillis() + "_" + fileItem.getName(); |
这样既最大限度的保持了文件名原来的面貌,同时也避免的文件出现重名的情况
另外,对于前端提交过来的数据,可以将其封装成一个DTO,也就是数据传输对象,这样便于后端处理时数据结构的统一,在之后作业项目中我也是这样实战的,同时还把报错信息都封装进去了,觉得效果蛮好的。
其他的一些收获
- 使用meta标签实现页面自动跳转,关于meta的更多信息
1 | <meta http-equiv="refresh" content="0;url=<%=request.getContextPath()%>/product/list.do"> |
- 比较两个对象是否相等,同时不用考虑是否为null
1 | Objects.equals |