发表于: 2017-10-07 23:41:07

1 823



今天完成的事情:

1.任务二的深度思考

2.监听session的数量。


明天计划的事情

1.监听session的数量,仔细了解每一行代码的意思

2.事物管理器


遇到的问题:

1. 删除/注销session
HttpSession session = request.getSession();
//一、把user的value赋值为null
session.setAttribute("user", null);
//二、清空user的值
session.removeAttribute("user");
//三、注销名为user的session
((HttpSession) session.getAttribute("user")).invalidate();
/**
* 如果通过session来进行免登录,那么sessionId就和账号绑定,不能用方法三
* 如果用cookie或者token进行实现就可以进行免登录,
* 在本项目里,用cookie进行免登录,而且要统计session的数量所以用方法三
*/


2. 提交账户密码问题:

@RequestMapping(value = "/a/login/validate",method = RequestMethod.POST , Student student)
public void validate(HttpServletRequest request, HttpServletResponse response, Model model) throws ServletException, IOException
{
String user = student.getUser();
String pass = student.getPass();



这样可以获取到前台传来的用户名密码,但是没有对应的东西怎么穿?

  <!--登录-->

        <div class="web_login" id="web_login">

            <div class="login-box">

                <div class="login_form">

                <form action="/a/login/validate" name="loginform" accept-charset="utf-8" id="login_form" class="loginForm"

                      method="post">

                    <input type="hidden" name="did" value="0"/>

                    <input type="hidden" name="to" value="log"/>

                    <div class="uinArea" id="uinArea">

                        <label class="input-tips" for="u">帐号:</label>

                        <div class="inputOuter" id="uArea">

                            <input type="text" id="u" name="username" class="inputstyle"/>

                        </div>

                    </div>

                    <div class="pwdArea" id="pwdArea">

                        <label class="input-tips" for="p">密码:</label>

                        <div class="inputOuter" id="pArea">

                            <input type="password" id="p" name="password" class="inputstyle"/>

                        </div>

                    </div>

                    <div style="padding-left:50px;margin-top:20px;"><input type="submit" value="登 录" style="width:150px;" class="button_blue"/></div>

                </form>

            </div>

            </div>

        </div>

        <!--登录end-->

    </div>




收获:

1.任务二的深度思考14(东西好多啊)

有个别还没能理解,还要看一看。

HTTP响应中包含的头包括1.响应头(response header) 2.普通头(general header) 3.实体头(entity header)。

    第三部分HTTP响应内容就是HTTP请求所请求的信息。这个信息可以是一个HTML,也可以是一个图片。


注(响应实体):
一、 General
        Request URL: 请求的域名
        Request Method: 页面请求方式
           Status Code : 请求返回的状态
           Remote Address: 请求的的远程地址
         Referrer Policy : Referrer 策略
注:(Referrer 策略)                         
  • No Referrer:任何情况下都不发送 Referrer 信息;
  • No Referrer When Downgrade:仅当发生协议降级(如 HTTPS 页面引入 HTTP 资源,从 HTTPS 页面跳到 HTTP 等)时不发送 Referrer 信息。这个规则是现在大部分浏览器默认所采用的;
  • Origin Only:发送只包含 host 部分的 Referrer。启用这个规则,无论是否发生协议降级,无论是本站链接还是站外链接,都会发送 Referrer 信息,但是只包含协议 + host 部分(不包含具体的路径及参数等信息);
  • Origin When Cross-origin:仅在发生跨域访问时发送只包含 host 的 Referrer,同域下还是完整的。它与 Origin Only 的区别是多判断了是否 Cross-origin。需要注意的是协议、域名和端口都一致,才会被浏览器认为是同域;
  • Unsafe URL:无论是否发生协议降级,无论是本站链接还是站外链接,统统都发送 Referrer 信息。正如其名,这是最宽松而最不安全的策略
   注:Referrer :
                    在页面引入图片、JS 等资源,或者从一个页面跳到另一个页面,都会产生新的 HTTP 请求,浏览器一般都会给这些请求头加上表示来源的 Referrer 字段。 
二、Response Header (返回头)
        Cache--Control: 告诉所有的缓存机制是否可以缓存及哪种类型 指定请求和响应遵循的缓存机制
              注(Cache-Control)
                      Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会影响到另一个
                                        消息处理过程中的缓存处理过程。
                      请求时的缓存指令包括:no-cache, no-store, max-age, max-stale, min-fresh, only-if-cached。
                      响应消息中的指令包括:public, private, no-cache, no-store, no-transform, must-revalidate, proxy-revalidate, 
                                                                        max-age。
                      各个指令的含义:
                              Public:指示响应可被任何缓存区缓存。 
                              Private:指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当前用户的部分响应消息,
                                                  此响应消息对于其他用户的请求无效。 
                              no-cache:指示请求或响应消息不能缓存 
                              no-store:用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 
                              max-age:指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 
                              min-fresh:指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 
                              max-stale:指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,
                                                       那么客户机可以接收超出超时期指定值之内的响应消息
                                   Connection: 表示是否需要持久连接。(HTTP 1.1默认进行持久连接)
                                   Content--Length: 响应体的长度  
       
          Content--Type : 数据的类型
             Date : 数据从服务器发送的时间。
             Expires: 响应过期的时间和日期
             Last--Modified: 请求资源的最后时间
             Vary: 告诉下游服务器是使用缓存响应还是从原始服务器请求
             Server: WEB服务器软件名字
             Set--Cookie: 设置和页面关联的cookie
             X--等等: 我们在开发Asp.net中,最后部署在IIS上. 然后发送HTTP请求,返回的HTTP头中包含Server, X-Powered-By, 和 X-AspNet-Version信息. 这些信息有时给攻击者找寻你的站点漏洞提供的依据.这些要删除。
三、 Request Headers  (请求头)
            Accept: 指定客户端能接受的内容类型
            Accept--Encoding : 指定浏览器可以支持的web服务器返回内容压缩编码类型。
            Accept-Language: 浏览器可以接受的语言
            Cache--Control : 指定请求和响应遵循的缓存机制
            Connection : 表示是否需要持久连接。(HTTP 1.1 默认进行持久连接)
            Content-Length: 请求的内容长度
            Content--Type : 请求与实体对应的MIME信息类型
            Cookie : 向服务器返回cookie,发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器。
            Host: 请求的服务器url和端口号
            if-Modified-Since: 如果请求的部分在指定时间之后被修改这请求成功,未被修改则返回304
            Referer : 该页面的来源URL。(先前网页的地址,当前请求网页紧随其后,即来路
            Upgrade-Insecure-Requests : 在浏览器的请求头出现的   Upgrade-Insecure-Requests:1
                                                                 则是告诉服务器,自己支持这种操作,也就是我能读懂你服务器发过来的上面这条信息,
                                                                 并且在以后发请求的时候不用http而用https
               User--Agent : 用户客户端的一些必要信息,User-Agent的内容包含发出请求的用户信息



2.监听session的数量。

还没有测试,明天测一下,代码只理解了一般


/**
* Created by Administrator on 2017-10-07.
* 当网站用户量增加时,session占用的内存会越来越大,这时session的管理,将会是一项很大的
* 系统开销,为了高效的管理session,我们可以写一个监听器,定期清理掉过期的session
*/
public class SessionScanerListener implements HttpSessionListener {

private static Logger loggerSSL = Logger.getLogger(SessionListener.class);

   // 创建一个线程安全的集合,来存储session
   @SuppressWarnings("unchecked")

//LinkedList类是双向列表,列表中的每个节点都包含了对前一个和后一个元素的引用.
   // Collections.synchronizedList()  详情:http://www.cnblogs.com/yaowen/p/5983136.html
   private List<HttpSession> sessionList = Collections.synchronizedList(new LinkedList<HttpSession>());

   private Object lock = new Object();

   public void sessionCreated(HttpSessionEvent httpSessionEvent){
loggerSSL.info("session创建成功");
       HttpSession httpSession = httpSessionEvent.getSession();
       loggerSSL.info("httpSession" + httpSession);
       /**
        * synchronized有两种用法,(this)一种是在方法定义时使用,多线程状态下,这个方法只能同时被同一个线程执行;
        * (lock)另一种就是你问到的这种情况,用于锁定代码段,也就是说,{ }括号中的代码是不会同时被多个线程执行,而是排队执行。
        *
        * synchronizedJava中的关键字,是一种同步锁。它修饰的对象有以下几种:
           1. 修饰一个代码块,被修饰的代码块称为同步语句块,其作用的范围是大括号{}括起来的代码,作用的对象是调用这个代码块的对象;
           2. 修饰一个方法,被修饰的方法称为同步方法,其作用的范围是整个方法,作用的对象是调用这个方法的对象;
           3. 修改一个静态的方法,其作用的范围是整个静态方法,作用的对象是这个类的所有对象;
           4. 修改一个类,其作用的范围是synchronized后面括号括起来的部分,作用主的对象是这个类的所有对象。
        */
       synchronized (lock){
sessionList.add(httpSession);
       }

}


public void sessionDestroyed(HttpSessionEvent httpSessionEvent) {
System.out.println("session 销毁成功...");
   }
// web应用关闭时触发contextDestroyed事件
   public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("web应用关闭...");
   }

// web应用启动时触发contextInitialized事件
   public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("web应用初始化...");
       // 创建定时器
       Timer timer = new Timer();
       // 每隔30秒就定时执行任务
       timer.schedule(new MyTask(sessionList,lock), 0, 1000*30);
   }


进度: 

         任务开始时间:8.14

         预计完成时间:10.8

         是否有延期风险:监听器还没有完成、事务管理器

禅道:http://task.ptteng.com/zentao/project-task-264.html


PS:监听器还有一个监听session的。












返回列表 返回列表
评论

    分享到