发表于: 2018-01-03 21:34:33

1 611


今日完成

1.继续尝试使用 spring的 converter

先上一波理论:

我们先来看一下Converter接口的定义:

  1. public interface Converter<S, T> {  
  2.      
  3.     T convert(S source);  
  4.    
  5. }  

 

       我们可以看到这个接口是使用了泛型的,第一个类型表示原类型,第二个类型表示目标类型,然后里面定义了一个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)来生成。不要使用其他的数作为盐值。

PlatformCSPRNG
PHPmcrypt_create_ivopenssl_random_pseudo_bytes
Javajava.security.SecureRandom

(3)存储密码的步骤

  1. 使用CSPRNG生成一个长度足够的盐值
  2. 将盐值混入密码,并使用标准的加密哈希函数进行加密,如SHA256
  3. 把哈希值和盐值一起存入数据库中对应此用户的那条记录

(4)校验密码的步骤

  1. 从数据库取出用户的密码哈希值和对应盐值
  2. 将盐值混入用户输入的密码,并且使用同样的哈希函数进行加密
  3. 比较上一步的结果和数据库储存的哈希值是否相同,如果相同那么密码正确,反之密码错误

(5)应该使用什么哈希算法

应该使用:

不要使用:

  • 过时的函数,比如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.了解了加密算法。



返回列表 返回列表
评论

    分享到