Cookie
- 1 maxAge
最大有效时间(default -1)
大于0,单位为秒(持久化到本地)
小于0,关闭浏览器即失效(保存在浏览器内存中)
等于0,删除 - 2 path
允许访问Cookie程序的路径
/xxxx/ :
/ : all - 3 domain
可以访问该Cookie的域名(第一个字符必须为.)
- 4 name
Cookie的名称
- 5 value
Cookie的值
- 6 secure(default false)
安全传输
cookie的应用:①保存用户名和密码
浏览器提交Cookie时只提交name和value
Session
- 1 Session的有效时间
maxInactiveInterval (get && set &&web.xml配置)
set方法设置有效时间单位为秒,web.xml <session-timeout>单位为分钟
invalidate() 设置失效 - 2 Session需要Cookie的支持
浏览器会发送一个名称为JSESSIONID的Cookie, maxAge为-1
如果浏览器不支持Cookie,可以使用url重写(response.encodeURL(String url))
Fliter(javax.servlet.Fliter)
-
- 过滤器链
①init
②doFliter
③destory -
2 应用
①防止图片盗链(请求头的referer字段)
②处理编码
③日志记录
④权限验证
⑤异常捕获(Servlet中可以抛出异常)
⑥内容替换Fliter
HttpServletResponseWrapper类,当Servlet调用response输出字符内容时会调用getWrite()方法,此时将输出内容进行保存而不进行输出; 如果输出二进制内容需要调用getOutputStream()
⑦ GZIP压缩Fliter
Listener (Servlet2.3)
监听session、context、request对象的创建和销毁
- HttpSessionListener
- ServletContextListener
- ServletRequestListener
监听session、context、request对象的属性变化
- XXXAttributeListener
attributeAdded(xxxEvent e)
使用e可以获得变动的属性名
还有属性移除,属性变更的函数
- 应用
①单一登录
登录的时候把用户信息存到Session,当用户使用同一个账号再次登录时,将Session中旧的客户信息对象移除(同时会出发attributeRemoved),并将新的信息保存,原来的登录发现Session中没有登录信息就强制下线了。当在登陆过的客户端使用别的账号登录时,先把Session中旧的登录用户信息删除,在把新的信息保存
Servlet
Servlet线程安全问题(单实例多线程)
Servlet在运行过程中只会初始化一次,之后都使用同一个对象来处理请求
tomcat(Servlet容器)将请求封装成HttpRequest对象传递给service方法
当多个线程并发访问时,每个线程会创建自己的堆栈,对于局部变量来说,每个线程
压入堆栈的局部变量都是不同的,而对于类的成员变量或者静态变量(因为对象一般在堆上)各个线程是共享的,并发操作这些变量可能会造成线程安全问题
当在Servlet中对某个外部对象如文件进行操作时要进行加锁进行互斥访问
SSH框架
Struts2
工作流程,拦截器截取请求,获取请求参数,根据配置文件,创建一个Action,将请求参
数封装到该Action实例中,Action处理完一次请求就会销毁
- Struts2 标签 <%@taglib uri="/struts-tags" prefix="struts" %>
<struts:form>
<struts:label value="登录系统"></struts:label>
<struts:textfield name="acount" label="账号"></struts:textfield>
<struts:password name="passwd" label="密码"></struts:password>
</struts:form>
- 拦截器
配置在struts-core包的struts-default.xml文件中进行配置
示例
timer拦截器,记录Action执行时间并打印到控制台
配置到相应action中
token拦截器(防止表单重复提交)
Hibernate
jar包
required + jpa + [日志] + 数据库驱动
配置文件
1.映射文件
表的主键的配置(<id>)
配置主键生成策略(<generate class='native'>)
表字段和类成员对应配置(<property>)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 配置类和表结构的映射 -->
<class name="entity.User" table="h_user">
<!-- 配置id
见到name属性,JavaBean的属性
见到column属性,是表结构的字段
-->
<id name="id" column="uid">
<!-- 主键的生成策略 -->
<generator class="native"/>
</id>
<!-- 配置其他的属性 -->
<property name="username" column="username"/>
<property name="password" column="password"/>
</class>
</hibernate-mapping>
2.全局配置文件
先配置SessionFactory(一个SessionFactory对应一个数据库)
数据库驱动+url+用户名+密码+数据库方言(必须配置)
可选配置[显示SQL语句+格式化SQL语句+自动生成数据库的表结构]
引入映射的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<!-- 记住:先配置SessionFactory标签,一个数据库对应一个SessionFactory标签 -->
<session-factory>
<!-- 必须要配置的参数有5个,4大参数,数据库的方言 -->
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql:///day01</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">root</property>
<!-- 数据库的方言 -->
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 可选配置 -->
<!-- 显示SQL语句,在控制台显示 -->
<property name="hibernate.show_sql">true</property>
<!-- 格式化SQL语句 -->
<property name="hibernate.format_sql">true</property>
<!-- 生成数据库的表结构
update:如果没有表结构,创建表结构。如果存在,不会创建,添加数据
-->
<property name="hibernate.hbm2ddl.auto">update</property>
<!-- 映射配置文件,需要引入映射的配置文件 -->
<mapping resource="entity/User.hbm.xml"/>
</session-factory>
</hibernate-configuration>
-
Configuration
配置对象(数据库相关、映射文件)
应用程序创建时加载 -
SessionFactory
配置对象被用于创造一个 SessionFactory 对象,使用提供的配置文件为应用程序依次配置 Hibernate,并允许实例化一个会话对象。SessionFactory 是一个线程安全对象并由应用程序所有的线程所使用
-
Session(单线程对象,不能被公用)
-
Transaction
Dao 数据访问对象
网友评论