现在的位置: 首页 > 综合 > 正文

第九天:cookie原理

2018年05月17日 ⁄ 综合 ⁄ 共 7888字 ⁄ 字号 评论关闭

先有servlet
后有JSP。是为了方便。

在web.xml里面有:

   <servlet>

       <servlet-name>jsp</servlet-name>

       <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>

       <init-param>

           <param-name>fork</param-name>

           <param-value>false</param-value>

       </init-param>

       <init-param>

           <param-name>xpoweredBy</param-name>

           <param-value>false</param-value>

       </init-param>

       <load-on-startup>3</load-on-startup>

</servlet>

 

    <servlet-mapping>

       <servlet-name>jsp</servlet-name>

       <url-pattern>*.jsp</url-pattern>

    </servlet-mapping>

 

    <servlet-mapping>

       <servlet-name>jsp</servlet-name>

       <url-pattern>*.jspx</url-pattern>

    </servlet-mapping>

 

当我们访问jsp页面时间会自动调用,那个servlet,去编译。

 

    <servlet>

       <servlet-name>jsp</servlet-name>

       <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>

        <init-param>

           <param-name>fork</param-name>

            <param-value>false</param-value>

        </init-param>

        <init-param>

           <param-name>xpoweredBy</param-name>

           <param-value>false</param-value>

        </init-param>

               <init-param>

           <param-name>development</param-name>

            <param-value>true</param-value>

       </init-param>

       <load-on-startup>3</load-on-startup>

    </servlet>

Is Jasper usedin development mode? If true,   -->

the frequency atwhich JSPs are checked for    -->

 modification may be specified via the          -->

 modificationTestInterval parameter.[true]    

 

application= ServletContext

config    = ServletConfig

page     = this

request,response,out约等于 resoponse.getWrite();

 

还有三个:session,exception,pageContext.

一共九隐含对象。

 

Jsp可以与servlet一样用。

 

  <servlet>

    <servlet-name>xxx</servlet-name>

   
<
jsp-file>/index.jsp</jsp-file>

  </servlet>

 

  <servlet-mapping>

    <servlet-name>xxx</servlet-name>

    <url-pattern>/myjsphtml</url-pattern>

  </servlet-mapping>

 

前面已经总结过:

<%@ pagecontentType="text/html;charset=gb2312"%>

<%@ page  pageEncoding=GBK%>

这两个单独存在的话,它们的作用是相同的,都是两个作用:

第一:按照这个编码生成Servlet文件。

第二:在servlet中生成一个setContentType()的方法,即告诉浏览器

用什么东西解码。

其实这两步是独立的,一步负责进去,一步负责出来。

 

如果这两个同时间存在,那么它们就各司其职,pageEncoding负责把它转换成Servelt以某种编码,contentType负责生成一个响应头方法去告诉浏览器我要以哪种编码发过去,请你用这个东西解码。

 

SetContentType(GBK)的作用,告诉浏览器我以GBK编码把数据送过去,请你用GBK解码,这就是浏览器能够自动选择编码的原因。

 

错误处理

 

  <error-page>

    <exception-type>java.lang.NullPointerExcepion</exception-type>

    <location>/error.jsp</location>

  </error-page>

 

   <error-page>

   
<
error-code>404</error-code>

   
<
location>/index.jsp</location>

 </error-page>

 

 

配置错误页面:常用的是404500两个错误码。

 

 

java.lang.NullPointerExcepion这样配置的错误

太多了,你可以直接写上它的父类

java.lang.RunTimeExcepion

 

只有用<%@page
isErrorPage="true"
%>页面才能够有

<%=exception
%>否则无法获得这个隐含对象

在正常页面用%@pageerrorPage="error.jsp" %引用它。

 

 

Cookie:

在IEà工具à隐私à高级把Cookie禁用后,那么就不能购物,不能够登陆邮箱 。

你每次发送请求,客户端之所以能够识别是因为它能够识别不同的cookie。

 

JAVA中,我们调用 java.lang下面的包时间不用再导入这个包。

jsp中,我们调用javax.servlet.   java.servlet.http这些包也不用导入。

 

 

CoC

 

 

 

Cookie原理图,

在jsp页面:

    <%

    Cookiecookie = new Cookie("username","chen");

    response.addCookie(cookie);

   

    Cookiecookie2 = new Cookie("password","123");

    response.addCookie(cookie2);

     %>

 


然后去第一次访问这个页面,服务器会送出三个cookie.

Set-Cookie:JSESSIONID=5E751E38A3AB0062FB72248262DEA76E;Path=/day09_servlet_jsp

Set-Cookie: username=chen

Set-Cookie: password=123

 

一个是系统的,一个我们自己设置的,然后我们再去访问这个网站的其它页面的时间,

在客户端的响应消息头里面:

Cookie:username=chen;password=123;JSESSIONID=5E751E38A3AB0062FB72248262DEA76E

 

我们在购物或者只要是涉及到登陆名的网站甚至没有也行,那么服务器如果发现你没有他网站的cookie它都会给你发一个cookie,然后你在浏览器其它页面的时间,服务器才知道到底是谁在访问我,因为我们每个人发给浏览器的信息头都是一样的,唯一的区别是服务器发给我们的不同cookie.

 

我们可subcookiecookie.setPath("/");

 

Set-Cookie:JSESSIONID=769C8CB1BCD7823104F53E04BF1CC4A0;
Path=/day09_servlet_jsp

Set-Cookie:username=chen; Path=/

Set-Cookie:password=123

说明以后再向网页发出山请求的的时间,username,在任何时间都会发送给服务器,第一个 cookie只会在自己的网站下发送cookiepassword只会对所在子目录下发送。

 

 

浏览器一关闭,内存就清空,cookie就不存在,如果你打开两个浏览器那么就是两个客户端。

 

惊天大秘密,我们在写servlet action时间打死你也不要用相对路径,一定要用绝对路径,

前面加上项目名/servlet_day05/servlet/login
,但是我们在部署的时间用户可能说我要改下访问路径,不想用这个名字,所以这样写,我们的jobsys项目在这做的特别不好,因为没有用绝对路径,很容易出问题。

<form
action="<%=request.getContextPath() %>/servlet/Login""method="post">

 

 

 

Request.setAttribute();

${}

<%=request.getAttribute(“username”)%>
这样用绝对有缺陷。

 

利用cookie记住登陆小例子十分重要:

第一、 action路径一定要用绝对路径,用request.getContextPath();

第二、 request.getRequestDispatcher().forwrad()

第三、 request.getCookies();

第四、 ${xx} = <%=request.getAttribute(xx)%>

 

 


 

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>My JSP 'login.jsp' starting page</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
   	<form action="<%=request.getContextPath() %>/servlet/Login"" method="post">
   		<input type="text" name="username" value="${userName}"/>
   		<input type="password" name="password" value="${password}"/>
   		<input type="checkbox" name="rememberMe" ${checked}/>记住我
   		<input type="submit" name="sub" value="login"/>
   	</form>
  </body>
</html>
package cn.cookie;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.CookiePolicy;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LogonUI extends HttpServlet {

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		Cookie[] cookies = request.getCookies();
		
		String userName = null;
		String password = null;
		
		//这样写是怕第一次访问的时间肯定有空的值 。加个条件让它不进入循环,十分好。
		for(int i=0;cookies!=null&&i<cookies.length;i++){
			if ("username".equals(cookies[i].getName())) {
				userName = cookies[i].getValue();
			}
			if("password".equals(cookies[i].getName())){
				password = cookies[i].getValue();
			}
		}
		
		request.setAttribute("userName", userName);
		request.setAttribute("password", password);
		
		String checked="";
		if(userName !=null){
			checked = "checked='checked'";
		}
		request.setAttribute("checked", checked);
		
		
		
		RequestDispatcher rd = request.getRequestDispatcher("/autologon/login.jsp");
		rd.forward(request, response);
		
	}


}

package cn.cookie;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class Login extends HttpServlet {

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		String username = request.getParameter("username");
		String password = request.getParameter("password");
		String remember = request.getParameter("rememberMe");
		
		Cookie cookieUserName = new Cookie("username", null);
		Cookie cookiePassword = new Cookie("password", null);
		
		//只有当内容不为空的时间,才把它放到cookie里面去。
		if (!"".equals(username) && !"".equals(password)) {
			cookieUserName.setValue(username);
			cookiePassword.setValue(password);
			//如果选中记住我,则把它年龄设置一年。
			if (remember!=null) {
				cookiePassword.setMaxAge(365*24*3600);
				cookieUserName.setMaxAge(365*24*3600);
			}
		}

		response.addCookie(cookieUserName);
		response.addCookie(cookiePassword);
		
		request.getRequestDispatcher("/autologon/success.jsp").forward(request, response);
		
	}

}

抱歉!评论已关闭.