Session详细用法

(4)session技术
        1)什么是session?
            a, session是一种服务器端的状态管理技术。
            b, 当浏览器访问服务器时,服务器创建一个session对象(该对象有一个唯一的id号,称之为sessionId),服务器在默认情况下,会将sessionId以cookie的方式(set-cookie消息头)发送给浏览器,浏览器会将sessionId保存到内存。当浏览器再次访问服务器时,会将sessionId发送给服务器,服务器依据sessionId就可以找到之前创建的session对象。
        2)如何获得session对象?
            方式一:
                HttpSession s = request.getSession(boolean flag);
        当flag=true时:服务器会先查看请求当中有没有sessionId,如果没有,则创建一个session对象。
        如果有,会依据sessionId查找对应的session对象,如果找到,则返回该session对象,如果找不
        到,则创建一个新的session对象。
        当flag = false时:服务器会先查看请求当中有没有sessionId,如果没有,会返回null。
        如果有,会依据sessionId查找对应的session对象,如果找到,则返回该session对象,如果
        找不到,返回null。
            方式二:
                    HttpSession s = request.getSession();
                    等价于 request.getSession(true)。

            3)常用方法
        String session.getId();
        //obj类型最好实现Serializable接口,因为服务器在持久化session时,会使用java序列化协议。
        session.setAttribute(String name,Object obj);
        //如果name对应的值不存在,返回null。
        Object session.getAttribute(String name);
        //解除绑订
        session.removeAttribute(String name);
    4)session超时
        所谓session的超时,指的是服务器会空闲时间过长的
    session对象从内存空间里删除掉。原因是,过多的session
    的对象会占用服务器过多的内存空间。
        大部分服务器都会有一个缺省的超时限制,一般是
    30分钟。可以修改服务器的缺省的超时限制。
        比如,可以修改tomcat的web.xml配置文件(conf/web.xml)
         <session-config>
            <session-timeout>30</session-timeout>
        </session-config>
        修改完之后,需要重新启动服务器。
        也可以将以上配置放到某个应用的web.xml文件当中。
        另外,还有一个方法:
            session.setMaxInactiveInterval(int seconds);
    5)删除session
            session.invalidate();
    6)session案例:
        a, session验证
            step1, 在登录成功以后,在session对象上绑订数据
            比如: session.setAttribute("user",user);  
            step2, 对需要保护的资源(只有登录成功以后,才能
            访问的资源,比如 main.jsp)  ,添加session验证代码:
                Object obj = session.getAttribute("user");
                if(obj == null){
                    //跳转到登录页面
                }


我们在连接mysql数据库的时候一般都会在url后面添加    useUnicode=true&characterEncoding=UTF-8 ,但是问什么要添加呢?
添加的作用是:指定字符的编码、解码格式。
             例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下两个方面:
1. 存数据时:
     数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。
2.取数据时:
     在从数据库中取数据的时候,数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。
注意:在xml配置文件中配置数据库utl时,要使用&的转义字符也就是&amp;
                                                        例如:<property name="url" value="jdbc:mysql://localhost:3306/email?useUnicode=true&amp;characterEncoding=UTF-8" />


1、用户禁止cookie,如何继续使用session?(了解)
    (1)当用户禁止cookie以后,服务器仍然会发送sessionId(以set-cookie消息头的方式),但是,浏览器会拒绝接受,这样,session机制会失效。
    (2)可以使用url重写来解决该问题
        a,什么是url重写?
            如果某个组件需要session机制的支持,则不能直接使用该组件的地址去访问,而应该使用服务器生成的组件的地址(会在组件的地址后面添加sessionId)去访问。
        b,如何重写?
            //用于链接地址,表单提交地址。
            response.encodeURL(String url);
            //用于重定向
            response.encodeRedirectURL(String url);
            比如:
                response.sendRedirect(response.encodeRedirectURL("list.jsp"));
            转发不用考虑。
2、session的优缺点
    优点:
        session相对安全
        session能够保存的数据类型更丰富
        session能够保存的数据大小更大
    缺点:
        session需要将所有数据写在服务器端,所以,服务器会占用过多的内存空间。可以考虑使用cookie来代替或者使用数据库来保存状态(即数据)。

servlet容器如何处理请求资源路径?
    比如,在浏览器地址栏输入http://ip:port/web04/abc.html
    请求资源路径是:  /web04/abc.html
    1, 容器依据应用名找到应用所在的文件夹。
    2,容器会假设要访问的是一个servlet,会比较web.xml文件中<url-pattern>是否与"/abc.html"一致:
        a,精确匹配:
        b,通配符匹配:使用"*"来匹配任意的字符。比如<url-pattern>/*</url-pattern>
        /aaa   /aaa.bbb   /aaa/bbb/ccc
        c,后缀匹配:使用"*."开头,后接任意的字符。比如<url-pattern>*.do</url-pattern>
        会匹配所有以".do"结尾的请求。
    3,如果都不匹配,容器会查找静态页面,如果找到,就返回,找不到,返回404。

过滤器
    (1)什么是过滤器?
        servlet规范当中定义的一种特殊的组件,用来拦截容器的调用过程并进行相应的处理。
    (2)如何写一个过滤器
        step1,写一个java类,实现Filter接口。
        step2,将处理逻辑写在doFilter方法里面。
        step3,配置过滤器(web.xml)
    (3)过滤器的初始化参数
        step1,在web.xml,使用<init-param>配置初始化参数。
        step2, 使用FilterConfig.getInitParameter(String paraname)来获取初始化参数值。
    (4)过滤器的优先级
        当有多个过滤器都满足过滤的条件,则容器依据<filter-mapping>的先后顺序来调用过滤器。   
    (5)优点:
        a,可以将多个web组件相同或者相近的处理逻辑(比如,session验证、权限的管理、编码的处理等等)集中写在过滤器里面,方便代码的维护。   
        b,可以实现代码的“可插拔性”:删除或者添加某些模块,不会影响到整个程序的正常运行。
<filter>
    <filter-name>filter1</filter-name>
    <filter-class>web.Filter1</filter-class>
    <!-- 初始化参数 -->
    <init-param>
        <param-name>illegalStr</param-name>
        <param-value>pig</param-value>
    </init-param>
</filter> 
  <filter-mapping>
    <filter-name>filter1</filter-name>
    <url-pattern>/comment</url-pattern>
  </filter-mapping>
过滤器运行过程:
1) 浏览器发送请求给服务器
2) 服务器的Servlet引擎创建Request对象&&Response对象
3) Servlet引擎先调用过滤器的doFilter方法,该方法有两个参数request和response,
(在过滤器中可以访问到Request对象&&Response对象)
4) 过滤器对拦截的内容迚行处理
5) 之后调用SomeServlet的service方法
6) service方法执行
7) service方法执行结束后,将结果返回到过滤器
8) 过滤器将service方法返回的结果再次迚行过滤
9) 最后,Servlet引擎将结果返回给浏览器

ServletContext的作用是什么?
WEB容器在启动时,它会为每个WEB应用程序都创建一个对应的ServletContext对象,它代表当前web应用。
   ServletConfig对象中维护了ServletContext对象的引用,开发人员在编写servlet时,
   可以通过ServletConfig.getServletContext方法获得ServletContext对象。
    由于一个WEB应用中的所有Servlet共享同一个ServletContext对象,因此Servlet对象之间可以通过ServletContext对象来实现通讯。ServletContext对象通常也被称之为context域对象。

监听器 **
    1) 什么是监听器?
    servlet规范当中定义的一种特殊的类,作用是监听容器当中产生的一些事件并迚行相应的处 理。 容器产生的事件指的是
              两大类事件: 第一大类 生命周期相关的事件,指的是当容器创建戒者销毁request,session,ServletContext对象时产 生的事件。
                 第二大类 绑订事件,指的是当调用request,session,ServletContext对象的 setAttribute,removeAttribute时产生的事件。
    2) 如何写监听器
       step1 写一个java类,实现特定的监听器接口类,如:HttpSessionListener (依据要监听的事件类型)。 
       step2 在接口声明的方法中,实现监听的逻辑:
session对象一旦创建(就是访问该应用,就创建了session对象)就会执行该方法--
      因为这两个方法sessionCreated,sessionDestroyed都是重写父类的
      课堂例子演示的本质是session的数量随着浏览器个数的变化而变化,
 step3 配置(web.xml)。
<listener>
       <listener-class>web.CountListener</listener-class>      
</listener>
    3) ServletContext接口
      web服务器在启动时,会为每一个已经部署的应用创建唯一的一个ServletContext实例。 该实例会一直存在,除非服务器关闭戒者应用被删除。
      注意:每个应用对应唯一的一个ServletContext实例

    a. 如何获得ServletContext实例。
     GenericServlet提供了getServletContext()方法。
     HttpSession提供了getServletContext()方法。 
     ServletConfig提供了getServletContext()方法。
b. 常用方法
 绑订数据
setAttribute(String name,Object obj); 
getAttribute(String name); 
removeAttribute(String name);
 
   配置全局的初始化参数
     step1 在web.xml中,使用<context-param>配置的参数,可以被所有的servlet共享。 
   <context-param>
        <param-name>version2</param-name>
        <param-value>2</param-value>
    </context-param>
     step2 使用String ServletContext.getInitParameter(String paraName); 访问全局的初始化参数
依据逻辑路径获得实际部署时的物理路径:String ServletContext.getRealPath(String url);

注意:有先后顺序的要求:1<context-param>,2<listener>,3<filter>,4<servlet>

servlet线程安全问题
    (1)servlet为什么会有线程安全问题?
        默认情况下,servlet在容器内部只有一个实例;如果有多个请求同时访问某个servlet,容器会启动多个线程来调用这个servlet实例,就有可能发生线程安全问题:比如,多个线程同时去修改servlet实例的某个属性。
    (2)如何解决?
        a,使用synchronized关键字加锁
        b,让servlet实现SingleThreadModel接口(不建议使用)容器会为每一个线程创建一个对应的servlet实例来处理请求。因为会产生过多的servlet实例,所以,建议少用。

javabean其实就是一个java类,不过他是有某些规定的java类,例如它有属性,且属性名为全小写,对每个属性有get和set方法,叫做设置器与获取器,这个类还必须有一个无参数的构造函数。
javabean的提出是为了实现可重用组件的需求提出的。其实jdk里面的大部分类都是javabean。在通常情况下javabean被用作处理业务逻辑来使用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Spring Session 是 Spring 框架提供的用于管理用户会话的解决方案。它提供了一种简单的方式来将用户会话信息存储在不同的后端存储中,例如 Redis、MongoDB、JDBC 等,以确保会话信息的分布式和持久化。 使用 Spring Session,你可以像处理本地会话一样处理分布式会话,而无需考虑细节。下面是 Spring Session详细用法: 1. 引入依赖 在 Maven 项目中,你可以通过添加以下依赖来引入 Spring Session: ```xml <dependency> <groupId>org.springframework.session</groupId> <artifactId>spring-session-core</artifactId> <version>${spring.session.version}</version> </dependency> ``` 2. 配置 Spring Session 在 Spring Boot 应用程序中,你可以通过添加以下配置来启用 Spring Session: ```java @EnableRedisHttpSession public class AppConfig { // ... } ``` 此处使用了 Redis 作为后端存储,你可以根据实际需要使用其他存储方式。具体的配置方式可以参考官方文档。 3. 使用 Spring Session 在 Spring Session 中,你可以通过以下方式来访问会话信息: ```java @Autowired private HttpSession httpSession; ``` 此外,Spring Session 还提供了一些其他的特性,例如: - 使用 `@EnableSpringHttpSession` 注解实现会话复制。 - 使用 `@EnableJdbcHttpSession` 注解实现 JDBC 存储。 - 使用 `@EnableMongoHttpSession` 注解实现 MongoDB 存储。 - 使用 `@EnableGemfireHttpSession` 注解实现 Gemfire 存储。 总之,Spring Session 提供了一种简单的方式来管理用户会话信息,可以帮助你轻松地构建分布式应用程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

战神丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值