声明使用的Tomcat9&JDK9  进行测试;

session作为一个容器,首先要知道的就是session 存在的位置  :在服务器的内存中 ;

session的特点有以下2个【应用场景】:

①共享request域;

② 可用于  :保存用户信息, 来判断用户是否登录 ;比如,在登录案例中 ,把 form表单提交的 user 数据,保存到 session中,通过 cookie 把 session持久化【由于session  存在唯一的 id  : JSESSIONID 可用于辨别 session】,从session中获取 user 数据,判断 user 的内容,从而知道用户是否在 登录的状态,或者是哪一个用户在登录;

下面演示一个判断用户登录与否,登录可下载,否则不能下载,跳转到登录页面的demo;

 

通过把session作为参数,持久化 cookie 来达到持久化session的目的【浏览器可以识别cookie ,从中获取session】;

 

session的常用方法:

//void setAttribute(String name,Object value)  储存
//Object getAttribute( String name)  获取数据
//void removeAttribute(String name)  删除session中的数据
//String sessionId = session.getId();获取id

 session的生命周期:

在Tomcat 中默认存活30分钟,可以在web.xml中配置更改存活时间,如下:

<session-config>
    <session-timeout>30</session-timeout>
</session-config>

 

 

启动Tomcat,访问servlet  会创建session ,结果如下:

关闭浏览器再次访问 ,session 的name 以及 id  没有发生变化平【说明 session没有被新建】: 

 

 

package com.baidu.session;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet(name = "Demo1", urlPatterns = "/demo1")
public class Demo1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);//
    }
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        request.setCharacterEncoding("utf-8");
        response.setContentType("text/html;charset=utf-8");
        HttpSession session = request.getSession();//获取session,设置session
        session.setAttribute("name", "张三啊");
        Object name = session.getAttribute("name");//获取name &id
        String id = session.getId();
        response.getWriter().print(name + "session的id" + id);
        //通过持久化cookie
        Cookie sessionName = new Cookie("sessionName", name.toString());
        Cookie sessionId = new Cookie("JSESSIONID", id); //JSESSIONID 作为session的idName  
        sessionName.setMaxAge(60 * 30);//设置30min 存活时间
        sessionId.setMaxAge(60 * 30);
        response.addCookie(sessionName);
        response.addCookie(sessionId);
    }
    //获取session,设置session ,输出到浏览器
    //
}

 下面演示一个判断用户登录与否,登录可下载,否则不能下载,跳转到登录页面的 demo;

①在下载的页面,点击下载 【访问 downloadservlet】,对登录进行判断;

②login.jsp  进行 form表单提交,访问  loginservlet  【设置session,并跳转至下载页面】

package www.baidu.servlets;
import www.baidu.bean.User;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.URLEncoder;
@WebServlet(name = "DownloadServlet", urlPatterns = "/DownloadServlet")
public class DownloadServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);//
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        User user = (User) request.getSession().getAttribute("user");
        //user进行非空判断  ,若空说明没有登录,若不空,说明就已登录
        if (user == null) {
            response.sendRedirect("/login.jsp");
        } else {//  可以进行下载
            String filename = request.getParameter("filename");
            //设置 urlencode
            String encode = URLEncoder.encode(filename, "utf-8");
            String realPath = request.getServletContext().getRealPath("WEB-INF/" + encode);
            String mimeType = request.getServletContext().getMimeType(filename);
            //设置header
            response.setContentType(mimeType);   //告知浏览器类型
            response.setHeader("Content-Disposition", "attachment;filename=" + filename);//告知以附件形式下载

            //循环读写下载
            File file = new File(realPath);
            FileInputStream fis = new FileInputStream(file);
            ServletOutputStream os = response.getOutputStream();
            int len = -1;
            byte[] buf = new byte[1024];
            while ((len = fis.read(buf)) != -1) {
                os.write(buf, 0, len);
            }
            //关闭流
            os.close();
            fis.close();
        }
    }
}

loginservlet  的核心代码:

  String username = request.getParameter("username");
        String password = request.getParameter("password");
        User user = new User();
        user.setName(username);
        user.setPassword(password);
        //获取session  将用户信息保存在session中
        request.getSession().setAttribute("user",user);
        //去下载页面进行下载
        response.sendRedirect("download.html");

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐