Cookie
储存信息格式:Key - Value
Cookie new Cookie(String name, String value);
创建新Cookie
setMaxAge(int expire);
设置cookie生存时间, 单位为秒, 格式有三种<0,0,>0 分别代表内存存储, 失效, 生存时间
setPath(String uri);
设置cookie作用域
resp.addCookie(Cookie cookie);
让浏览器添加Cookie, 使其能被读取
Cookie可能会面临乱码问题, 这时需要使用Encoding类来解码:
URLencoder.encode(String target, "UTF-8")
URLdecoder.decode(String target, "UTF-8")
Cookie在页面端请求后得到的是一个Cookie[], 需要迭代并对比Key来获取Value值
<%
String uName = "";
String uPass = "";
Cookie[] cookies = request.getCookies();
if (null != cookies) {
for (Cookie cookie : cookies) {
String name = cookie.getName();
if (name.equals("userLoginName")) {
uName = cookie.getValue();
} else if (name.equals("userPwd")) {
uPass = cookie.getValue();
}
}
}
%>
Session
Session的创建:
用户第一次访问服务器
Session的获取:
HttpSession session = request.getSession();
Session的作用域:
当前会话当中(如果服务器重启或者用户注销则会清除Session)
Session的生命周期:
session默认的生命周期为30分钟, 意味着如果不进行操作, 三十分钟后session将被清除.
但是我们可以人为的设置session的生命周期:
<session-config>
<session-timeout>...</session-timeout> (单位为分钟)
</session-config>
Session的失效:
session的失效有三种方式:
1. 手动删除:
invalidate();
2. 长时间不与服务器交互, session过期
3. 非正常关闭服务器时销毁. 如果服务器正常关闭, session会钝化到本地硬盘中, 以session格式储存, 在session过期之前都可以重新登录以活化session.
Session的使用场景:
1.使用session保存用户的登录状态
2.使用session存储验证码信息
Ajax异步请求
Ajax目的:
通过局部刷新页面的方式来更新数据
Ajax原生代码:
1. 创建XmlHttpRequest对象
XMLHttpRequest xhr = new XMLHttpRequest();
2. 监听服务器返回值状态
xhr.onreadystatechange = function() {
if (xhr.readystate = 4 && xhr.status = 200) {
4. 获取服务器响应结果
var ret = xhr.responseText;
if (ret == 1) {
....
} else {
....
}
}
}
3. 发送请求
var url = "UserServlet?action=login&....."
xhr.open("GET", url, true); (true, false 代表是否异步请求)
xhr.send();
POST格式请求的区别:
3. var url = "UserServlet"
var data = "action=login&....."
xhr.open("POST", url, true);
xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded"); (设置表头)
xhr.send(data);
Ajax的Jquery封装后代码:
$.ajax(url:"....Servlet",
data:"action=....",
dataType:"POST"/"GET",
type:"text"/....
success: function(ret) {
}
)
$.post/get ("...Servlet","action=....", function(ret) {
....
}, "text");
文件的上传与下载
文件上传:
前置工作:
文件上传的Servlet里需要注解配置, 以标识当前Servlet提供上传功能
@MultiPartConfig
文件上传的表单中需要进行配置enctype属性, 并且只支持POST属性
"enctype="multipart/form-data" method="POST"
Part part = req.getPart("file") ---> "file"是form表单的name属性
String realpath = part.getServletContext().getRealpath("/..."); ---> "/..."是要储存文件的文件夹名
String header = part.getHeader("Content-Disposition"); ---> 获取表头信息来截取suffix
InputStream is = part.getInputStream();
String suffix = header.substring(header.lastIndexOf("."), hdeader.length - 1); ---> ".txt"/".html"....
String fileName = UUID.randomUUID + suffix;
FileOutputStream fos = new FileOutputStream (realpath + "/" + fileName);
文件下载:
首先需要一个ID属性去定位想要从服务器下载的文件
String id = req.getParameter("id");
定位到对象 ---> Download d
构建下载地址:
String path = req.getServletContext().getRealpath("/...") + "/" + d.getDownloadPath;
检测文件是否存在:
File file = new File(path);
if (file.isExists) {
OutputStream os = resp.getOutputStream();
FileInputStream fis = new FileInputStream(path);
}
设置文件下载信息:
resp.setHeader("Content-Disposition", "attachment; filename=" + ....) ---> 文件下载后显示的名字 可能会有乱码问题, 需要用URLencoder解决
Servlet、Filter声明周期问题
Servlet和Filter的声明周期类似, 生命周期都有四个阶段:
1. 实例化
2. 初始化
3. 服务
4. 销毁
在Servlet第一次被访问到的时候, 会执行一个实例化的步骤, 查看当前Servlet是否有实例
如果有, 使用它, 如果没有就创建一个新的Servlet对象.
紧接着调用init()方法, 进行对象的初始化, 然后进行服务, 最后调用destroy()方法销毁.
Filter构造器在服务器启动时会被调用, 且也只会调用一次
紧接着也会调用初始化方法对Filter对象进行初始化, doFilter方法会根据业务需求对进入服务器的请求进行放行, 达到过滤的需求
最后在服务器关闭的时候调用destroy方法进行收尾