发表于: 2020-07-30 22:31:12

1 1354


完成cookie

//登陆
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String checkLogin(Model model, @Param("userName")String userName, @Param("passWord")String passWord,
                        HttpServletRequest request, HttpServletResponse response){
User user=userService.checkLogin(userName,passWord);
   if(user!=null){
logger.info(userName,passWord);
       logger.info("登陆成功");
       //使用DES对用户ID和登录时间加密,生成Token,放入Cookie
       int id=user.getId();
       String token=id+"="+System.currentTimeMillis();
       try {
desUtil.encrypt(token);
           Cookie cookie=new Cookie("token",token);
           //设置cookie的有效期,以秒为单位
           cookie.setMaxAge(0);
           //设置cookie的有效路径,比如把cookie的有效路径设为"/xdp",那么浏览器访问"xdp"目录下的web资源时,都会带上cookie
           cookie.setPath("/");
           logger.debug("cookie有效路径为"+cookie.getMaxAge()+"cookie的有效期为"+cookie.getMaxAge()+"cookie生成的名字为"+cookie.getName());
           //将生成的cookie发送给浏览器客户端
           response.addCookie(cookie);
       } catch (Exception e) {
e.printStackTrace();

       }
return "redirect:/home" ;
   }else {
logger.debug("用户不存在,请重新登录");
       return "redirect:/login/0";
   }
}

拦截器

通过cookie的有效判断是否登录

public class LoginInterceptor implements HandlerInterceptor {
@Autowired
       DesUtil desUtil;
       @Autowired
       UserService userService;

       /**
        * preHandle方法是进行处理器拦截用的,该方法将在Controller处理之前进行调用,
        * preHandle的返回值为false的时候整个请求就结束了。
        * 如果preHandle的返回值为true,则会继续执行postHandleafterCompletion
        */
       private  static final Logger logger=LogManager.getLogger(LoginInterceptor.class);
       @Override
       public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
//       logger.info("拦截器被调用");
           //判断请求中是否携带了token令牌,同时对token令牌进行验证。
           Cookie[] cookies=httpServletRequest.getCookies();
           if(cookies!=null&&cookies.length>0){
logger.info("开始遍历cookie");
               for (Cookie cookie: cookies) {
//判断cookie是否存储了token
                   if("token".equals(cookie.getName())){
//String token=cookie.getValue();
                       //因为在登录的过程中,使用DES对用户ID和登录时间加密,生成Token。所以现在将tokenDES解密
                       String token=desUtil.decrypt(cookie.getValue());
                       //将解密后的token值中的用户id提取出来,进行验证token有效性
                       int id= StringUtil.tool(token);
                       if(userService.findById(id)!=null){
//验证token有效,返回true继续向下执行
                           return true;
                       }
else {
logger.debug("验证失败,重新返回到登录界面");
                           String uri=httpServletRequest.getContextPath()+"/log/0";
                           httpServletRequest.getRequestDispatcher(uri).forward(httpServletRequest,httpServletResponse);
                           return false;
                       }

}
}
}
logger.debug("cookies不存在");
           String uri=httpServletRequest.getContextPath()+"/log/0";
           httpServletRequest.getRequestDispatcher(uri).forward(httpServletRequest,httpServletResponse);
           return false;
       }

//  postHandler : 进入Handler方法之后,返回ModelAndView之前执行,使用场景从ModelAndView参数出发,
       // 比如,将公用的模型数据在这里传入到视图,也可以统一指定显示的视图等;
       @Override
       public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

}

//   afterHandler : 在执行Handler完成后执行此方法,使用于统一的异常处理,统一的日志处理等;该方法将在整个请求完成之后执行,主要作用是用于清理资源。
       @Override
       public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

}
}

补全任务四的深度思考

Velocity,Freemark是什么,和JSP的区别在哪里?推荐使用哪种模板语言?

在java中表现层实现技术主要分为三种:jsp、freemarker、velocity

一、JSP应该是模板语言中用的最多技术,其特点属性如下:

1.支持java代码直接写入,方便易学

2.支持标签(jsp tag)及自定义标签(jstl)

3.支持表达式语言(el)

4.丰富第三方jsp标签库,如(struts-tag等)

5.性能良好,jsp最终编译为class二进制文件执行

二、Velocity设计弥补jsp模板语言的缺点的,其特点属性如下:

优点:

1、不能编写java代码,可以实现严格的mvc分离

2、性能良好,据说比jsp性能还要好些

3、使用表达式语言,据说jsp的表达式语言就是学velocity的

缺点:

1、不是官方标准

2、用户群体和第三方标签库没有jsp多。

3、对jsp标签支持不够好

三、freemarker特点属性分析如下:

优点:

1、不能编写java代码,可以实现严格的mvc分离

2、性能非常不错

3、对jsp标签支持良好

4、内置大量常用功能,使用非常方便

5、宏定义(类似jsp标签)非常方便

6、使用表达式语言

缺点:

1、不是官方标准

2、用户群体和第三方标签库没有jsp多


EL表达式是什么?常用的EL表达式有哪些?


E L(Expression Language)  目的:为了使JSP写起来更加简单。

1、语法结构

${expression}

 使用EL表达式获取数据语法:"${标识符}"
  EL表达式语句在执行时,会调用pageContext.findAttribute方法,用标识符为关键字,分别从page、request、session、application四个域中查找相应的对象,找到则返回相应对象,找不到则返回”” (注意,不是null,而是空字符串)。

  EL表达式可以很轻松获取JavaBean的属性,或获取数组、Collection、Map类型集合的数据

标签又是什么?怎么写一个自定义的标签?自定义的标签通常有什么用处?

JSP标签也称之为Jsp Action(JSP动作)元素,它用于在Jsp页面中提供业务逻辑功能,避免在JSP页面中直接编写java代码,造成jsp页面难以维护。

1. 步骤

  * 标签处理类(标签也是一个对象,那么就需要先有类!)

  * tld文件,它是一个xml

  * 页面中使用<%@taglib%>来指定tld文件的位置

2. 标签处理类

  SimpleTag接口:

  * void doTag():每次执行标签时都会调用这个方法;

  * JspTag getParent():返回父标签(非生命周期方法)

  * void setParent(JspTag):设置父标签

  * void setJspBody(JspFragment):设置标签体

  * void seetJspContext(JspContext):设置jsp上下文对象,它儿子是PageContext

  其中doTag()会在其他三个方法之后被tomcat调用。

3. 配置tld文件

tld文件一般都放到WEB-INF之下,这样保证客户端访问不到!

  <tag>

  <name>myTag1</name> 指定当前标签的名称

  <tag-class>cn.itcast.tag.MyTag1</tag-class> 指定当前标签的标签处理类!

  <body-content>empty</body-content> 指定标签体的类型,我们这里使用的是空标签!

  </tag>

4. 页面中指定tld文件位置

<%@ taglib prefix="it" uri="/WEB-INF/tlds/itcast-tag.tld" %>


自定义JSP标签通常是为了复用,比如相同的功能不需要在不同的页面书写同样的代码,

方便页面代码的维护。


套页面和前后端分离的方式有什么区别,应该在哪种情况下选用哪种解决方式?(baidu  )

前后端不分离

      在前后端不分离的应用模式中,前端页面看到的效果都是由后端控制,由后端渲染页面或重定向,也就是后端需要控制前端的展示,前端与后端的耦合度很高。

        这种应用模式比较适合纯网页应用,但是当后端对接App时,App可能并不需要后端返回一个HTML网页,而仅仅是数据本身,所以后端原本返回网页的接口不再适用于前端App应用,为了对接App后端还需再开发一套接口。

请求的数据交互如下图:

前后端分离

      在前后端分离的应用模式中,后端仅返回前端所需的数据,不再渲染HTML页面,不再控制前端的效果。至于前端用户看到什么效果,从后端请求的数据如何加载到前端中,都由前端自己决定,网页有网页的处理方式,App有App的处理方式,但无论哪种前端,所需的数据基本相同,后端仅需开发一套逻辑对外提供数据即可。

在前后端分离的应用模式中 ,前端与后端的耦合度相对较低。

在前后端分离的应用模式中,我们通常将后端开发的每个视图都称为一个接口,或者API,前端通过访问接口来对数据进行增删改查。

对应的数据交互如下图 :

 

.


DES算法简介

DES(Data Encryption Standard)是发明最早的最广泛使用的分组对称加密算法。DES算法的入口参数有三个:Key、Data、Mode。其中Key为8个字节共64位,是DES算法的工作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的工作方式,有两种:加密或解密。

数据加密标准DES

DES的原始思想可以参照二战德国的恩格玛机,其基本思想大致相同。传统的密码加密都是由古代的循环移位思想而来,恩格玛机在这个基础之上进行了扩散模糊。但是本质原理都是一样的。现代DES在二进制级别做着同样的事:替代模糊,增加分析的难度。

加密原理

DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位,产生最大 64 位的分组大小。这是一个迭代的分组密码,使用称为 Feistel 的技术,其中将加密的文本块分成两半。使用子密钥对其中一半应用循环功能,然后将输出与另一半进行“异或”运算;接着交换这两半,这一过程会继续下去,但最后一个循环不交换。DES 使用 16 个循环,使用异或,置换,代换,移位操作四种基本运算。

   1.过滤器

     依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,获取我们想要获取的数据,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

     2.拦截器

     依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。 

     3.监听器

   web监听器是一种Servlet中的特殊的类,它们能帮助开发者监听web中的特定事件,实现了javax.servlet.ServletContextListener 接口的服务器端程序,它也是随web应用的启动而启动,只初始化一次,随web应用的停止而销毁。主要作用是:感知到包括request(请求域),session(会话域)和applicaiton(应用程序)的初始化和属性的变化。

JSP是什么?JSP中可否直接连接数据库?为什么现在不推荐使用%%来写JSP的代码,而是使用C标签?

JSP,就是在HTML中嵌入Java代码,或者使用JSP标签,包括使用用户自定义标签,从而可以动态的提供内容。

他的本质还是一个Java类。Jsp页面的代码全部是由java语言代码和HTML语言代码组成

JSP基本原理

  JSP的本质是servlet,当用户指定servlet发送请求时,servlet利用输出流动态生成HTML页面。由于包含大量的HTML标签。静态文本等格式导致servlet的开发效率极低,所有的表现逻辑,包括布局、色彩及图像等,都必须耦合在Java代码中,起静态的部分无需Java程序控制,只有那些需要从数据库读取或者需要动态生成的页面内容才使用Java脚本控制。

JSp处理的流程

  • 就像其他普通的网页一样,您的浏览器发送一个HTTP请求给服务器。
  • Web服务器识别出这是一个对JSP网页的请求,并且将该请求传递给JSP引擎。通过使用URL或者.jsp文件来完成。
  • JSP引擎从磁盘中载入JSP文件,然后将它们转化为servlet。这种转化只是简单地将所有模板文本改用println()语句,并且将所有的JSP元素转化成Java代码。
  • JSP引擎将servlet编译成可执行类,并且将原始请求传递给servlet引擎。
  • Web服务器的某组件将会调用servlet引擎,然后载入并执行servlet类。在执行过程中,servlet产生HTML格式的输出并将其内嵌于HTTP response中上交给Web服务器。
  • Web服务器以静态HTML网页的形式将HTTP response返回到您的浏览器中。
  • 最终,Web浏览器处理HTTP response中动态产生的HTML网页,就好像在处理静态网页一样。

JSp中可以直接连接数据库 ,

jsp的语法<% %>脚本程序可以包含任意量的Java语句、变量、方法或表达式,所以在里面写连接数据库的方法可以执行


为什么现在不推荐使用%%来写JSP的代码,而是使用C标签?

1、<%%>不能和EL表达式一起使用,<%%>写JSP代码百度是说,容易被注入攻击

2、而且因为页面负责的功能是表示层,是用来展示的,因为这样符合MVC模式,JSP主要是用来显示的。如果用%%来写JSP的代码,显得繁琐。

3、c标签简单美观,JSTL的目标是为了简化JSP页面的设计。对于页面设计人员来说,使用脚本语言(默认值是JAVA语言)操作动态数据是比较困难的,而采用标签和表达式语言相对容易一些。

下面是 常用的C标签

 


2、Html有哪些常用的标签,CSS有几种引用方式,JS应该在顶部还是应该在底部加载?

<html> </html> 定义html文档

<head></head>定义文档的内容

<meta></meta>定义html文档的元信息

<title>…</title>        文档的标题

<link>                      文档与外部资源的关系

<style>…</style>    文档的样式信息

<!--…-->                 注释

<h1>...</h1>               标题字大小(h1~h6)

center>…</center>   居中文本

<a href=”…”>…</a>    超链接

<p>                            段落

<img src=’”…”>   定义图像

<table>…</table>   定义表格

<th>…</th>            定义表格中的表头单元格

<tr>…</tr>             定义表格中的行

<td>…</td>           定义表格中的单元

<form>…</form>    定义供用户输入的 HTML 表单


css主要有三种引用方法:

1,内部引用,在html文档中在<style>标签里面写的css样式  只能应用于当前网页,不能被其它网页共享。

<style>

bdoy{font-size:14px;}
</style>

2,外部引用,用<link>标签引用外部的css文件,将样式引用到html文档来。

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

3、在标签中使用,使用style属性将当前的标签样式改变。

<div style="color:red"></div>

JS存放的位置 (百度)

具体将引入的JS放在哪里与代码执行的顺序有关。网页文件的读取是从上到下的,如果将JavaScript文件放置在head当中,会先加载JS文件,之后再继续执行,那么此时,如果JS文件比较大,页面加载就会很慢,导致空白。

如果将JS文件放置在底部的话,可以让JS文件与图片几乎同时下载,使得页面当中的内容能够尽快的下载下来,但是,由于网页基本结构与样式均已经加载完成,那么此时负责交互的JS并没有下载下来,必然也会对用户的体验造成影响。

因此,整体来说,如果“交互性优先”,那么我们应当将JS放置在顶部。如果对于交互性要求没那么高的页面,我们将JS放置在底部。


3、SEO是什么,后端在用JSP的方式输出页面时,可以做的SEO优化有哪些? 

SEO(Search Engine Optimization):汉译为搜索引擎优化。是一种方式:利用搜索引擎的规则提高网站在有关搜索引擎内的自然排名SEO是指在了解搜索引擎自然排名机制的基础上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中的关键词自然排名,获得更多流量,从而达成网站销售及品牌建设的目标。

搜索引擎优化     一、内部优化
  (1)META标签优化:例如:TITLE,KEYWORDSDESCRIPTION等的优化
  (2)内部链接的优化,包括相关性链接(Tag标签),锚文本链接,各导航链接,及图片链接
  (3)网站内容更新:每天保持站内的更新(主要是文章的更新等)
  二、外部优化
  (1)外部链接类别:友情链接博客、论坛、B2B新闻分类信息贴吧、知道、百科、站群、相关信息网等尽量保持链接的多样性
  (2)外链运营:每天添加一定数量的外部链接,使关键词排名稳定提升。
  (3)外链选择:与一些和你网站相关性比较高,整体质量比较好的网站交换友情链接,巩固稳定关键词排名


4  Tiles现在的版本是多少?Template,Attribute,Definition,ViewPreparer分别是什么?

现在版本是3.0.8

  在Tiles中,模板(Template)是一个页面的布局部分。你能将一个页面结构看成是由不同的需要填补空白组成。

 注意:一个模板(Template)可以没有属性(attributes),这种情况下该模板可以直接使用。有属性的话就要先定义属性才能使用,不然的话就会在解析jsp页面的时候报错。

属性:Attribute

    属性是模板中的空白,它在你的应用程序中被填充到模板中。属性可以是以下三种类型:

  • string:属性是string的话,会将string直接呈现在页面。
  • template:属性是一个模板(Template),有无属性都行。如果有属性的话,你也要将他们填充后再呈现页面。
  • definition:它是一个可重复使用组成的页面,包含所有的属性来填充以呈现页面

定义:definition

   定义是呈现给最终用户的组合物;本质上,一个定义是由一个模板和完全或部分填充的属性组成的。说白了就是:一个定义是由一个模板和属性组成的。


  • 如果所有的“属性”都填充了,它将可以呈现给最终用户。
  • 如果不是所有的属性都填充了,这个定义称为“抽象定义”(abastract definition),它可以被用作“父定义”,让其他“定义”继承,失去的“属性”能在运行时填充。

视图助手:View Preparer

    有时候一个定义在呈现之前需要“预处理”。例如,显示一个menu时,menu的结构必须被创建并且已经保存在request范围内。

    为了达到“预处理 ”,视图助手将会被用到,视图助手将在呈现定义之前被调用,因此在将“定义”呈现所需的东西都会被正确的“预处理 ”。

5、Tiles有什么用处,为什么要用Tiles,如果不使用Tiles,可以实现公共部分的复用吗?

 Tiles框架为创建Web页面提供了一种模板机制,它能将网页的布局和内容分离。对于同一站点的所有Web页面,Header、Menu和Footer部分的内容相同,tiles框架可以将这些重复的页面代码进行单独分离出来,它允许先创建模板,然后在运行时动态地将内容插入到模板中。

 可重用性、可扩展性,维护性比较好

JSP两种代码复用方法:

1.<%@include file="test.jsp"%>; //该方法高速缓存,第一次加载完后会缓存,因此之后加载都会很快,适用于静态的,内容不变的待复用代码   

JSP include 伪指令允许某个页面从另一个页面提取内容或数据。

2.<jsp:include page="test.jsp" flush="true" /> //该方法,flush="true" 表示平台内容有所改变会随之改变,因此适用于内容动态变化的待复用代码,注:<jsp:include />标签结束符号“/” 

 jsp:include 元素不使用属于 include 伪指令的 %@ 语法。实际上, jsp 前缀让JSP 编译器知道:它应该寻找标准 JSP 标记集中的元素。其次,指定要包含的文件的属性从 file 变成了 page  flush 指示在读入包含内容之前是否清空任何现有的缓冲区。

明日计划 单点登录 Tooken 完善代码


返回列表 返回列表
评论

    分享到