首页 > 其他分享 >24.11.20 sevlet2

24.11.20 sevlet2

时间:2024-11-20 23:18:43浏览次数:3  
标签:20 req http 24.11 session import sevlet2 servlet javax

1.servlet是否线程安全 (线程特性)

线程安全的指标
//1.是否有共享数据
//2.多线程对共享数据做写操作

servlet中 不要创建成员变量

servlet是单实例的 所以成员变量(不加static) 就会在多线程间共享
如果service()方法中 对成员变量有写操作 则线程不安全
servlet中非特殊情况 不要加锁 (直接降级为单线程 效率大大降低)    

2.servlet中提供的域对象

javaEE j2EE java企业级应用 (web应用程序)

核心对象servlet servlet中还包含其他的对象 还有隐含的对象

域对象 是servlet中隐含的对象

域对象 是空的map (在程序运行时 共享数据使用)

通用的api

域对象.setAttribute("key",value);
域对象.getAttribute("key")
域的生效时机 和失效时机
1请求域 request域

request读+写

package com.javasm.controller;

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 java.io.IOException;


@WebServlet("/requestDemo1")
public class RequestDemo1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //request域  service方法中的第一个参数 req
        req.setAttribute("reqKey","reqVal");

        //读取对象的格式 读到之后强转为实际类型
        String reqKey =(String) req.getAttribute("reqKey");

        System.out.println("demo1中读取:"+reqKey);
        //调用指定路径servlet的service方法
        req.getRequestDispatcher("requestDemo2").forward(req,resp);


    }
}

request 只读取

package com.javasm.controller;

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 java.io.IOException;

@WebServlet("/requestDemo2")
public class RequestDemo2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //request域  service方法中的第一个参数 req
        //req.setAttribute("reqKey","reqVal");

        //读取对象的格式 读到之后强转为实际类型
        String reqKey =(String) req.getAttribute("reqKey");

        System.out.println("demo2中读取:"+reqKey);

    }
}

2会话域 session域
    可以在多次请求间生效  
    对不同的浏览器进程 数据分开存储

session读+写

package com.javasm.controller;

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;
import java.io.IOException;

 
@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //session域  多次请求间共享数据使用
        //如果需要使用session对象 需要通过代码主动触发
        HttpSession session = req.getSession();

        session.setAttribute("sesKey","sesVal");

        String sesKey =(String) session.getAttribute("sesKey");

        System.out.println("demo1中读取:"+sesKey);


    }
}

session只读取

package com.javasm.controller;

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;
import java.io.IOException;

@WebServlet("/sessionDemo2")
public class SessionDemo2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //session域  多次请求间共享数据使用
        //如果需要使用session对象 需要通过代码主动触发
        HttpSession session = req.getSession();

        String sesKey =(String) session.getAttribute("sesKey");

        System.out.println("demo2中读取:"+sesKey);


    }
}

3服务器域 servletContext域
    全局共享 写入之后 所有请求 所有浏览器都可以使用

servletContext读+写

package com.javasm.controller;

import javax.servlet.ServletContext;
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;
import java.io.IOException;

@WebServlet("/ServletContextDemo1")
public class ServletContextDemo1 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //ServletContext 服务器对象

        ServletContext servletContext = req.getServletContext();
        //ServletContext servletContext1 = this.getServletContext();

        servletContext.setAttribute("sckey","scval");
        String sckey =(String) servletContext.getAttribute("sckey");
        System.out.println("demo1中读取:"+sckey);


    }
}

servletContext只读取

package com.javasm.controller;

import javax.servlet.ServletContext;
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 java.io.IOException;

@WebServlet("/ServletContextDemo2")
public class ServletContextDemo2 extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //ServletContext 服务器对象

        ServletContext servletContext = req.getServletContext();
        //ServletContext servletContext1 = this.getServletContext();

        String sckey =(String) servletContext.getAttribute("sckey");
        System.out.println("demo2中读取:"+sckey);


    }
}

3servlet中常用对象

3.1servletContext对象

servletContext对象 也叫application 是服务器对象

这是一个全局共享的对象 一般用来存放和共享服务器级别的全局参数

常用方法:
        * getContextPath()  获取服务入口路径          /day10 方便拼路径使用
        * getRealPath("/")  获取服务器实际代码路径     做本地IO操作时使用
        * getInitParameter("charset")   通过web.xml 读取自定义公共参数
示例代码:
package com.javasm.controller2;

import javax.servlet.ServletContext;
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 java.io.IOException;


@WebServlet("/scDemo")
public class ServletContextDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //servletContext对象 application 服务器对象
        //全局共享的对象 全局数据
        /*
        * getContextPath()  获取服务入口路径          /day10 方便拼路径使用
        * getRealPath("/")  获取服务器实际代码路径     做本地IO操作时使用
        * getInitParameter("charset")   通过web.xml 读取自定义公共参数
        * */
        // 获取服务入口路径          /day10 方便拼路径使用
        ServletContext servletContext = req.getServletContext();
        System.out.println(servletContext.getContextPath());
        
         // 获取服务器实际代码路径
        //D:\develop\workspace\two\day10_servlet2\target
        //                  \day10_servlet2-1.0-SNAPSHOT\  做本地IO操作时使用
        System.out.println(servletContext.getRealPath("/"));//括号当中要填路径,即可返回绝对路径
       
        //通过web.xml 读取自定义公共参数
        String initParameter = servletContext.getInitParameter("charset");
        System.out.println(initParameter);
    }
}
3.2servletConfig对象(了解)

servlet配置参数对象 可以获取servlet名称 等配置参数 现在的开发中基本用不到

3.3request对象(***)

HttpServletRequest 请求对象

两个作用:

1.解析请求报文 包含请求报文中的各种参数
2.做request域对象
常用方法:
        //域对象 设置键值对
          req.setAttribute("reqKey","reqVal");
        //域对象读取键值对 注意要强转类型
          String reqKey =(String) req.getAttribute("reqKey");
        //指定字符编码 处理post请求时的请求乱码
        req.setCharacterEncoding("utf-8");
        //取请求参数
        String 参数值 = req.getParameter("参数key");
        //取请求同key参数  ?hobby=1&hobby=2&hobby=3 取出字符串数组
        String[] hobbies = req.getParameterValues("hobby");
获取参数map 获取参数输入流 (了解)
        //tomcat解析参数时 会把键值对存入map<String, String[]>
        //单个参数也会存入数组
        Map<String, String[]> parameterMap = req.getParameterMap();

        //tomcat中允许 自己读取请求体中的数据 可以自己解析数据
        //获得请求体部分的输入流
        ServletInputStream inputStream = req.getInputStream();
获取请求头 (了解)
      //自定义请求头 取自定义请求头(需搭配ajax使用)
      String headerKey = req.getHeader("headerKey");
获取请求报文中的各种路径
        //获取报文中路径中的数据
        //获取协议
        System.out.println(req.getScheme());
        //获取主机名
        System.out.println(req.getServerName());
        //获取端口
        System.out.println(req.getServerPort());
        //获取服务器入口的根路径
        System.out.println(req.getContextPath());
        //URL 与 URI
        //URL 统一资源定位符 http://localhost:8080/day10/reqDemo
        System.out.println(req.getRequestURL()); 
        //URI 统一资源标识符  /day10/reqDemo
        System.out.println(req.getRequestURI());
        //servlet配置的路径 匹配路径 /reqDemo
        System.out.println(req.getServletPath());
请求转发
    可以在servlet之间跳转 先执行servlet1 --->  servlet2
    
    //请求转发 同一次请求 访问多个servlet时使用 可以让请求跳转
        //请求跳转时 配合request域做数据共享  提供机制  一般搭配jsp使用
    req.getRequestDispatcher("servlet2的路径").forward(req,resp);
示例代码:
package com.javasm.controller2;

import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;


@WebServlet("/reqDemo")
public class RequestDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //req   HttpServletRequest
        //1.解析请求报文 包含请求报文中的各种参数
        //2.做request域对象
        /*
        //域对象 设置键值对
          req.setAttribute("reqKey","reqVal");
        //域对象读取键值对 注意要强转类型
          String reqKey =(String) req.getAttribute("reqKey");

        //取参数相关
        //指定字符编码 处理post请求时的请求乱码
        req.setCharacterEncoding("utf-8");
        //取请求参数
        String 参数值 = req.getParameter("参数key");
        //取请求同key参数  ?hobby=1&hobby=2&hobby=3 取出字符串数组
        String[] hobbies = req.getParameterValues("hobby");

        //tomcat解析参数时 会把键值对存入map<String, String[]>
        //单个参数也会存入数组
        Map<String, String[]> parameterMap = req.getParameterMap();

        //tomcat中允许 自己读取请求体中的数据 可以自己解析数据
        //获得请求体部分的输入流
        ServletInputStream inputStream = req.getInputStream();

        //自定义请求头 取自定义请求头
        String headerKey = req.getHeader("headerKey");


        *
        *
        * */
//        //tomcat解析参数时 会把键值对存入map<String, String[]>
//        //单个参数也会存入数组
//        Map<String, String[]> parameterMap = req.getParameterMap();
//        System.out.println(parameterMap.get("name")[0]);

/*      获取参数的请求体输入流
        可以自己解析请求体数据 配合其他工具 也可以直接解析为对象
        与tomcat解析流数据互斥 流只能读一次
        ServletInputStream inputStream = req.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        String username = req.getParameter("username");
        System.out.println(username);
*
*
* */
        //读请求报文 只能读请求体 可以读post方式的请求体
        //字符
        //字节
        //流只能读一次
        ServletInputStream inputStream = req.getInputStream();

        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        String s = bufferedReader.readLine();
        System.out.println(s);

        String username = req.getParameter("username");
        System.out.println(username);
        //获取报文中路径中的数据
        //获取协议
        System.out.println(req.getScheme());
        //获取主机名
        System.out.println(req.getServerName());
        //获取端口
        System.out.println(req.getServerPort());
        //获取服务器入口的根路径
        System.out.println(req.getContextPath());
        //URL 与 URI
        System.out.println(req.getRequestURL());//URL 统一资源定位符  http://localhost:8080/day10/reqDemo
        System.out.println(req.getRequestURI());//URI 统一资源标识符  /day10/reqDemo
        //servlet配置的路径 匹配路径 /reqDemo
        System.out.println(req.getServletPath());
        //请求转发 同一次请求 访问多个servlet时使用 可以让请求跳转
        //请求跳转时 配合request域做数据共享  提供机制  一般搭配jsp使用
        // req.getRequestDispatcher("地址").forward(req,resp);



    }
}
3.4response对象(***)

HttpServletResponse 响应对象 控制响应报文相关的内容

常用方法
//设置返回数据格式
//resp.setContentType("application/json;charset=utf-8"); //返json
//resp.setContentType("text/html;charset=utf-8");        //返页面标签
resp.setContentType("text/html;charset=utf-8");

//获得输出流
//动态网页技术 数据是否动态生成
PrintWriter writer = resp.getWriter();
writer.print("这是一个动态页面<br>");
writer.print("<input type='text'>");
//        writer.write();
//        writer.println();
示例代码
package com.javasm.controller2;

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 java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/respDemo")
public class ResponseDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("触发运行了....");
        //返回页面标签
        //设置返回数据格式
        //resp.setContentType("application/json;charset=utf-8");
        //resp.setContentType("text/html;charset=utf-8");
        resp.setContentType("text/html;charset=utf-8");
        //获得输出流
        //动态网页技术 数据是否动态生成
        PrintWriter writer = resp.getWriter();
        writer.print("这是一个动态页面<br>");
        writer.print("<input type='text'>");
//        writer.write();
//        writer.println();
        writer.close();
    }
}
3.5session对象(***)

HttpSession 会话对象 做域对象(缓存数据) 在同一个用户(浏览器)多次访问间共享数据

常用方法
        //域对象 设置键值对
          req.setAttribute("sesKey","sesVal");
        //域对象读取键值对 注意要强转类型
          String reqKey =(String) req.getAttribute("sesKey");
        //删除键值对
          req.removeAttribute("sesKey");
        //获得session编号 用来检查是否同一个session对象
        session.getId()
        //设置session访问间隔 单位秒 超过间隔会重新创建session
        session.setMaxInactiveInterval(5);    
        //直接设置session失效
        session.invalidate();
示例代码
package com.javasm.controller2;

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;
import java.io.IOException;

@WebServlet("/sesDemo")
public class HttpSessionDemo extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        //获得session对象 req.getSession()
        HttpSession session = req.getSession();
        //session编号 C03DDD56DF31BAB3EB6A41DB728815CF
        //每个session都会起编号 如过session对象相同 编号是相同的
        System.out.println(session.getId());
        //MaxInactiveInterval 最大非活动周期  两次访问的间隔
        //
        //session.setMaxInactiveInterval(5);
        session.invalidate();
        /*
        * session三种失效方式
        * 1.浏览器关闭
        * 2.超过访问间隔
        * 3.直接设置session失效
        *
        * */
        //session对象保留 但是sesison中的数据可以清除掉
        //session.removeAttribute("key");


        /*
        * session使用场景
        * 1.当缓存使用 把一些常用的数据存入session 服务端需要使用时 直接使用共享的数据
        * 2.做访问控制
        *        登录访问控制
        *
        * */

    }
}
session常用场景
* session使用场景
* 1.当缓存使用 把一些常用的数据存入session 服务端需要使用时 直接使用共享的数据
* 2.做访问控制
*        登录访问控制

登录访问控制场景:

示例代码

登录服务 LoginServlet

package com.javasm.controller3;

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;
import java.io.IOException;


@WebServlet("/login")
public class LoginServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //做登录....
        System.out.println("登录代码执行了......");

        HttpSession session = req.getSession();
        session.setAttribute("loginUser","用户信息....");


    }
}

用户服务 UserServlet

package com.javasm.controller3;

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;
import java.io.IOException;


@WebServlet("/user")
public class UserServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //查用户信息 必须登录后使用

        HttpSession session = req.getSession();
        String loginUser =(String) session.getAttribute("loginUser");
        if(loginUser!=null){
            System.out.println("查询用户代码执行了......");
        }else{
            System.out.println("请先登录......");
        }

    }
}

商品服务 ProdServlet

package com.javasm.controller3;

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 java.io.IOException;

@WebServlet("/prod")
public class ProdServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //查商品信息 不需要登录
        System.out.println("查询商品代码执行了......");

    }
}

登出服务 LogoutServlet

package com.javasm.controller3;

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;
import java.io.IOException;


@WebServlet("/logout")
public class LogoutServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //做登出....
        System.out.println("登出代码执行了......");

        HttpSession session = req.getSession();
        //session.setAttribute("loginUser","用户信息....");
        //session.invalidate();
        session.removeAttribute("loginUser");
    }
}

标签:20,req,http,24.11,session,import,sevlet2,servlet,javax
From: https://blog.csdn.net/2401_87910368/article/details/143928077

相关文章

  • 24.11.19 web框架
    2.2配置环境变量2.3maven命令测试mvn-v测试maven查看版本2.4maven仓库配置配置远程仓库地址配置本地仓库2.5idea中配置maven2.6通过配置idea创建maven项目创建项目时构建系统选到maven初次创建项目时会把maven的基础依赖库(jar包)下载到本地仓......
  • 2024-2025 ICPC, NERC, Southern and Volga Russian Regional Contest B. Make It Equ
    因为和题解有所区别,所以写一发题解增长见识。题面B.MakeItEqual给你一个大小为\(n\)的整数数组\(a\)。数组元素的编号从\(1\)到\(n\)。您可以执行以下任意次数的操作(可能为0次):从\(1\)到\(n\)中选择一个索引\(i\);将\(a_i\)减少\(2\),并将\(a_{(i\bmo......
  • [BSidesCF 2020]Had a bad day
    打开页面,测试功能发现是一个鼓励网站,点击下面的两个按钮会给category传一个参数感觉存在文件包含漏洞,先用base64伪协议尝试读取一下源码?category=php://filter/convert.base64-encode/resource=index.php发现报错了嗷,根据提示,他会自动加上.php后缀,我们去除后缀,重新访问......
  • 11.20
    \(100+100+30+45=275\)开场\(10\)分钟,开始码A,码了一个小时无果删码跑路。十几分钟把B切了开始单挑C,失败。写完D暴力后剩30min,极限写完A。A:小H的积木把最上方和最下方的都加入线段树,如果有一个数加入了\(2\)次,就把它放入待选答案里面,每次选择最小的同时放入与......
  • 每日打卡 11.20
    includeinclude<string.h>include<windows.h>usingnamespacestd;intupdata_score(structstudent*p,intn,intnum,intcourse,intscore);structstudent{intnum;charname[10];intc,math,english;doubleaverage;};intmain(){intin......
  • Invicti-Professional-v24.11
    0x01工具介绍Invicti(以前称为Netsparker)是一款自动化Web应用程序安全扫描器,旨在帮助组织持续扫描和保护其Web应用程序和API。Invicti注重准确性和效率,使安全团队能够扩展测试工作,同时最大限度地减少误报,确保资源用于解决真正的安全风险。Invicti的突出功能之一是其基......
  • 嵌入式硬件实战基础篇(三)-四层板PCB设计-步进电机驱动(TMC2208/TMC2209)
    引言:我们在嵌入式硬件杂谈(三)中有提到阻抗匹配的问题,也引入了高速PCB设计的思想,并且此篇实战基础篇主要是基础的四层板的绘制设计,后续实战会对高速板展开,本篇主要是提升读者的设计PCB板的能力,以及对于嵌入式硬件设计能力的提升,对前面的理论作为实践性导向进行强化以及学习。本......
  • [网鼎杯 2018]Fakebook
    访问网站的robots.txt,看看有没有线索找到了user.php的源码,直接访问这个备份文件。下载完成直接打开用就好,记事本就可以打开.bak文件<?phpclassUserInfo{public$name="";public$age=0;public$blog="";publicfunction_......
  • 24.11.20
    我感觉我是一个挺奇怪的人就像是无时无刻不在找事情做,哪怕是在脑袋里和自己说话这种事,不知道为什么我很不喜欢什么事都不干,总感觉陷入这种状态就会很急迫很不安,总是喜欢找一些事来干也是一个很“幼稚”的人大概是经常喜欢在心里抱怨现实又从不说出来,最多就只能在网上撒撒气,喜欢......
  • [BJDCTF2020]Easy MD5
    打开输入字符后提交没有回显,查看header发现有hint。重点是md5函数,用法:md5(*string*,*raw*=FALSE),当只接受一个参数时会返回字符串的md5值,当把第二个参数的值设置为TRUE,会返回生成md5值的二进制格式,即根据ascii码值转码。根据这个特性,就存在一个漏洞,如果password=md5($pass,tr......