Servlet笔记03之cookie和session

1.jsp概念:Java Server Page Java 服务页面。
特点:即能写HTML CSS JS 他还能写 Java代码。
作用:简化页面的书写。
jsp的本质是servlet。

2.在jsp上使用特定的语法编写java的代码

早期脚本(不推荐大量使用)
1.<%----%> 注释
2.<%!   %> java代码的成员位置
3.<%    %> 在servlet的service的方法中(在后台展示)
4.<%="abc"%> 生成的代码在 prinlt("abc")(在前台展示)

3.刷新头(三秒跳转)

案例2-当我们登录失败,提示"用户名密码不匹配",3秒以后跳转到登录页面
技术分析:
	定时刷新
常见的响应头-refresh
	响应头格式:
		refresh:秒数;url=跳转的路径
	设置响应头:
		response.setHeader(String key,String value);设置字符串形式的响应头
		response.addHeader(String key,String value);追加响应头, 若之前设置设置过这个头,则追加;若没有设置过,则设置
	设置定时刷新:
		response.setHeader("refresh","3;url=/day0901/login.htm");
步骤分析:
	登录失败之后,修改业务逻辑
		打印之后添加一个头信息即可

4.会话技术:解决客户端和服务端的数据共享问题,因为http协议是一种无状态协议(不会记录上次访问的记录),所以通过会话数据,实现多次数据的共享。

会话:是服务器与客户端浏览器之间建立起来的一次通信,在这一个通信中实现一次或者多次请求或者响应,实现服务器和客服端的数据之间的共享。

客户端会话技术(cookie):将数据保存在浏览器(服务端),可以减轻服务器的压力,数据不安全

原理:浏览器第一次请求服务器,服务器第一次响应会给一个set-cookie头+数据,把数据交给浏览器保存,浏览器第二次请求服务器,会带上数据通过cookie请求头带给服务器,服务器端可以取数据出来用。

代码展示:
第一个servlet给浏览器客户端发一个cookie的数据
public class cookieServlet1 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建cookie
        Cookie cookie = new Cookie("key", "value");
        //发送cookie
        response.addCookie(cookie);
    }

第二个servlet获取浏览器客户端中的cookie中的数据

@WebServlet(name = "CookieServlet2",value = "/demo2")
public class CookieServlet2 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        Cookie[] cookies = request.getCookies();
         //判断cookie是否为空
        if (cookies != null) {
        //遍历cookies数组
        for (Cookie cookie : cookies) {
            //获取cookie的键
            String name = cookie.getName();
            //判断cookie的键
            if (name.equalsIgnoreCase("key")){
                //获取cookie中的数据
                String value = cookie.getValue();
                System.out.println(value);
            }
        }
    }
}

cookie的注意事项:

1.持久性问题:默认情况下,cookie中的数据是保存在浏览器的缓存中,浏览器关闭时,内存释放,cookie中的数据就没有了,处理方法:设置cookie保存数据的事件

在客户端设置存放cookie的时间
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //创建cookie
        Cookie cookie = new Cookie("key", "value");
        //设置cookie存活的时间,以秒为单位
        cookie.setMaxAge(60*60);//这是存放一小时
        //-1是默认值,直接保存在客户端,0是清除cookie,不允许存放cookie
        cookie.setMaxAge(-1/0)
        //在请求头中添加cookie
        response.addCookie(cookie);
    }

清除cookie

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //设置与客户端的数据要一致
        Cookie cookie = new Cookie("key", "value");
        //设置cookie存放的时间为0
        cookie.setMaxAge(0);
        //发送回去
        response.addCookie(cookie);
    }

2.不能跨浏览器进行操作

3.cookie以前不支持中文,现在cookie可以直接存储中文,不需要进行编解码的操作
get请求中有提交的方式是通过(URLdecoder解码,URLencoder编码)

public class Demo {
    public static void main(String[] args) throws UnsupportedEncodingException {
        String name="张三";
        //编码,参1为需要编码的字符串,参2为编码规则
        String bmname = URLEncoder.encode(name, "utf-8");
        System.out.println(bmname);
        //解码,参1为需要解码的字符串,参2为编码规则
        String jmname = URLDecoder.decode(bmname, "utf-8");
        System.out.println(jmname);
    }
}

3.服务端会话技术(Session):将数据存放在服务端(数据有保障,但会增加服务器的压力)

  1. 将数据存储在服务器端
  2. 原理:session依赖于cookie存在

Java实现Session:
//1.获取session
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute(“msg”, “hehe”);
//3.获取数据
Object msg = session.getAttribute(“msg”);
session细节:

浏览器关闭了,session不一样了。

Cookie没了。jsessionid没了。

服务器关闭了,session一样吗?不一样。内存释放了。

优化:虽然对象不一样了,但是session中存储的数据还是一样的

钝化:服务器正常关闭后,session对象被写入硬盘的文件中
活化:服务器开启后,将文件还原为内存的session对象
session的生命周期

创建:
request.getSession():
会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
销毁:
服务器关闭
session超时
invalidate() :session自杀,处理安全退出。

<session-config>
             	<session-timeout>30</session-timeout>
             </session-config>
3.如果客户端禁用了 cookie,session该如何自处?
     客户端禁用了cookie,session将不一样。
     URL重写:http://localhost:8080/day09/s1;jsessionid=731DED0DC4F0AA06CDBB815733D4043E
PrintWriter pw = response.getWriter();
         	HttpSession session = request.getSession();
         	String id = session.getId();
         
         	String href = "/day09/s1";
         	href = response.encodeRedirectURL(href);
         	System.out.println(href);
         	pw.write("<a href='"+href+"'>s1</a>")

4.获取session:
         	getSession():会根据jsessionid值查找是否存在sesison对象,如果没找到,则创建新的session
         	getSession(boolean flag):
         		true:默认值,会根id值查找是否存在sesison对象,如果没找到,则创建新的session
         		false:会根据jsessionid值查找是否存在sesison对象,如果没找到,则返回null
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值