发表于: 2018-01-03 21:34:33
1 611
今日完成
1.继续尝试使用 spring的 converter
先上一波理论:
我们先来看一下Converter接口的定义:
- public interface Converter<S, T> {
- T convert(S source);
- }
我们可以看到这个接口是使用了泛型的,第一个类型表示原类型,第二个类型表示目标类型,然后里面定义了一个convert方法,将原类型对象作为参数传入进行转换之后返回目标类型对象。当我们需要建立自己的converter的时候就可以实现该接口。
在定义好Converter之后,就是使用Converter了。为了统一调用Converter进行类型转换,Spring为我们提供了一个ConversionService接口。通过实现这个接口我们可以实现自己的Converter调用逻辑。
(1)配置转换器类,实现converter方法,重写该方法。
@Component
public class CustomDateLongConverter implements Converter<String,Long> {
@Override
public Long convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try {
return simpleDateFormat.parse(source).getTime();
} catch (ParseException e) {
e.printStackTrace();
}
return null ;
}
(2)配置converterservice。
<!--配置date转换-->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="lujing.util.CustomDateConverter"></bean>
<bean class="lujing.util.CustomDateLongConverter"/>
</list>
</property>
</bean>
(3)将converterservice配置在注解驱动中。
<!--开启注解启动,将date转换器配置在这里面,conversion-service="conversionService"-->
<mvc:annotation-driven conversion-service="conversionService"/>
(4)点击修改提交,测试页面传递的字符串能够转换。数据库中createAt 使用了long型。
(5)出现以下错误。
DEBUG] 2018-01-03 10:52:24,607 method:org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:164)
Failed to resolve argument 1 of type 'lujing.pojo.StudentCustom'
org.springframework.validation.BindException: org.springframework.validation.BeanPropertyBindingResult: 1 errors
Field error in object 'studentCustom' on field 'createAt': rejected value [2018-01-24]; codes [typeMismatch.studentCustom.createAt,typeMismatch.createAt,typeMismatch.java.lang.Long,typeMismatch]; arguments [org.springframework.context.support.DefaultMessageSourceResolvable: codes [studentCustom.createAt,createAt]; arguments []; default message [createAt]]; default message [Failed to convert property value of type 'java.lang.String' to required type 'java.lang.Long' for property 'createAt'; nested exception is java.lang.NumberFormatException: For input string: "2018-01-24"]
(6)分析错误原因,当被转换成的类型被构造的时候就会调用spring定义的转换器。因为我的id使用了long型,传递参数过程中也会构造long来接收id,所以拦截了createAt字段接收数据。导致报错。
(7)解决方法
将id类型改成了int型。再测试。
提交的数据能够进入转换器了。接收对象中生成了相应的属性。修改成功。
(8)测试空字符串
修改tglib的代码,判断字符串是否为空。
2.学习加密算法
参考博文:http://blog.jobbole.com/61872/
写的很好,反正直接上结论吧。
(1)一般使用密码+盐值再进行加密计算的方法进行加密。
(2)盐值应该使用基于加密的伪随机数生成器(Cryptographically Secure Pseudo-Random Number Generator – CSPRNG)来生成。不要使用其他的数作为盐值。
Platform | CSPRNG |
PHP | mcrypt_create_iv, openssl_random_pseudo_bytes |
Java | java.security.SecureRandom |
(3)存储密码的步骤
- 使用CSPRNG生成一个长度足够的盐值
- 将盐值混入密码,并使用标准的加密哈希函数进行加密,如SHA256
- 把哈希值和盐值一起存入数据库中对应此用户的那条记录
(4)校验密码的步骤
- 从数据库取出用户的密码哈希值和对应盐值
- 将盐值混入用户输入的密码,并且使用同样的哈希函数进行加密
- 比较上一步的结果和数据库储存的哈希值是否相同,如果相同那么密码正确,反之密码错误
(5)应该使用什么哈希算法
应该使用:
- OpenWall的Portable PHP password hashing framework
- 任何先进的、被良好测试过的哈希加密算法,比如SHA256,SHA512,RipeMD,WHIRLPOOL,SHA3等等
- 设计良好的密钥扩展算法,如PBKDF2,bcrypt,scrypt
- 安全的crypt()版本($2y$,$5$,$6$)
不要使用:
- 过时的函数,比如MD5或SHA1
- 不安全的crypt()版本($1$,$2$,$2x$,$3$)
- 任何你自己设计的加密算法。只应该使用那些在公开领域中的,并且被密码学家完整测试过的技术
3.了解cookie 与 session的原理
Cookie
Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去。这样,web资源处理的就是用户各自的数据了。
Session
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,其它web资源再从用户各自的session中取出数据为用户服务。
(2)了解一下cookie的api
* cookie的构造方式 Cookie(String name, String value)
* String getName() 获取cookie的名称
* String getValue() 获取cookie的值
* void setMaxAge(int expiry) :设置有效时间
* 失效cookie setMaxAge(0); 前提条件:设置有效路径(和之前设置过相同)
* void setPath(String uri) :设置有效路径
* 默认的有效路径()
* 配置 /last 默认路径
* 配置 /servlet/last 默认路径
* void setDomain(String pattern) :设置有效域名
* www.sina.com.cn
* sports.sina.com.cn
* xxx.sina.com.cn
* 设置有效域名 setDomain(".sian.com.cn");
明日计划
1.做登陆页面。
2.做加密算法
遇到问题
1.上面写了。
收获
1.了解了spring的转换器的调用逻辑。
2.了解了加密算法。
评论