Java 二阶段 Servlet Cookie Session ServletContext

状态管理

在这里插入图片描述

Cookie

在这里插入图片描述

Cookie的使用

在这里插入图片描述

//1创建Cookie的对象
Cookie cookie = new Cookie("username", "zhangsan");
Cookie cookie1 = new Cookie("address","北京");
//2设置参数
// “/ ”代表整个网站,只要你是访问的整个网站,都会返回给服务器
// /0831web 表示只要是0821web的这个项目,都会传给服务器 (默认是创建cookie的servlet或者是所在的页面。)
//设置有效路径
cookie.setPath("/");
//设置有效期,默认-1,保存在内存中,浏览器关闭就失效    0 ,删除cookie    >0表示有效期,单位是秒
cookie.setMaxAge(60*60*7);
//设置httponly
cookie.setHttpOnly(true);
//发送给浏览器
response.addCookie(cookie);
response.addCookie(cookie1);

获取cookie

Cookie[] cookies = request.getCookies();
if (cookies != null) {
    for (Cookie cookie : cookies) {
        System.out.println(cookie.getName()+"--"+cookie.getValue());
    }
}

更新修改Cookie

//更新修改cookie,(保证name和有效路径相同认为是同一个cookie)
Cookie cookie1 = new Cookie("username", "李四");
cookie.setPath("/");
cookie.setMaxAge(60*60*7);
response.addCookie(cookie);

删除Cookie

Cookie cookie1 = new Cookie("username", "李四");
//删除cookie,把有效期设置为0
cookie.setMaxAge(0);
response.addCookie(cookie1);

中文乱码

在这里插入图片描述

//在以前会出现中文乱码问题,所以需要编码,现在不需要了
//编码
Cookie cookie = new Cookie("username", URLEncoder.encode("李四", "utf-8"));
response.addCookie(cookie);

//解码
Cooke[] cookies = request.getCookies;
f (cookies != null) {
    for (Cookie cookie : cookies) {
        System.out.println(cookie.getName()+"--"+URLDecoder.decode(cookie.getValue(),"utf-8"));
    }
}

Cookie的优缺点

在这里插入图片描述

Session

在这里插入图片描述
客户端请求,服务端创建session,并创建sessionid,响应时以cookie的形式把sessionid传给客户端,客户端再次请求时用cookie的形式请求服务器,服务器就知道谁是谁了。

在这里插入图片描述

//获取session的创建时间
System.out.println(new Date(session.getCreationTime()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
//获取最后的访问时间
System.out.println(new Date(session.getLastAccessedTime()).toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime());
//获取id
System.out.println(session.getId());

session存储数据
在这里插入图片描述

session失效

在这里插入图片描述
浏览器关闭,session只是失效,并没有清除,有效期过了,服务器会把它清除,但是会为什么失效,是因为存在客户端中的存有sessionid的cookie没有了。

//修改有效期
//通过代码,单位是秒,有效期是指每刷新一次网页,有效期就重置。
//session.setMaxInactiveInterval(60*10);
//使用配置文件,web.xml
<session-config>
    <!--单位是分钟-->
    <session-timeout>10</session-timeout>
</session-config>

验证码

ValidateCode提供了验证码的使用。

//创建验证码 防止集器自动登录和注册,进而导致数据库有大量无效数据,最终导致宕机。
ValidateCode code = new ValidateCode(100,30,4,30);
//把验证码存储到session中
HttpSession session = request.getSession();
session.setAttribute("code",code.getCode());
//把验证码以图片的形式发送给浏览器
code.write(response.getOutputStream());

Cookie禁用解决方法

在这里插入图片描述
response.encodeURL()这个也可以。

HttpSession session = request.getSession();
session.setAttribute("username", "haha");
String booklist = response.encodeRedirectURL("booklist");
response.setContentType("text/html;charset=utf-8");
response.getWriter().write("<a href="+booklist+">书籍列表</a>");

ServletContext

在这里插入图片描述
在这里插入图片描述

ServletContext application1 = getServletContext();
//得到项目的真实路径
String realPath = application1.getRealPath("/");
//得到主要路径,就是真实路径映射的路径,上下文路径
String contextPath = application1.getContextPath();
String contextPath1 = request.getContextPath();
application1.setAttribute("user", "张三");
application1.setAttribute("address", "北京");

Object user = application1.getAttribute("user");
Object address = application1.getAttribute("address");

application1.removeAttribute("user");

下载文件,用ServletContext的真实路径

ServletContext servletContext = getServletContext();
String realPath = servletContext.getRealPath("/image/0.png");
FileInputStream fis = new FileInputStream(realPath);
byte[] bytes = new byte[1024];
int len = 0;
//下载文件
response.setHeader("content-disposition", "attachment;filename="+ URLEncoder.encode("哈哈.png", "utf-8"));
ServletOutputStream outputStream = response.getOutputStream();
while((len = fis.read(bytes))!=-1){
    outputStream.write(bytes,0,len);
}
fis.close();

在这里插入图片描述

计算访问次数

@WebServlet(name = "CountServlet", value = "/count")
public class CountServlet extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ServletContext servletContext = getServletContext();
        synchronized (servletContext) {
            Integer count = (Integer) servletContext.getAttribute("count");
            if(count == null){
                count = 1;
            }else {
                count++;
            }
            servletContext.setAttribute("count", count);
        }
        response.setContentType("text/html;charset = utf-8");
        response.getWriter().write("访问次数"+servletContext.getAttribute("count"));
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doPost(request,response);
    }
}

类加载器读取java中的out目录,或者是web文件的classes目录。

域对象总结

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值