大型项目技术栈第九讲 kaptcha的使用
kaptcha的使用
一、kaptcha
1.什么是kaptcha
kaptcha是基于配置的方式来实现生成验证码的,通过该插件根据生成规则可以自动的将验证码字符串转变成图片流返回给请求发送端,同时可以通过配置文件方式,将生成验证码字符串与session关联
2、相关配置
Constant |
描述 |
默认值 |
---|---|---|
kaptcha.border |
图片边框,合法值:yes , no |
yes |
kaptcha.border.color |
边框颜色,合法值: r,g,b (and optional alpha) 或者 white,black,blue. |
black |
kaptcha.border.thickness |
边框厚度,合法值:>0 |
1 |
kaptcha.image.width |
图片宽 |
200 |
kaptcha.image.height |
图片高 |
50 |
kaptcha.producer.impl |
图片实现类 |
com.google.code.kaptcha.impl.DefaultKaptcha |
kaptcha.textproducer.impl |
文本实现类 |
com.google.code.kaptcha.text.impl.DefaultTextCreator |
kaptcha.textproducer.char.string |
文本集合,验证码值从此集合中获取 |
abcde2345678gfynmnpwx |
kaptcha.textproducer.char.length |
验证码长度 |
5 |
kaptcha.textproducer.font.names |
字体 |
Arial, Courier |
kaptcha.textproducer.font.size |
字体大小 |
40 |
kaptcha.textproducer.font.color |
字体颜色,合法值: r,g,b 或者 white,black,blue. |
black |
kaptcha.textproducer.char.space |
文字间隔 |
2 |
kaptcha.noise.impl |
干扰实现类 |
com.google.code.kaptcha.impl.DefaultNoise |
kaptcha.noise.color |
干扰 颜色,合法值: r,g,b 或者 white,black,blue. |
black |
kaptcha.obscurificator.impl |
图片样式: 水纹com.google.code.kaptcha.impl.WaterRipple 鱼眼com.google.code.kaptcha.impl.FishEyeGimpy阴影com.google.code.kaptcha.impl.ShadowGimpy |
com.google.code.kaptcha.impl.WaterRipple |
kaptcha.background.impl |
背景实现类 |
com.google.code.kaptcha.impl.DefaultBackground |
kaptcha.background.clear.from |
背景颜色渐变,开始颜色 |
light grey |
kaptcha.background.clear.to |
背景颜色渐变, 结束颜色 |
white |
kaptcha.word.impl |
文字渲染器 |
com.google.code.kaptcha.text.impl.DefaultWordRenderer |
kaptcha.session.key |
session key |
KAPTCHA_SESSION_KEY |
kaptcha.session.date |
session date |
KAPTCHA_SESSION_DATE |
3、实现步骤
3.1.引入jar kaptcha-2.3.jar
注:由于远程仓库不存在该类依赖,需要打包到本地仓库
idea打开控制台
通过mvn命令将我们的lib中的kaptcha-2.3.jar文件打包到本地仓库
mvn install:install-file -DgroupId=com.google.code.kaptcha -DartifactId=kaptcha -Dversion=2.3 -Dpackaging=jar -Dfile
=F:IdeaProjectsguguanjialibkaptcha-2.3.jar
-DgroupId:与groupId对应
-DartifactId:与artifactId对应
-Dversion:版本
-Dfile:jar文件的存放路径
3.2.新建一个Servlet继承KaptchaServlet类,并配置该类的请求对应关系和初始化参数即可
二、sessionStorage
localStorage、sessionStorage是Html5的特性,IE7以下浏览器不支持
1.为什么要掌握localStorage、和sessionStorage。
JS中为了减少与服务器的通信,经常会用到保存的数据到本地的功能,例如本地用户信息保存。
JS下的操作方法
获取键值:localStorage.getItem(“key”)
设置键值:localStorage.setItem(“key”,”value”)
清除键值:localStorage.removeItem(“key”)
清除所有键值:localStorage.clear()
获取键值2:localStorage.keyName
设置键值2:localStorage.keyName = “value”
JQ下的操作方法(JS方法前加”window.”)
获取键值:window.localStorage.getItem(“key”)
设置键值:window.localStorage.setItem(“key”,”value”)
清除键值:window.localStorage.removeItem(“key”)
清除所有键值:window.localStorage.clear()
获取键值2:window.localStorage.keyName
设置键值2:window.localStorage.keyName = “value”
三、拦截器
1. 说明
- 过滤器
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
- 拦截器
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理
2. 拦截器应用场景
权限控制 检测登录 请求到达,先通过拦截器检测权限
日志记录 记录请求信息的日志,便于信息监控、信息统计
3. 配置步骤
创建一个拦截器,实现HandleInterceptor接口,重写三个方法
拦截器配置:
可以使用的通配符
符号 |
说明 |
---|---|
? |
匹配任何一个字符 |
* |
匹配任何长度的字符 |
** |
匹配多级目录的路径 |
preHandle:handle方法执行之前执行,返回true代表此次放行,false代表拦截下来
postHandle:Handle方法执行之后执行
afterHandle:页面渲染完毕之后执行
controller:
package com.dfbz.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
public class Demo1Controller {
@RequestMapping("/demo1")
public String demo1(Model model) {
model.addAttribute("msg","haha");
System.out.println("controller执行啦!");
return "/success.jsp";
}
}
拦截器1:
package com.dfbz.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor1 implements HandlerInterceptor {
/**
* handler方法执行之前执行
* @param request
* @param response
* @param handler:执行的Handler对象(HandleMethod)
* @return
* true:代表放行
* false:代表拦截
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println(handler.getClass()); //class org.springframework.web.method.HandlerMethod
System.out.println("handle执行之前--1");
return true;
}
/**
* handle方法执行之后执行
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println(handler.getClass());
modelAndView.setViewName("/index.jsp"); //修改handle方法中设置的视图
modelAndView.addObject("msg","heiheihei"); //添加参数
System.out.println("handler执行之后--1");
}
/**
* 页面渲染后执行
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println(handler.getClass());
System.out.println("页面渲染之后--1");
}
}
拦截器2:
package com.dfbz.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyInterceptor2 implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("handle执行之前--2");
return false;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("handler执行之后--2");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("页面渲染之后--2");
}
}
Spring配置文件配置
<!--拦截器配置-->
<mvc:interceptors>
<!--配置单个拦截器-->
<mvc:interceptor>
<!--
path:拦截规则
?:匹配单个字符
*:代表匹配任意长度的字符(只能匹配单机目录)
**:代表匹配任意长度的多级目录
-->
<mvc:mapping path="/**"/>
<!--代表拦截/user下的所有请求-->
<mvc:mapping path="/user/*"/>
<!--代表放行/user/register请求-->
<mvc:exclude-mapping path="/user/register"/>
<!--配置拦截器-->
<bean class="com.dfbz.interceptor.MyInterceptor1" />
</mvc:interceptor>
<mvc:interceptor>
<mvc:mapping path="/**"/>
<bean class="com.dfbz.interceptor.MyInterceptor2" />
</mvc:interceptor>
</mvc:interceptors>
探究拦截器执行顺序:
解决拦截器拦截静态资源问题
mvc:resource方式的解决:
在拦截器配置位置增加
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/js/**"/>
apping path="/**"/>
</mvc:interceptor>
</mvc:interceptors>
### 探究拦截器执行顺序:
[外链图片转存中...(img-irBjB85r-1597753159542)]
### 解决拦截器拦截静态资源问题
mvc:resource方式的解决:
在拦截器配置位置增加
<mvc:exclude-mapping path="/css/**"/>
<mvc:exclude-mapping path="/js/**"/>
- Go 语言读写 Excel 文档
- 关于索引的使用模式(r3笔记56天)
- 关于oracle中的半连接(r3笔记55天)
- 关于正则表达式第三篇(r3笔记第52天)
- 关于正则表达式第四篇(r3笔记第53天)
- 外部表简单总结(r3笔记第51天)
- 通过shell脚本监控sql执行频率(r3笔记第50天)
- 和Null有关的函数(r3笔记第48天)
- 关于查询转换的一些简单分析(二) (r3笔记第68天)
- 跨网络拷贝文件的简单实践(r3笔记第67天)
- 关于enq: TX - allocate ITL entry的问题分析(r3笔记第66天)
- Tensorflow学习:使用Tensorflow搭建深层网络分类器
- 关于interval partitioning(r3笔记65天)
- Spark Tips4: Kafka的Consumer Group及其在Spark Streaming中的“异动”(更新)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- redis的介绍及安装
- 使用oradebug捕获SQL语句
- MySQL information_schema详解 PROCESSLIST
- MySQL组复制(MGR)全解析 Part 6 监控MySQL组复制
- 代码审计day2
- 使用XtraBackup备份MySQL 8.0 Part 8 xtrabackup 命令总结
- 代码审计day5
- 使用innobackupex对数据库进行部分备份(指定表或数据库)
- 使用Django获取Linux性能数据并存放在redis中
- MySQL组复制(MGR)全解析 Part 5 MGR单主模式部署指南
- php学习day4
- 使用Python爬取动态网页-腾讯动漫(Selenium)
- MySQL 5.7 常用命令
- MySQL复制全解析 Part 5 MySQL GTID的格式和存储
- Mycat分库分表全解析 Part 1 数据库切分概述