发表于: 2017-10-27 23:25:40
1 679
今天完成的任务:
1.继续理解昨天的cookie实现原理。
首先是拦截器中preHandle的作用:每一个拦截器(interceptor)在执行之前都会最先调用这个方法,所以在这个方法中可以执行前置初始化的操作或者对当前请求的预处理,也可以在方法中写一些判断决定方法是否继续执行下去。这个方法的返回类型是boolean类型,返回false的时候表示请求结束,后续的操作都不会进行下去,当返回类型是true的时候就会继续调用下一个interceptor的preHandler方法,如果是最后一个interceptor,就继续执行后面的操作。先声明的interceptor中preHandle会先执行。
postHandle:只有在preHandle返回为true的时候才会执行,调用的时间是在Controller执行后,但是会在dispatcher-servlet对modelandview进行视图渲染之前调用,所以可以对Controller返回的modelAndView进行操作。先声明的interceptor中postHandle会后执行。
afterCompletion:只有在preHandle返回为true的时候执行。在整个请求结束之后会执行,就是在dispatcher-servlet对视图渲染执行完了以后执行,作用是资源清理。
参考:
http://blog.csdn.net/ufo2910628/article/details/24423413
重新梳理一下cookie的执行,指定的请求首先被拦截器拦截,然后分配到interceptor中进行处理,
首先是preHandle进行判断,是否有这个cookie,这个cookie是否正确,如果是就返回true直接的进入,
如果不是就重定向到登录界面,交给Controller处理,Controller中会判断用户名正确然后新增一个cookie。登录进入页面。
2.拆禅道。
3.学习http request请求。
HttpServlet request 是一个对象,这个对象代表了客户端发送的请求,当客户端发送请求到服务器的时候,
所有信息都在这个对象里面,通过对象提供的方法获得客户端请求的所有信息。
首先先了解一下request的常用方法:
@RequestMapping(value = "/req")
public void doGet(HttpServletRequest request, HttpServletResponse response)throws Exception{
String requestUrl=request.getRequestURL().toString();//获取到请求的url地址
String requestUri=request.getRequestURI();//得到请求的资源。
String queryString=request.getQueryString();//得到请求的url中附带的参数
String remoteAddr=request.getRemoteAddr();//得到请求者的IP地址
String remoteHost=request.getRemoteHost();//请求者主机
int remotePort=request.getRemotePort();//得到请求者端口
String remoteUser=request.getRemoteUser();//得到请求者的用户
String method=request.getMethod();//获取请求的方法
String pathInfo=request.getPathInfo();
String localAddr=request.getLocalAddr();//得到本地web容器的IP地址
String localName=request.getLocalName();//获取web容器的名字
response.setCharacterEncoding("utf-8");//设置字符编码utf-8输出到客户端
response.setHeader("content-type","text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.write("获取到的客户机信息如下:");
out.write("<hr/>");
out.write("请求的URL地址:"+requestUrl);
out.write("<br/>");
out.write("请求的资源:"+requestUri);
out.write("<br/>");
out.write("请求的URL地址中附带的参数:"+queryString);
out.write("<br/>");
out.write("来访者的IP地址:"+remoteAddr);
out.write("<br/>");
out.write("来访者的主机名:"+remoteHost);
out.write("<br/>");
out.write("使用的端口号:"+remotePort);
out.write("<br/>");
out.write("remoteUser:"+remoteUser);
out.write("<br/>");
out.write("请求使用的方法:"+method);
out.write("<br/>");
out.write("pathInfo:"+pathInfo);
out.write("<br/>");
out.write("localAddr:"+localAddr);
out.write("<br/>");
out.write("localName:"+localName);
}
但是很奇怪我得到的是:
客户服务端的ip地址和host都是不对的。奇怪。。。
这个问题暂时先放下。。
4.学习拦截
过滤器(filter):当我们有很多东西但是只想要某一种的时候使用,比如想要过滤掉不是.do的请求,在传入servlet之前设置统一字符集。
或者去除掉非法字符(聊天室过滤不文明的话)
拦截器(interceptor):当一个流程正在运行的时候,希望干预他的运行。比如用来登录的权限验证,判断是否登录,
监听器(listener):当一个时间发生的时候只想获得事情发生的信息而不想要去干预。
参考https://www.zhihu.com/question/35225845/answer/61876681
5.学习des加密和md5加密
MD5加密的原理是把任意长度的字节传转换成一定长的大整数。MD5是不可逆的,也就是没有对应的算法,从生产的MD5值逆向得到原始数据。
一个原始数据只对应一个md5值,但是一个MD5值,可能对应多个原始数据。
DES加密可以实现加密和解密。
实现了对字符串进行加密和解密。
参考:
http://z2009zxiaolong.iteye.com/blog/1562197
6.了解一下session
session之前也看过概念,但是没有自己使用过,所以今天先试试。
session是由服务器创建,并且将数据写入到一个单独的session中,可以使用getSession方法得到session。
当服务器创建过session之后会返回一个id号,传入cookie写会客户端,这样的话只要浏览器不关闭再次访问服务器时都会带着session的id号,
这样服务器发现客户端带着session的id访问的时候就会使用对应的session响应。
直接在Controller中写
@RequestMapping("demo3")
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setCharacterEncoding("UTF=8");
response.setContentType("text/html;charset=UTF-8");
//使用request对象的getSession()获取session,如果session不存在则创建一个
HttpSession session = request.getSession();
//将数据存储到session中
session.setAttribute("data", "孤傲苍狼");
//获取session的Id
String sessionId = session.getId();
//判断session是不是新创建的
if (session.isNew()) {
response.getWriter().print("session创建成功,session的id是:"+sessionId);
}else {
response.getWriter().print("服务器已经存在该session了,session的id是:"+sessionId);
}
}
然后可以直接启动web容器,去访问demo3,
第一次访问:
刷新:
可以看到是可以识别出是否有session存在。
另外session的有效时间是30min,也可以在web.xml中自己设置session的有效时间。
<session-config>
<session-timeout>15</session-timeout>
</session-config>
最后删除session或者是session失效:调用session.invalidate();
HttpSession session = request.getSession();
//手工调用session.invalidate方法,摧毁session
session.invalidate();
7.写一个token工具来加密信息。
这个比较简单就是调用Des加密工具类去对某个需要加密的字符串进行加密然后返回。
public class TokenUtil {
public static String getToken(String username) throws Exception {
DesUtil des=new DesUtil("java");
String token=username;
return des.encrypt(token);
}
}
明天计划:
明天尽量吧任务五做完交了。。。
遇到问题:
上面提到了。
收获:
就是任务五的要求差不多完成了
学习了cookie,拦截器,加密各种用法。
禅道:
任务五的第三天,明天尽量做完
http://taskNaNteng.com/zentao/task-view-10339.html
评论