发表于: 2018-02-27 23:40:12

1 614


今日完成:

1.       Tiles框架中

可以配置多个xml布局文件,添加在<list>标签中

<bean id="tilesViewResolver" class="org.springframework.web.servlet.view.tiles3.TilesViewResolver" p:order="1"/>
<bean
id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles3.TilesConfigurer">
    <property
name="definitions">
        <list>
            <value>
/WEB-INF/tiles/layout.xml</value>
        </list>
    </property>
</bean>

每个xml布局文件中可以配置多个主布局jsp,并且不同布局文件中的项目可以继承非本布局文件的主布局jsp

如果不同xml布局文件中定义了相同的页面

2.       jsp页面绝对路径和相对路径

发布的项目名导致加载静态文件和跳转链接的路径失效

解决方法:

方法一:

绝对路径:添加在jsp也没加载路径前面

${pageContext.request.contextPath}

使用c:set设置变量,用EL表达式提取比较方便

<c:set value="${pageContext.request.contextPath}" var="ctx"></c:set>

<img alt="First slide" src="${ctx}/image/547567.jpg">

Tiles框架中每个子jsp页面都需要设置c:set语句,

方法二:

<%=request.getContextPath()%>

   使用String path

<% String path = request.getContextPath(); %>

<img alt="First slide" src="<%=path%>/image/547567.jpg">

Tiles框架中每个子jsp页面都需要String path

方法三:

<base href="value">为页面上所有相对 URL 规定基准 URL

<%
   
String path = request.getContextPath();
   
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

base必须放置在<head></head>之间,且在任何外部引用之前

<head>
    <base
href="<%=basePath%>">

</head>

并且文件不使用根相对路径,(路径前面没有/

<link href="css/bootstrap.min.css" rel="stylesheet" type="text/css">

request.getSchema()可以返回当前页面使用的协议,http 或是 https;

request.getServerName()可以返回当前页面所在的服务器的名字;

request.getServerPort()可以返回当前页面所在的服务器使用的端口;

request.getContextPath()可以返回当前页面所在的应用的名字;

Tiles框架中只要head中包含base,其他页面均可以使用

3.       Tiles加载顺序

java是在服务器端运行的代码,jsp在服务器的servlet里运行,而javascripthtml都是在浏览器端运行的代码。所以加载执行顺序是是java>jsp>js

jsp中是先编译“java代码”为静态代码,之后从代码第一行开始一直扫描到到代码最后一行。

解释:jsp是可以动态加载的,也就是说jsp变更不需要重启项目,如果里面有java代码的话,加载jsp的时候先编译java代码,如果有错误,直接抛出错误,不继续运行。如果没错误的话,扫描出body中的代码显示到页面,之后再加载js

4.       DES算法

美国国家标准局1973年开始研究除国防部外的其它部门的计算机系统的数据加密标准,于1973515日和1974827日先后两次向公众发出了征求加密算法的公告。 19771月,美国政府颁布:采纳IBM公司设计的方案作为非机密数据的正式数据加密标准(DES?Data Encryption Standard)。

目前在国内,随着三金工程尤其是金卡工程的启动,DES算法在POSATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。

  DES算法的入口参数有三个:KeyDataMode。其中Key8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;ModeDES的工作方式,有两种:加密或解密。

  DES算法是这样工作的:如Mode为加密,则用Key 去把数据Data进行加密, 生成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则用Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。在通信网络的两端,双方约定一致的Key,在通信的源点用Key对核心数据进行DES加密,然后以密码形式在公共通信网(如电话网)中传输到通信网络的终点,数据到达目的地后,用同样的Key对密码数据进行解密,便再现了明码形式的核心数据。这样,便保证了核心数据(如PINMAC等)在公共通信网中传输的安全性和可靠性。

通过定期在通信网络的源端和目的端同时改用新的Key,便能更进一步提高数据的保密性,这正是现在金融交易网络的流行做法。

DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为256,这意味着如果一台计算机的速度是每一秒种检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的,当然,随着科学技术的发展,当出现超高速计算机后,我们可考虑把DES密钥的长度再增长一些,以此来达到更高的保密程度。

缺点:

DES算法中只用到64位密钥中的其中56位,而第81624......648个位并未参与DES运算,这一点,向我们提出了一个应用上的要求,即DES的安全性是基于除了81624......64位外的其余56位的组合变化256才得以保证的。因此,在实际应用中,我们应避开使用第81624......64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。如果不了解这一点,把密钥Key81624..... .64位作为有效数据使用,将不能保证DES加密数据的安全性,对运用DES来达到保密作用的系统产生数据被破译的危险,这正是DES算法在应用上的误区,留下了被人攻击、被人破译的极大隐患。

5.       基于 Token 的身份验证过程

传统身份验证的方法

HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session

基于 Token 的身份验证方法

 

使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

客户端使用用户名跟密码请求登录

服务端收到请求,去验证用户名与密码

验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端

客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage

客户端每次向服务端请求资源的时候需要带着服务端签发的 Token

服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

6.       Spring中使用Interceptor拦截器

SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的处理。比如通过它来进行权限验证,或者是来判断用户是否登陆,或者是像12306 那样子判断当前时间是否是购票时间。

SpringMVC 中的Interceptor 拦截请求是通过HandlerInterceptor 来实现的。在SpringMVC 中定义一个Interceptor 非常简单,主要有两种方式,第一种方式是要定义的Interceptor类要实现了Spring HandlerInterceptor 接口,或者是这个类继承实现了HandlerInterceptor 接口的类,比如Spring 已经提供的实现了HandlerInterceptor 接口的抽象类HandlerInterceptorAdapter ;第二种方式是实现SpringWebRequestInterceptor接口,或者是继承实现了WebRequestInterceptor的类。

明日计划:

1.       DES加密算法计算过程

2.       MD5RSADES三种加密算法的优缺点

3.       cookiesession

4.       实现spring拦截器

5.       静态文件放置在WEB-INF内,服务器上外部加载问题

6.       Tiles学习心得

遇到的问题:

1.       Tiles框架中是先整合jsp页面还是先执行jsp页面中的java代码,为什么c:set等这些标签设置的变量不能在tiles中不同jsp页面公用

收获:

1.       学会三种部署项目中解决相对路径失效问题

2.       初步认识登陆认证过程,加密算法,spring拦截器实现方法



返回列表 返回列表
评论

    分享到