一、使用HttpServletRequest获取请求参数

背景:最近遇到一个问题,请求传一个对象到后端,这个对象可能是对象A,也可能是对象B,如何接收这个参数呢? 考虑过用A,B的父类去接收,显然不行。最终决定使用HtppServletRequest去接收
原理:客户发送给服务器的请求信息被封装在HttpServletRequest对象中,其中包含浏览器发送给服务器的数据,这些数据包括请求参数、客户端有关信息。
一、POST请求的参数获取方法

我总结成通用公共方法类:在调用此方法只需传入HttpServletRequest 对象和要转换成的类的字节即可

 public static <T> T getPostReqParams(HttpServletRequest request,Class<T> tClass) {
        StringBuffer sb = new StringBuffer();
        String line = null;
        BufferedReader br = null;
        try {
            br = request.getReader();
            while (null != (line = br.readLine())) {
                sb.append(line);
            }
            T t = JSONObject.parseObject(sb.toString(), tClass);
            return t;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        } finally {
            if (br != null) {
                try {
                    br.close();
                } catch (IOException e) {
         e.printStackTrace();
        }
       }
      }
     }

注意:要获取Post请求的参数要通过流的方式去读取才得行。

二、GET请求的参数获取方式

客户端发送:http://localhost:9009/httpServlet/getReqParamDeal?a=1&b=1

//1、获取到完整的GET请求字符串(userName=51gjie&password=123456)路径后面的,然后解析字符串
        String queryString = request.getQueryString();
        //结果:a=1&b=1
        //2、根据名称获取对应的请求参数的值。getParameter(String name) 返回由name指定的请求参数,如果不存在返回null
        String name = request.getParameter("a");
       //结果:"1"
        //3、获取所有的请求参数对应的Map集合, 键是请求参数的名称 ,值是请求参数的值.getParameterMap()返回Map对象:键的类型是String,值得类型是String数组
        Map<String, String[]> parameterMap = request.getParameterMap();
        //结果:{"a":["1"],"b":["1"]}
        //4、返回指定参数name所包含的所有值,返回String 数组。getParameterValues(String name)返回指定参数name所包含的所有值,返回一个String数组。
        String[] as = request.getParameterValues("a");
        //结果:["1"]
        //5、返回一个枚举迭代器,包含请求中所有请求参数名
        Enumeration<String> parameterNames = request.getParameterNames();
        System.out.println("parameterNames:"+parameterNames);

二、cookie介绍

2.1 什么是 Cookie?

1、Cookie 翻译过来是饼干的意思。
2、Cookie 是服务器通知客户端保存键值对的一种技术。
3、客户端有了 Cookie 后,每次请求都发送给服务器。
4、每个 Cookie

2.2 如何创建cookie
①创建cookie
Cookie userCookie = new Cookie("username","hacker");
/**
*中间这步可以设置cookie的存活时间
*setMaxAge() 
*正数,表示在指定的秒数后过期 
*负数,表示浏览器一关,Cookie 就会被删除(默认值是-1) ,不写就是默认值
*零,表示马上删除 Cookie
**/
②向客户端发送cookie
userCookie.addCookie(userCookie );

在这里插入图片描述

2.3、Cookie的常用API

getName() 返回cookie名称,一旦创建不能改变
getValue() 返回cookie的值 setValue(String value) 在cookie创建以后为它指定一个新的值
setMaxAge(int expiry) 设置cookie在浏览器中的额存活时间。正数,表示在指定的秒数后过期。负数,表示浏览器一关,Cookie 就会被删除(默认值是-1),不写就是默认值。零,表示马上删除 Cookie
getMaxAge()返回cookie在浏览器的存活时间
setDomain(String pattern)设置cookie所在域。域名以点号(.)开头。例如:.foo.com。默认情况下,只有发送cookie的服务器才能得到它
getDomain() 返回该cookie设置的域名

从客户端读取cookie:
Cookie[] cookies = request.getCookies();可以循环访问它的每一个元素

2.4 cookie值得修改

方案一:
1、先创建一个要修改的同名(指的就是 key)的 Cookie 对象
2、在构造器,同时赋于新的 Cookie 值。Cookie cookie = new Cookie("key1","newValue1");
3、调用 response.addCookie( Cookie ); 通知 客户端 保存修改
方案二:
1、先查找到需要修改的 Cookie 对象
2、调用setValue()方法赋于新的 Cookie 值。
3、调用 response.addCookie()通知客户端保存修改

查找指定名称的 Cookie 对象

/*** 
*查找指定名称的 Cookie 对象 
* @param name 
* @param cookies 
* @return
*  */ 
public static Cookie findCookie(String name , Cookie[] cookies){ 
	if (name == null || cookies == null || cookies.length == 0) { 
		return null; 
	}
	for (Cookie cookie : cookies) {
 		if (name.equals(cookie.getName())) {
  			return cookie;
		} 
	}
	return null;
 }
2.5 免输入用户名登录

login.jsp 页面

<form action="http://localhost:8080/13_cookie_session/loginServlet" method="get">
 用户名:<input type="text" name="username" value="${cookie.username.value}"> <br>
 密码:<input type="password" name="password"> <br> 
 <input type="submit" value="登录"> 
 </form>

LoginServlet 程序:

@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
	String username = req.getParameter("username");
	String password = req.getParameter("password");
	if ("wzg168".equals(username) && "123456".equals(password)) { 
		//登录 成功 
		Cookie cookie = new Cookie("username", username);
		cookie.setMaxAge(60 * 60 * 24 * 7);//当前 Cookie 一周内有效 
		resp.addCookie(cookie);
	 	System.out.println("登录 成功"); 
	 } else { 
	 // 登录 失败 
	 System.out.println("登录 失败"); 
	 } 
}

三、session介绍

3.1 什么是 Session 会话?

1、Session 就一个接口(HttpSession)。
2、Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都有自己的一个 Session 会话。
4、Session 会话中,我们经常用来保存用户登录之后的信息

3.2 HttpSession常用API

getId() 返回为该会话指定的唯一标识符
getCreationTime() 返回会话的创建时间
getLastAccessedTime() 返回会话被最后访问时间
isNew() 是否新创建的会话(如果会话还没有同客户端关联,则返回true)
getServletContext() 返回该会话所属的ServletContext对象
setAttribute(String name,Object value) 指定一个名称和值得属性存储到会话对象上
getAttributeNames() 返回存储在会话对象上的所有属性名的一个枚举对象
removeAttribute(String name)从会话中删除指定存储的指定名称属性
setMaxInactiveInterval(int interval) 设置在容器使该会话失效前客户的两个请求之间最大间隔时间,单位是
getMaxInactiveInterval() 返回以秒为单位的最大时间间隔,这段时间内容器将在客户请求之间保持会话打开
invalidate() 使会话对象失效并删除存储在器上的任何对象

设置:

req.getSession().setAttribute("key1", "value1");

获取 Session 域中的数据

Object attribute = req.getSession().getAttribute("key1");
3.3 Session 生命周期控制

public void setMaxInactiveInterval(int interval) 设置 Session 的超时时间(以秒为单位),超过指定的时长,Session 就会被销毁。
值为正数的时候,设定 Session 的超时时长。 0或者负数表示永不超时(极少使用)默认值为30分钟,可以通过修改session-timeout来修改默认值

3.4 浏览器和 Session 之间关联的技术内幕

在这里插入图片描述

①当客户端向服务器发送第一个请求时,服务器就会为该客户创建一个HttpSession会话对象,并将请求对象与该会话关联
②当服务器向客户发送响应时,服务器会将会话ID与响应数据一起发送给客户,这是通过Set-Cookie响应头实现。响应消息类似:
Set-Cookie:JSESSIONID=76b992070245bf3314d401eb5f9d4608
③客户端收到相应会将会话ID存储在浏览器内存中
④服务器收到请求后,会从会话中取出会话ID,在服务器中查找之前创建的会话对象,找到后将该请求与之前创建的ID值相同的会话对象关联起来

session与cookie的区别:

sessioncookie
Session则是存储在服务器端的对象Cookie是存储在客户端(浏览器)中的小型文本文件
在Session中可以存储用户的登录状态、购物车信息等。由于Session存储在服务器端,所以它没有存储容量的限制Cookie可以存储少量的文本数据,通常用于存储用户的身份验证信息、用户偏好设置等。Cookie的存储容量有限,通常为4KB左右
Session相对来说更加安全,因为数据存储在服务器端。客户端只能通过Session ID来访问对应的Session对象,而无法直接修改或访问其中的数据。Cookie是存储在客户端,所以可能存在一些安全风险。Cookie中的数据可以被客户端篡改或窃取。为了增加安全性,可以对Cookie进行加密或使用安全的传输协议(如HTTPS)
Session的生命周期由服务器控制,通常会设置一个较长的超时时间。当超过超时时间后,Session会自动失效,相关的数据也会被清除Cookie可以设置过期时间,可以是会话级别的(浏览器关闭后失效)或具体的日期时间。当Cookie过期或被删除时,相关的数据也会一同失效
Session在跨域请求时,需要通过一些额外的配置来实现共享。可以使用一些技术如跨域资源共享(CORS)或单点登录(SSO)来实现跨域Session共享Cookie在跨域请求时,会被自动发送到服务器。这使得Cookie可以在不同域名之间共享数据

浏览器访问时,后端如何区分是第几次访问?

当客户端第一次访问服务器时,服务器会为该客户端创建一个唯一的Session对象,并为其分配一个Session ID。该Session
ID会在后续的请求中放置在cookie传递给服务器,服务器通过该ID来获取对应的Session对象,由此可以判断是第几次访问服务器。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐