kaptcha是基于配置的方式来实现生成验证码的,通过该插件根据生成规则可以自动的将验证码字符串转变成图片流返回给请求发送端,同时可以通过配置文件方式,将生成验证码字符串与session关联
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 |
注:由于远程仓库不存在该类依赖,需要打包到本地仓库
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:\IdeaProjects\guguanjia\lib\kaptcha-2.3.jar
-DgroupId:与groupId对应
-DartifactId:与artifactId对应
-Dversion:版本
-Dfile:jar文件的存放路径
localStorage、sessionStorage是Html5的特性,IE7以下浏览器不支持
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”
依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等
依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理
权限控制 检测登录 请求到达,先通过拦截器检测权限
日志记录 记录请求信息的日志,便于信息监控、信息统计
创建一个拦截器,实现HandleInterceptor接口,重写三个方法
可以使用的通配符
符号 | 说明 |
---|---|
? | 匹配任何一个字符 |
* | 匹配任何长度的字符 |
** | 匹配多级目录的路径 |
preHandle:handle方法执行之前执行,返回true代表此次放行,false代表拦截下来
postHandle:Handle方法执行之后执行
afterHandle:页面渲染完毕之后执行
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";
}
}
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");
}
}
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>
<mvc:mapping path="/**"/>
<mvc:mapping path="/user/*"/>
<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方式的解决:
在拦截器配置位置增加
apping path="/**"/>
### 探究拦截器执行顺序:
[外链图片转存中...(img-irBjB85r-1597753159542)]
### 解决拦截器拦截静态资源问题
mvc:resource方式的解决:
在拦截器配置位置增加