目标:
通过让用户填写验证码并在服务器端检查,防止被恶意访问和DDOS攻击
思路:
步骤:
(1)导入Kaptcha-2.3.2.jar
https://code.google.com/archive/p/kaptcha/downloadshttps://code.google.com/archive/p/kaptcha/downloads ①配置KaptchaServlet:
jar包已经有servlet的java类,直接在web.xml中配置servlet
<servlet>
<servlet-name>kaptchaServlet</servlet-name>
<servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class>
<!-- 配置kaptcha.border的值为no取消图片边框 -->
<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>110</param-value>
</init-param>
<!-- 配置图片高度 -->
<init-param>
<param-name>kaptcha.image.hight</param-name>
<param-value>20</param-value>
</init-param>
<!-- 配置字体大小 -->
<init-param>
<param-name>kaptcha.textproducer.font.size</param-name>
<param-value>30</param-value>
</init-param>
<!--在这里可以配置验证码存储进session时候的key-->
<init-param>
<param-name>kaptcha.session.key</param-name>
<param-value>serverCode</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>kaptchaServlet</servlet-name>
<url-pattern>/kaptcha</url-pattern>
</servlet-mapping>
(2)在注册页面修改标签
①修改register.html的验证码图片的源
<img src="kaptcha" alt="" />
②点击图片进行刷新
<input type="text" placeholder="" name="checkCode"/>
<img src="kaptcha" alt="" @click="changCodeImg()" />
③修改验证码标签
<label>验证码:</label>
<div class="verify">
<input type="text" placeholder="" name="checkCode"/>
<img src="kaptcha" alt="" @click="changCodeImg()" />
</div>
(3)定义Vue代码中的刷新验证码函数
changCodeImg(){
//切换验证码图片,重新设置当前图片的src
//event.target就表示获取当前事件所在的标签
event.target.src = "kaptcha"
}
(4)在UserServlet的doRegister方法中加入验证码
//处理注册功能
public void doRegister(HttpServletRequest request,HttpServletResponse response)throws IOException{
//使用数据库的注册
//获取请求参数封装到user中
Map<String,String[]> parameterMap = request.getParameterMap();
User parameterUser = new User();
try{
BeanUtils.populate(parameterUser,parameterMap);
//获取客户端驶入的验证码
String checkCode = parameterMap.get("checkCode")[0];
//获取kaptchaservlet中生产的验证码
String serveCode = (String) request.getSession().getAttribute("serverCode");
//开始校验验证码
if(checkCode.equalsIgnoreCase(serveCode)){
//调用业务层方法处理注册功能
userService.doRegister(parameterUser);
//想要在多个动态资源之间共享registerUser对象
//将registerUser对象存储到session域对象中
HttpSession session = request.getSession();
session.setAttribute(BookStoreConstants.REGISTERUSER_SESSIONKEY, parameterUser);
//没有出现异常,说明注册成功,跳转到regist_success页面
processTemplate("user/regist_success",request,response);
}else {
//验证错误
throw new RuntimeException("注册失败,验证码错误");
}
}catch (IllegalAccessException e){
e.printStackTrace();
}catch (InvocationTargetException e){
e.printStackTrace();
}catch (Exception e){
e.printStackTrace();
//返回失败信息
request.setAttribute("errorMsg",e.getMessage());
//注册失败,返回register页面
processTemplate("user/regist",request,response);
}
}