发表于: 2020-07-30 22:31:12
1 1356
完成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,则会继续执行postHandle和afterCompletion。
*/
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。所以现在将token用DES解密
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,KEYWORDS,DESCRIPTION等的优化
(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 完善代码
评论