쿠키 및 세션 지식 포인트

쿠키 (클라이언트)

쿠키 란?

  • 쿠키는 서버가 클라이언트에게 키-값 쌍을 저장하도록 알리는 기술입니다.
  • 클라이언트에 쿠키가 있으면 각 요청이 서버로 전송됩니다.
  • 각 쿠키의 크기는 4를 초과 할 수 없습니다.kb

쿠키 생성 방법

여기에 사진 설명 삽입

한 번에 여러 개의 쿠키를 만들 수 있습니다.

Servlet프로그램 만들기

public abstract class BaseServlet extends HttpServlet {
     
     

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        //解决post请求中文乱码问题
        //一定要在获取请求参数之前调用才有效
        request.setCharacterEncoding("UTF-8");

        response.setContentType("text/html;charset=UTF-8");

        //获取隐藏表单项的action的值
        String action = request.getParameter("action");

        //利用反射获取相应的用户行为,避免使用大量的if else
        //我们只需要在下面编写相应的方法即可,修改密码,绑定邮箱,绑定手机号等业务
        try {
     
     
            //获取action鉴别对象,获取相应的业务
            Method method = this.getClass().getDeclaredMethod(action,HttpServletRequest.class,HttpServletResponse.class);
            //调用目标业务
            method.invoke(this,request,response );

        } catch (Exception e) {
     
     
            e.printStackTrace();
        }
    }

    //因为图书管理板块的提交方式是Get请求,所以我们让doGet执行doPost相同的操作
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        doPost(request,response);
    }
}

CookieServlet프로그램

public class CookieServlet extends BaseServlet {
     
     


    protected void createCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        //1.创建Cookie对象
        Cookie cookie = new Cookie("key1","value1");
        //2.通知客户端保存Cookie(服务器发送给客户端/浏览器,所以是response)
        response.addCookie(cookie);

        response.getWriter().write("Cookie创建成功");
        //解决中文乱码问题在BaseServlet中,        response.setContentType("text/html;charset=UTF-8");

    }
}

web.xml

    <servlet>
        <servlet-name>CookieServlet</servlet-name>
        <servlet-class>com.gw.servlet.CookieServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>CookieServlet</servlet-name>
        <url-pattern>/cookieServlet</url-pattern>
    </servlet-mapping>

cookie.html

	<base href="http://localhost:8080/13_cookie_session/">

			<li><a href="cookieServlet?action=createCookie" target="target">Cookie的创建</a></li>

서버가 쿠키를 얻는 방법

    protected void getCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
                //遍历所有的Cookie
        Cookie[] cookies = request.getCookies();
        for (Cookie cookie: cookies){
     
     
            response.getWriter().write("Cookie["+cookie.getName()+"="+cookie.getValue()+"]"+"<br/>");
        }

        //查找特定的Cookie
        Cookie iWantCookie = CookieUtils.findCookie("key1",cookies);
    }
}

특정 쿠키 찾기

//查找指定名称的cookie对象
public class CookieUtils {
     
     
    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;
    }
}

쿠키 값 수정

    protected void updateCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        /*方案一*/
        //覆盖之前的
        Cookie cookie = new Cookie("key1","value111");
        response.addCookie(cookie);

        /*方案二*/
        //1 先找到需要修改的Cookie对象
        Cookie cookie1 = CookieUtils.findCookie("key1",request.getCookies());
        //2 调用setValue()方法赋予新值
        cookie1.setValue("value111");
        //3 调用response.addCookie()
        response.addCookie(cookie1);
    }

브라우저의 쿠키보기

응용 프로그램에서 쿠키보기

쿠키 수명 관리

쿠키 수명 관리는 쿠키가 파기 될 때 관리하는 방법을 말합니다.

setMaxAge()

  • 양수 : 지정된 시간 (초) 후에 만료됩니다.
  • 음수 : 브라우저를 닫은 후 삭제 (기본값 -1)
  • 0 : 쿠키 즉시 폐기
   
protected void defaultCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        Cookie cookie = new Cookie("default1","value1");
        //-1是默认值
        cookie.setMaxAge(-1);
        response.addCookie(cookie);
    }

    protected void deleteCookie(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        Cookie cookie = CookieUtils.findCookie("default1",request.getCookies());
        if (cookie!=null){
    
    
            //表示立即删除
            cookie.setMaxAge(0);
            response.addCookie(cookie);
        }
    }

    protected void life1(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        Cookie cookie = new Cookie("default1","value1");
        //存活一个小时(就算关闭浏览器也能存活)
        cookie.setMaxAge(60*60);
        response.addCookie(cookie);
    }

쿠키 유효 경로 경로 설정

쿠키의 경로 속성은 효과적인 필터링을 위해 서버로 보낼 수있는 쿠키와 그렇지 않은 쿠키를 효과적으로 필터링 할 수 있습니다.

이해

CookieA-------- path = / 프로젝트 경로

CookieB-------- 경로 = / 프로젝트 경로 /abc


주소 판단 요청 :

  • http : // ip : 포트 / 프로젝트 경로 /a.html
    • CookieA 보내다
    • CookieB보내 지마
  • http : // ip : 포트 / 프로젝트 경로 /abc/a.html
    • CookieA 보내기 (나중에 경로를 보지 않음)
    • CookieB 보내다
   //path属性
   protected void testPath(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
       Cookie cookie = new Cookie("path1","path1");
       //获取工程路径request.getContextPath()
       cookie.setPath(request.getContextPath()+"/abc");// 工程路径/abc
       response.addCookie(cookie);
   }

사용자 이름없이 로그인

여기에 사진 설명 삽입

login.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    <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>
</body>
</html>

LoginServlet

public class LoginServlet extends HttpServlet {
     
     
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     

    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        String username = request.getParameter("username");
        String password = request.getParameter("password");

        if ("gao123".equals(username) && "123456".equals(password)){
     
     
            //创建一个Cookie对象
            Cookie cookie = new Cookie("username",username);
            cookie.setMaxAge(60*60*24*7);//Cookie保存一周时间(也就是用户名保存一周时间)
            response.addCookie(cookie);

            System.out.println("登陆成功");

        }else{
     
     
            System.out.println("登陆失败");
        }

    }

web.xml

    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>com.gw.servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>

세션 (서버 측)

세션이란

  • 세션이 인터페이스 HttpSession( )
  • 세션 세션은 클라이언트와 서버 간의 연결을 유지하는 데 사용되는 기술입니다.
  • 각 클라이언트에는 자체 세션이 있습니다.
  • 세션 세션에서는 사용자가 로그인 한 후 정보를 보호하는 데 자주 사용됩니다.

세션을 생성하고 얻는 방법

request.getSession()

  • 첫 번째 호출 : 세션 생성
  • 모든 후속 호출은 다음과 같습니다.

isNew() : 방금 생성되었는지 확인

  • true : 방금 생성되었음을 의미합니다.
  • false : 이전 세션 개체를 가져 오는 것을 의미합니다.

각 세션에는 고유 한 ID 값인 ID 번호가 있습니다. getId() 세션 세션의 ID 값 가져 오기

SessionServlet

만들고 가져 오기

public class SessionServlet extends BaseServlet {
     
     

    protected void createOrGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        //创建和获取Session对象
        HttpSession session = request.getSession();
        //判断当前的Session会话是否是新创建的
        boolean isNew = session.isNew();
        //获取唯一标识ID
        String id = session.getId();

        response.getWriter().write("唯一标识ID"+id);
        response.getWriter().write("是否是新创建的"+isNew);
    }
}

web.xml

    <servlet>
        <servlet-name>SessionServlet</servlet-name>
        <servlet-class>com.gw.servlet.SessionServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SessionServlet</servlet-name>
        <url-pattern>/sessionServlet</url-pattern>
    </servlet-mapping>
			<li><a href="sessionServlet?action=createOrGetSession" target="target">Session的创建和获取(id号、是否为新创建)</a></li>

세션 필드의 데이터

    //存储
    protected void setAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        request.getSession().setAttribute("key1", "value1");
        response.getWriter().write("往Session域中已经存储了数据");
    }

    //获取
    protected void getAttribute(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
     
     
        Object key1 = request.getSession().getAttribute("key1");
        response.getWriter().write("Session中获取的值"+key1);
    }
		<li><a href="sessionServlet?action=setAttribute" target="target">Session域数据的存储</a></li>
			<li><a href="sessionServlet?action=getAttribute" target="target">Session域数据的获取</a></li>

세션 수명주기

세션 시간 초과는 두 클라이언트 요청 사이의 최대 간격을 나타냅니다.

  • 세션의 기본 시간 제한은 30 분입니다.

    Tomcat 서버의 구성 파일 web.xml은 기본적으로 다음 구성으로 설정됩니다. 즉, Tomcat의 모든 세션에 대한 제한 시간이 30 분으로 구성됩니다.

    <session-config>
        <session-timeout>30</session-timeout>
    </session-config>
    
  • 특정 웹 프로젝트 web.xml에서 위 파일 설정 정보의 타임 아웃 시간이 수정 되면 전체 웹의 세션이 수정 된 값이됩니다.

  • 특정 세션의 타임 아웃 시간 만 수정해야하는 경우 다음 방법이 필요합니다.

기본 기간
    //获取Session的默认超时时长
    protected void defaultLife(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        int maxInactiveInterval = request.getSession().getMaxInactiveInterval();
        response.getWriter().write("默认超时时间为"+maxInactiveInterval);
    }
시간 초과 기간 수정
    //修改3秒超时时长
    protected void life3(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        HttpSession session = request.getSession();
        session.setMaxInactiveInterval(3);
        response.getWriter().write("当前Session设置为3秒后超时");
    }
즉시 파괴
    //让Session马上超时
    protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    
    
        HttpSession session = request.getSession();
        //马上销毁
        session.invalidate();
        response.getWriter().write("当前Session设置立即销毁");
    }

세션과 브라우저 간의 연관성 내부 이야기

er (). write ( "현재 세션이 3 초 후 시간 초과로 설정되었습니다.");
}


##### **立即销毁**

```java
    //让Session马上超时
    protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        HttpSession session = request.getSession();
        //马上销毁
        session.invalidate();
        response.getWriter().write("当前Session设置立即销毁");
    }

세션과 브라우저 간의 연관성 내부 이야기

여기에 사진 설명 삽입
면책 조항 : 실리콘 밸리의 비디오 편집

추천

출처blog.csdn.net/weixin_46250447/article/details/112298545