JavaWeb 연구 노트 4 : 쿠키 및 세션

1- 요청 전송 및 재

요청 전송
은 다음과 같이하여 전달 요청이 모호 :

request.getRequestDispatcher("login_success.html").forward(request, response);

강점과 약점 :

1, 쇼 주소가 요청 서블릿의 주소가 확인 200 반환
이 도움이 클라이언트에 내부 서버가 후속 작업을 실시합니다 때문에, 2, 요청의 수를 한 번만
에만 자원 경로의 프로젝트 이동할 수 있습니다, 3
(4), 약간 높은 효율성 오직 하나 개의 요청을 실행하기 때문에
요청 개체 (5) (A)에 사용될 수있는


로 표현 된 리디렉션은 다음과 같습니다의 방향 즉 점프 위치 매개 변수를

response.sendRedirect("login_success.html");

강점과 약점 :

(1) 어드레스를 리소스 어드레스 것을 최종 경로에 표시되는
2 요청 중 적어도 두 숫자, 첫 번째 요청 후 서버 (302) 및 어드레스를 리턴 어드레스에 기초하여 상기 브라우저는 제 2 구경을 수행
3 뿐만 아니라 자신의 프로젝트 파일, 어떤 경로로 이동할 수
두 요청 수행, 4, 약간 낮은 효율성
하나가에 사용 요청에 저장된 데이터 또는 요청을 사용하지 않을 수 없습니다, 5, 후속 요청을 이 두 개의 서로 다른 요구하기 때문에, 객체

리디렉션에 대해, 내가 쓴 전에 :

response.setStatus(302);
response.setHeader("Location","login_success.html");

그래서, 지금 당신이 대신 직접 줄 수 있습니다
잘 이해 요청 및 리디렉션 사실 전달을 보일 수 있습니다 :
그림 삽입 설명 여기

2 쿠키 간단한 소개 및 사용

사실, 작은 데이터 클라이언트 서버 및 클라이언트에 저장된 : 쿠키
시나리오 :> 자동 로그인, 검색 기록, 쇼핑 카트

Q : 왜 쿠키가?
A : 통신 상태가없고, 때 HTTP 요청은 무 상태, 클라이언트와 서버입니다. 사실, 두 번째 방문시 클라이언트, 서버는 클라이언트가 이전에 이전에 액세스 할 수 없었다는 것을 알 수 없습니다. (가) i는 사용자가 전에 그래서 쿠키는 기업 차원에서 말하면, 사실, 데이터가 저장해야 더 나은 사용자 경험, 더 나은 상호 작용 [자동 로그인]을 주문, 더 나은 수집 사용자 습관 [빅 데이터]이다.

쿠키 사용 및 액세스 :

response.setContentType("UTF-8");	//设置编码,否则响应在页面的中文会乱码
Cookie[] cookies = request.getCookies();	//获得Cookies,有可能为空对象
if(cookies==null){		//若为空对象则添加一次
	Cookie cookie = new Cookie("hpf","perfect");	//以key-value的形式保存
	response.addCookie(cookie);
	response.getWriter().write("Cookie添加成功!");
	System.out.println("Cookie添加成功!");
}else{
	for (Cookie cookie : cookies) {		//遍历
		String name = cookie.getName();
		String value = cookie.getValue();
		System.out.println("Cookie:"+name+"="+value);
	}
}

공통 API를 쿠키 :

//关闭浏览器后,cookie就没有了 ---> 针对没有设置cookie的有效期
//expiry: 有效 以秒计算。
//正值: 表示在这个数字过后,cookie将会失效。
//负值: 关闭浏览器,那么cookie就失效, 默认值是 -1
cookie.setMaxAge(60 * 60 * 24 * 7);	 //使用Cookie对象来设置,表示七天有效期
//cookie.setValue(newValue);	//赋值新的值
//用于指定只有请求了指定的域名,才会带上该cookie
cookie.setDomain(".itheima.com");
//只有访问该域名下的cookieDemo的这个路径地址才会带cookie
cookie.setPath("/CookieDemo");
3 쿠키 마지막을 가져옵니다

다음은 쿠키 포괄적 예를 들어, 다음과 같은 코드 (주요 부분)가 될
login.html은 :

<body>
	<h3>请登录</h3>
	<form action="Demo03">
		账号:<input type="text" name="username">
		密码:<input type="password" name="password">
		<input type="submit" value="登录">
	</form>
</body>

CookieUtil :

//获取指定name的Cookie
public static Cookie getCookie(Cookie[] cookies,String name){
	for (Cookie cookie : cookies) {
		if(cookie.getName().equals(name)){
			return cookie;
		}
	}
	return null;
}
//清空当前浏览器的Cookie
public static Cookie[] clearCookie(Cookie[] cookies,HttpServletResponse response){
	for (Cookie cookie : cookies) {
		cookie.setMaxAge(0);
		response.addCookie(cookie);
	}
	return cookies;
}

GetLastLoginTime :

response.setContentType("text/html;charset=UTF-8");
Date currenDate = null;
String currenTime = "";
String username = request.getParameter("username");
Cookie[] cookies = request.getCookies();
Writer writer = response.getWriter();
if(cookies!=null){
	//获取上一次登录的时间
	Cookie time = CookieUtil.getCookie(cookies, "time");
	if(time!=null){
		String value = time.getValue();
		writer.write("欢迎"+username+"登录,上一次的登录时间为:"+value);
		currenDate = new Date(System.currentTimeMillis());
		currenTime = currenDate.toLocaleString();
		time.setValue(currenTime);
		time.setMaxAge(60*5);
		response.addCookie(time);
	}else{
		CookieUtil.clearCookie(cookies,response);
		response.setHeader("refresh", "3;login.html");
		writer.write("Cookie已有数组,清空成功!");
	}
}else{
	currenDate = new Date(System.currentTimeMillis());
	currenTime = currenDate.toLocaleString();
	Cookie time = new Cookie("time", currenTime);
	time.setMaxAge(60*5);
	response.addCookie(time);
	response.setHeader("refresh", "3;login.html");
	writer.write("未找到Cookie,添加timeCookie成功!");
}

요약 및 개인적인 경험 :
1, login.html 너무 간단 더 말을하거나,하지
, 캐릭터 세트 = UTF-8 2로 setContentType 분야에서이 방법을 수행하지 텍스트 잘못! / HTML
3,이 일 글쓴이 가장 객체를 작성하거나 할 때마다 얻을
첫 상륙 있지만, 그러나 너무 비어 백분율 그것의 장점이 걸릴 전에이 쿠키 수, 4
5 빈 완성 또는 완료 추가 쿠키를 새로 고쳐야합니다 login.html에
6, 반드시 다시 코드 코드이지만, 그렇지 않은 일회성 쓰기 밖으로이며, 단도직입, 당신은 생각을 알아!

4 쿠키 상품의 역사

우선, 내가있는 WebContent에 배치 상품의 HTML 페이지를 준비합니다.
둘째, 다음의 WebContent 파일에 새로운 JSP를 생성, product_list.jsp는, JSP로 HTML로 내용을 복사합니다.
그런 다음, 그것을 상품의 점프 주소 변경 product_list.jsp을 변경합니다.

생각의 과정 기록 :
1, 사용자가 집 상품의 목록을 입력은, 상품이 집에 처음으로,이 시간을 선택하지 않은
ID를 기록 쿠키를 기반으로 제품 ID, 서블릿 돌아 JSP, 2, 사용자가 선택하는 상품을
3, 사용자가 처음 아니다 홈으로 시간이 다른 상품을 선택, 서블릿은 쿠키의 마지막 ID에 이것을 추가

서블릿 코드는 다음과 같습니다 :

String id = request.getParameter("id");
Cookie[] cookies = request.getCookies();
Cookie history = CookieUtil.getCookie(cookies, "history");
if(history==null){//第一次进网站,没有cookie保存
	Cookie h = new Cookie("history",id);
	h.setMaxAge(60*1);
	//设置访问这个工程的时候,才带cookie过来
	h.setPath("/CookieDemo02");
	response.addCookie(h);
}else{//非第一次浏览,输出cookie并更新
	System.out.println(history.getValue());
	history.setValue(id+"#"+history.getValue());	//拼接Cookie
	history.setMaxAge(60*1);
	history.setPath("/CookieDemo02");
	response.addCookie(history);
}
//跳转到具体的info页面
response.sendRedirect("product_info.htm");

> 결국 클래스로 번역, 서블릿이다 - 여기 JSP, AVA 서버 호출기는 무엇인가. 그는 JSP로 자바 코드로 작성 할 수 있습니다.

  • 글로벌 변수 정의
    <% 지능 A = 99;! %>
  • 로컬 변수를 정의
    <INT % B = 999 % >
  • A와 B의 JSP 페이지에서 표시 값
    <= A %%>
    <% B = %>

product_list.jsp 자바 코드는 다음과 같습니다 :

<% 
	Cookie[] cookies = request.getCookies();
	Cookie history = null;
	if(cookies==null){
		history = null;
	}else{
		history = CookieUtil.getCookie(cookies, "history");
	}
	String[] ids = null;
	//若history为空的话
	if(history==null){
%>
		<h1>您的浏览记录为空!</h1>
<%
	}else{
		ids = history.getValue().split("#");
		for(String id : ids){
%>
			<li style="width: 150px;height: 216;float: left;margin: 0 8px 0 0;padding: 0 18px 15px;text-align: center;"><img src="products/<%=id%>.jpg" width="130px" height="130px" /></li>
<%
		}
	}
%>

참고 :
첫 번째 쌍 <%>, 쿠키가 판단하지 않으면, 너무 판사, 널 포인터가 오류를보고 할 페이지를 입력 할 수 있습니다.
사용에 다음의 id는 디렉토리 제품에서 그림 파일로 얻을 수 있습니다.
위의 함수의 모든 코드가 구현되도록 : 쇼핑몰을 입력하면 항목을 선택할 수 있고,보기 역사 마침내 능력

삭제 검색 기록 달성 :
역사의 사진 아래 첫 번째 DIV를 H2, H2 중첩 된 <작성 HREF = "ClearHistory을"> 인터넷 역사 </ > 그런 다음, 주요 코드는 다음과되어, 실제로 매우 간단 ClearHistory 쓰기 :

Cookie[] cookies = request.getCookies();
Cookie history = CookieUtil.getCookie(cookies,"history");
Cookie cookie = new Cookie("history", "");
cookie.setMaxAge(0);
cookie.setPath("/CookieDemo02");
response.addCookie(cookie);
response.sendRedirect("product_list.jsp");

요약 참고 :
1, 쿠키를 삭제하는 것이 더 삭제 방법, 0 만 MAXAGE 세트입니다
이 때문에 세트 0, 의도는 브라우저가 종료 된 후에 만 분명하다, 즉시 볼 수 없습니다
항상하지 않는 삭제 된 경우 (3), 삭제 밖으로, 역사 일반, 또는하지 않도록주의 정도에, 비 첫번째 브라우징 당신이 쿠키를 추가 할 때 경로를 설정하는 것을 잊지 쿠키로 이어지는은 나중에 추가하지 / CookieDemo02 다음과 같습니다 초점! ! !

쿠키 요약 :
  1. 쿠키는 클라이언트에 서버에서 클라이언트로 데이터의 일부를 전송하고 저장

  2. 쿠키를 추가, 쿠키를 가져옵니다

    request.getCookie();
    response.addCookie();
    
  3. 쿠키 분류
    세션 쿠키
    에 의해 기본값은, 브라우저를 닫고, 쿠키가 사라집니다

    쿠키 지속성
    을 통해 시간, 그들은 유효하며 클라이언트에 저장됩니다

    cookie.setMaxAge(0); //设置立即删除
    cookie.setMaxAge(100); //100 秒
    
  4. 쿠키 보안 문제는
    1, 쿠키에 의한 때문에 안전 문제가있는 클라이언트에 저장됩니다
    세션의 도입에> -이 문제를 해결하기 위해, 쿠키의 크기와 개수가 제한되어, 2, 및

5 세션 발표 및 사용이 간편

세션 세션 쿠키의 메커니즘을 기반으로
쿠키 유사성 세션과의 차이 :
쿠키는 클라이언트가 서버에 의해 반환 된 데이터의 작은 부분이고, 세션 클라이언트에 데이터가 저장되어 있지만, 서버 측에 저장된

세션 공통 API :

//得到会话ID
String id = session.getId();
//存值
session.setAttribute(name, value);
//取值
session.getAttribute(name);
//移除值
session.removeAttribute(name);

세션의 라이프 사이클 :
제작 : request.getSession ()를 호출하는 서블릿에서이 방법은,이 세션 만드는 경우
파괴 : 심지어 브라우저 세션 떨어져, 세션 데이터는 서버의 메모리에 저장됩니다 또한 파괴하지
: 방법을 파괴
서버 종료 1
2 세션 세션 시간이 만료되고이 기간이 끝나면 있도록. 기본값은 30 분 동안 유효합니다

6 세션 페이지 카트를 달성

세션 카트 (분석)의 예 :
본 실시 예 1, 데이터 저장 카트는 세션 쿠키 등이지만 더 보안을 수행 할 수있다
, (2) 제 일반적인 구조 : 상품 페이지 -> Count.Servlet-> 페이지 결제
3, 제 친숙한 방법에서 사용하는 세션 및, 상기 캔의 내부에

세션 카트 예 (페이지 표시)
product_list.jsp :

<body>
	<h1>请选择以下商品购买!</h1>
	<a href="Count?id=0"><h3>iphone7</h3></a>
	<a href="Count?id=1"><h3>小米10</h3></a>
	<a href="Count?id=2"><h3>华为p30pro</h3></a>
	<a href="Count?id=3"><h3>魅族3</h3></a>
	<a href="Count?id=4"><h3>联想y7000p</h3></a>
	<a href="Count?id=5"><h3>戴尔外星人</h3></a>
</body>

카운트:

response.setContentType("text/html;charset=utf-8");
String[] names = {"iphone7","小米10","华为p30pro","魅族3","联想y7000p","戴尔外星人"};	//所有的商品名
Integer id = Integer.parseInt(request.getParameter("id"));		//获取传过来的id
String name = names[id];	//取出id所对应的商品名
Writer writer = response.getWriter();	//获取输出流
HttpSession session = request.getSession();		//获得Session
Map<String, Integer> cart = (Map<String, Integer>)session.getAttribute("cart");
if(cart==null){	//以大化小,先化大的
	cart = new LinkedHashMap<String, Integer>();
	request.getSession().setAttribute("cart", cart);
}
if(!cart.containsKey(name)){	//第一次选择商品,并且购物车里面没东西
	cart.put(name, 1);
}else{	//不是第一次选择商品,要叠加数量并显示
	cart.put(name, (cart.get(name)+1));
}
writer.write("<a href='product_list.jsp'><h2>继续购物</h2></a>");
writer.write("<a href='cart.jsp'><h2>进行结算</h2></a>");

cart.jsp :

<body>
	<h1>以下为所选商品以及数量</h1>
	<%
		Map<String,Integer> cart = (Map<String,Integer>)request.getSession().getAttribute("cart");
		for(String name : cart.keySet()){
	%>
		<h3>商品名:<%=name %>	数量:<%=cart.get(name)%></h3>
	<%
		}
	%>
		<a href="ClearCart"><h2>清空购物车</h2></a>
</body>

세션 카트 예 (빈 장바구니) :

HttpSession session = request.getSession();
//写法二:移除整个session
session.invalidate();

//写法一:移除cart这个map
session.removeAttribute("cart");
response.sendRedirect("cart.jsp");

장바구니 요약 예 :
1 그래서 그들은 더 나은, 쿠키 및 세션 사용을 이해하고 많은 혜택을 누릴 것을
비 숙련의지도를 사용하여 통합되었습니다에 의해, 2, 강화 한
상품 개수의 코드를 추가, 3, 나는 배웠다 DAHUA 작은 아이디어가 큰 (카트) 판단을 넣어 작은 (추가)를 할
4, <%> 사용이 강화되었으며, 점차적으로 쓰기 JSP 페이지 코드에 사용됩니다 foreach 루프도있다 강화
(5), 기본 웹 프로젝트 구현은 깊은 이해와 개발되고, 그들의 노력에 감사했다!

게시 15 개 원래 기사 · 원의 찬양 (18) · 전망 4575

추천

출처blog.csdn.net/oZuoShen123/article/details/105096255