쿠키 (클라이언트)
쿠키 란?
- 쿠키는 서버가 클라이언트에게 키-값 쌍을 저장하도록 알리는 기술입니다.
- 클라이언트에 쿠키가 있으면 각 요청이 서버로 전송됩니다.
- 각 쿠키의 크기는 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设置立即销毁");
}
세션과 브라우저 간의 연관성 내부 이야기
면책 조항 : 실리콘 밸리의 비디오 편집