session
session是一种服务端的会话技术。主要作用是为了标识一次会话,并且在一次会话期间共享数据。
获取session对象
//通过req.getSession()获取当前会话对象
HttpSession session = req.getSession();
session到期时间
1.默认到期时间
当客户端第一次请求 servlet 并且操作 session 时,session 对象生成,Tomcat 中 session 默认的存活时间为 30min,即不操作界面的时间,一旦有操作,session 会重新计时。可以在 Tomcat 中的 web.xml 文件中进行修改。
2.自定义销毁时间
//通过session.setMaxInactiveInterval(int)来设定不活动时间,单位秒 HttpSession session = req.getSession(); session.setMaxInactiveInterval(10);
3.设置立即失效
//让session立刻失效 session.invalidate();
4.关闭浏览器
session主要依赖cookie实现,当关闭浏览器时,cookie因有效时间到期而消失,导致session也失效
5.关闭服务器
当服务器非正常关闭时,seesion销毁;当服务器正常关闭时,session将被序列化到磁盘上,保存到工作空间目录下的session.ser文件中。此时,当保存在session中的对象实现了Serializable接口,在下次服务器启动时,将自动加载到内存中。
session和cookie的区别
区别:
1.session保存在服务器,cookie保存在客户端
2.session是以对象的形似保存在服务器,cookie则以字符串的形式保存在客户端
3.session适合做客户端的身份验证,cookie适合保存用户的个人信息
4.cookie的安全性不如session。cookie信息存放在本地不安全,他人可以分析本地的cookie并且进行cookie欺诈。
5.单个cookie存储的限制是3k。一般浏览器所含有的cookie的最大数量在30到50之间。而session则没有大小限制。
6.session不能区分路径,同一用户在访问一个网站期间,所有的session在任何一个地方都可以访问到;cookie中如果设置了参数路径,那么同一个网站下的cookie互相访问不到
ServletContext
ServletContext的三种获取方式
通过request获取
ServletContext servletContext = request.getServletContext();
通过Session获取
ServletContext servletContext = request.getSession().getServletContext();
通过ServletConfig获取
ServletConfig servletConfig = getServletConfig(); ServletContext servletContext = servletConfig.getServletContext();
直接获取(通过获取父类方法)
ServletContext servletContext = getServletContext();
往ServletContext中存数据
servletContext.setAttribute("uname", "憨憨");
ServletContext和session作用域的比较
Servlet三大作用域
Request(一次请求)、Session(一次会话)、ServletContext(Application)(整个应用)
JSP四大作用域
PageContext(当前页面)、Request(一次请求)、Session(一次会话)、ServletContext(Application)(整个应用)
文件上传与下载
1.文件上传
流程
1、创建一个 DiskFileItemFactory 工厂类,并制定临时文件和大小
2、创建 ServletFileUpload 核心类,接收临时文件,做请求的转换
3、通过 ServletFileUpload 类转换原始请求,得到 FileItem 集合
4、遍历集合中的各个元素并处理
5、判断每个元素是否是普通表单项,如果是则按照普通表单项处理
6、如果不是普通表单项,则是文件,通过处理的方式进行处理(上传)
代码
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/**
* 使用OutputStream流向客户端浏览器输出中文数据(文件下载)
* 以上内容只能打开文件,却不能保存到相应的目录位置
* 文件下载功能是web开发中经常使用到的功能,使用HttpServletResponse对象就可以实现文件的下载
* getOutputStream():向客户端发送数据(字节流)
* getWriter():向客户端发送数据(字符流)
*/
//1.获取要下载的文件的绝对路径
String path = request.getServletContext().getRealPath("/1.jpg");
//2.获取要下载的文件名
String fileName = path.substring(path.lastIndexOf("\\")+1);
//3.设置content-disposition响应头控制浏览器以下载的形式打开文件
//设置context-disposition响应头,控制浏览器以下载形式打开,这里注意文件字符集编码格式,设置utf-8,不然会出现乱码
response.setHeader("content-disposition","attachment;filename="+URLEncoder.encode(fileName,"UTF-8"));
//4.获取要下载的文件输入流
//字符流输入流FileReader in = new FileReader(path);
InputStream in=new FileInputStream(path);
int len=0;
//5.创建数据缓冲区
//字符流缓冲区:char[] buffer = new char[1024];
byte[] buffer = new byte[1024];
//6.通过response对象获取OutputStream流
//编写文件下载功能时推荐使用OutputStream流,避免使用PrintWriter流,
//因为OutputStream流是字节流,可以处理任意类型的数据,
//而PrintWriter流是字符流,只能处理字符数据,如果用字符流处理字节数据,会导致数据丢失
//字符流写入流:PrintWriter out = response.getWriter();
ServletOutputStream out = response.getOutputStream();
//7.将FileInputStream流写入到buffer缓冲区
while((len=in.read(buffer))!=-1){
//8.使用OutputStream将缓冲区的数据输出到客户端浏览器
out.write(buffer, 0, len);
}
in.close();
}
@RequestMapping(value = "folder/downloadFileByFileId")
public void downloadFileByFileId(HttpServletRequest request, HttpServletResponse response, Long fileId) {
InputStream downloadFile = null;
try {
logger.info(String.format("Begin downloadFileByFileId(%d)", fileId));
if(fileId < 0){
return;
}
//获取文件下载路径 (服务器上面的地址)
String storePath = iEMDNPIFolderService.downFile(fileId);
// System.out.println("文件下载storePath:--->"+storePath);
downloadFile = new FileInputStream(storePath);
response.setContentType("application/octet-stream");
OutputStream fileOut = response.getOutputStream();
/**
* add 设置文件下载信息
*/
//获取文件名称
String filedisplay = iEMDNPIFolderService.findAttachmentByFileId(fileId).getFileName();
// System.out.println("文件名为:"+filedisplay);
// // 设置为下载application/x-download
response.setContentType("application/x-download");
// // 设置响应头信息
response.addHeader("Content-Disposition", "attachment;filename="+ new String(filedisplay.getBytes("utf-8"), "ISO-8859-1"));
// 写文件
int readByteCount = -1;
byte[] buffer = new byte[1024];
while ((readByteCount = downloadFile.read(buffer)) != -1) {
fileOut.write(buffer, 0, readByteCount);
}
} catch (Exception e) {
logger.error(e.getLocalizedMessage(), e);
e.printStackTrace();
} finally {
try {
if (null != downloadFile) {
downloadFile.close();
}
} catch (IOException e) {
logger.error(e.getLocalizedMessage(), e);
e.printStackTrace();
}
}
}
2.文件下载
public class DownloadServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 获取用户需要下载的文件名称
String fileName = request.getParameter("fileName");
// 判断文件名称是否为空
if(fileName==null || "".equals(fileName)){
response.setContentType("text/html;charset=utf8");
response.getWriter().write("<h1>请输入要下载文件名称!</h1>");
return;
}
// 得到文件存放目录download的真实路径
String path = request.getServletContext().getRealPath("/download/" + fileName);
// 得到文件
File file = new File(path);
// 判断文件是否存在以及是否是文件
if(file!=null && file.isFile()){
// 设置响应类型,告诉浏览器给我下载别给我加载
response.setContentType("application/octet-stream");
// 设置响应头
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 获取输入流
FileInputStream in = new FileInputStream(file);
// 获取输出流
ServletOutputStream out = response.getOutputStream();
// 输出文件
byte[] car = new byte[1024*10];
int len = 0;
while((len = in.read(car)) != -1){
out.write(car, 0, len);
}
// 关闭流
in.close();
out.close();
}else{
response.setContentType("text/html;charset=utf8");
response.getWriter().write("<h1>文件不存在!</h1>");
return;
}
}
}