Java学习笔记:web3

会话技术

会话:一次会话中,包含多次请求与响应

        一次会话:第一次请求,开始建立会话;一方断开连接,会话结束;

功能:一次会话的多次请求间共享数据

客户端会话技术:Cookie

服务器端会话技术:Session

Cookie 

概念:客户端会话技术,将数据保存在客户端


快速入门:

        创建Cookie对象,绑定数据:new Cookie(String name,String value)

        发送Cookie对象:response.addCookie(Cookie cookie)

        获取Cookie对象,拿到数据:Cookie[ ] request.getCookies()

Java学习笔记:web3_第1张图片

Java学习笔记:web3_第2张图片


实现原理:基于响应头set-cookie和请求头cookie的实现

细节:

        一次可以发送多个cookie。创建多个Cookie对象,使用addCookie()方法发送cookie即可

        默认情况下,关闭浏览器,cookie数据销毁

        设置cookie生命周期,将其永久储存:setMaxAge(int seconds)

                正数:将cookie数据写入到硬盘文件,持久储存;cookie存活时间

                负数:默认值,关闭浏览器,销毁。

                0:删除cookie信息

                于发送cookie之前设置

        是否可以存中文:

                Tomcat8之前不可以,需要讲中文转码;

        cookie的获取范围有多大:

                假设一个服务器有多个web项目,数据是否可以在不同的web项目共享

                        默认情况下不行

                setPath(String path):设置cookie的获取范围

                不调用此方法,默认为当前虚拟目录下;

                setPath(“/”):可以多项目共享(发送cookie前设置)

Java学习笔记:web3_第3张图片


 cookie特点:

        cookie储存数据在客户端浏览器

        浏览器对单一cookie的大小有限制(4kb以内),对同一个渔民下的总cookie数量也有限制(20个)


cookie作用:

        一般用于储存少量不敏感的数据

        在不登录的情况下,完成服务器对客户端的身份识别        

Session

服务器端会话技术,在一次会话中的多次请求间共享数据,将数据保存在服务器端的对象中。


获取HttpSession对象:

        request.getSession()


使用HttpSession对象

        setAttribute(String name,Object value)

        getAttribute(String name)

        removeAttribute(String name)


原理:session的实现依赖于cookie


细节:

1、客户端关闭,服务器不关闭,两次获取的session是同一个吗?

        默认情况下不是。

        如果需要相同,则可以创建Cookie对象,将键设置为JSESSIONID,值为当前session的id,在设置cookie最大的存活时间,让cookie持久化保存

2、客户端不关闭,服务器关闭,两次获取的session是同一个吗?

        不是同一个。

        需要确定数据不丢失:

                session钝化:服务器正常关闭之前,将session对象序列化到硬盘上

                session活化:服务器启动后,将session文件转化为内存中的session对象

3、session的失效时间

        服务器关闭

        session对象调用:invalidate()。

        默认30分钟失效,可以在web.xml中修改:


session特点:

        用于储存一次会话的多次请求的数据,储存在服务器端

        session可以储存任意类型、任意大小的数据


验证码案例

生成验证码:SecurityCodeServlet

@WebServlet("/securityCodeServlet")
public class SecurityCodeServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        int width=100,height=50;
        //创建一个对象,在内存中代表一张图片
        BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
        //美化图片
        Graphics graphics = image.getGraphics();//画笔对象
        //填充背景色
        graphics.setColor(Color.pink);//画笔颜色
        graphics.fillRect(0,0,width,height);
        //绘制边框
        graphics.setColor(Color.blue);
        graphics.drawRect(0,0,width-1,height-1);
        //绘制验证码
        String str="QWERTYUIOPLKJHGFDSAZXCVBNMzxcvbnmlkjhgfdsaqwertyuiop1234567890";//库
        Random random = new Random();//用于生成随机数的类

        StringBuilder stringBuilder = new StringBuilder();

        for (int i=1;i<5;i++) {//每个验证码有四个字符组成
            int indexOfStr = random.nextInt(str.length());//每次生成的随机数即为字符串的下标索引
            char ch = str.charAt(indexOfStr);//通过下标索引从字符串中提取字符
            stringBuilder.append(ch);
            graphics.drawString(ch+"",width/5*i,height/2);//将字符写入图片中
        }

        String checkCodeSession = stringBuilder.toString();//变成字符串
        request.getSession().setAttribute("checkCodeSession",checkCodeSession);//将字符串存入session中

        //绘制干扰线
        graphics.setColor(Color.green);
        //绘制十条线,每条线的起始点不一样
        for (int i = 0; i < 10; i++) {
            int x1 = random.nextInt(width);
            int x2 = random.nextInt(width);
            int y1 = random.nextInt(height);
            int y2 = random.nextInt(height);
            graphics.drawLine(x1,y1,x2,y2);
        }

        //展示图片
        ImageIO.write(image,"jpg",response.getOutputStream());
    }

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

用于登录的Servlet:

Java学习笔记:web3_第4张图片

 

JSP

 Java Server Pages:java服务器端页面

        一个特殊页面,既可以指定定义HTML标签,也可以定义java代码

        用于简化书写


原理:本质上是一个servlet

jsp脚本:jsp中定义java代码的方式

        1、<%  代码  %>:定义Java代码,在service方法中。service方法中可以定义什么,该脚本就可以定义什么;

        2、<%!  代码  %>:定义的java代码,在jsp转换的java类中的成员位置;

        3、<%=  代码  %>:定义的java代码会输出到页面上,输出语句中可以定义什么,该脚本就可以定义什么。

jsp内置对象

        在jsp页面中,不需要创建获取就可以使用

        一共有9个内置对象

        其中3个

                request

                response

                out:字符输出,可以将数据输出到页面上;类似于:response.getWriter();

你可能感兴趣的:(java,web)