Session的工作原理

上一节中,谈到了session的工作原理(点击链接到上一节),但实际开发中,用户可能把cookie禁用了,意味着服务器向浏览器以cookie形式回送session的id号时,浏览器不接受这个id,那么在结账servlet中就不能再获取到这个session的id,就会创建一个新的session。
解决:url重写(点击超链接访问服务器时同时传递session的id):
在访问首页时就创建session,创建session后,在每一个超链接后面都跟上session的id号,服务器端得到这个id,获得服务器里的session(getSession方法),那么就要重写所有的超链接,就是url重写。
例:
创建一个servlet:WelcomeServlet作为首页:

package cn.sun.session;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//网站首页
@WebServlet("/WelcomeSession")
public class WelcomeSession extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public WelcomeSession() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");     
        PrintWriter out=response.getWriter();

        request.getSession(); //创建session

        String url1=response.encodeURL("/day07/SessionDemo1");  //该方法实现url重写,会自动在这个url地址后面加上session的id号
        String url2=response.encodeURL("/day07/SessionDemo2"); 

        //输出超链接
        out.print("<a href='"+url1+"'>购买</a>  ");
        out.print("<a href='"+url2+"'>结账</a>");
    }

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

SessionDemo1:

package cn.sun.session;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//购买Servlet
@WebServlet("/SessionDemo1")
public class SessionDemo1 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public SessionDemo1() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession(); //得到用户的session

        //为cookie设置有效期
        String sessionid=session.getId();  //得到session的ID
        Cookie cookie=new Cookie("JSESSIONID",sessionid); //回写一个与服务器回写的cookie同名的cookie,将其覆盖(就是覆盖服务器回写的cookie)。注:服务器回写的session的名称叫JSESSIONID
        cookie.setPath("/day07");  //设置相同的path将其覆盖 
        cookie.setMaxAge(30*60);   //设置有效期为30分钟
        response.addCookie(cookie);  //回写session

        session.setAttribute("name", "洗衣机"); //存储用户购买的物品        
    }

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

}

SessionDemo2:

package cn.sun.session;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

//结账servlet
@WebServlet("/SessionDemo2")
public class SessionDemo2 extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public SessionDemo2() {
        super();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");     
        PrintWriter out=response.getWriter();

        HttpSession session = request.getSession();  //得到来访者的session
        String product = (String) session.getAttribute("name");  //得到用户购买的产品

        out.write("您购买的商品是:"+product);      
    }

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

}

运行WelcomeServlet:
这里写图片描述
点击购买,再点击结账:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值