request对象常用API 获取请求参数的值 request应用 MVC设计模式

时间:2021-08-26 20:07:48

1 request对象常用API
  1)表示web浏览器向web服务端的请求
  2)url表示访问web应用的完整路径:http://localhost:8080/day06/Demo1
    uri表示访问web应用的资源路径:/day06/Demo1
    queryString表示?开头的参数;name=jack
    pathInfo:路径之外的信息,如果没有,返回null

package cn.itcast.web.request;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /*
* http://localhost:8080/day06/Demo1?name=jack回车
*/ public class Demo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
/*
String url = request.getRequestURL().toString();
String uri = request.getRequestURI();
String query = request.getQueryString();
String pathInfo = request.getPathInfo();
System.out.println("url=" + url);
System.out.println("uri=" + uri);
System.out.println("query=" + query);
System.out.println("pathInfo=" + pathInfo);
*/ String clientIP = request.getRemoteAddr();
String clientHOST = request.getRemoteHost();
int clientPORT = request.getRemotePort(); String serverIP = request.getLocalAddr();
String serverHOST = request.getLocalName();
int serverPORT = request.getLocalPort(); System.out.println("客户端:"+clientIP+":"+clientHOST+":"+clientPORT);
System.out.println("服务端:"+serverIP+":"+serverHOST+":"+serverPORT);
}
}

获得客户机信息

•getRequestURL方法返回客户端发出请求时的完整URL。

•getRequestURI方法返回请求行中的资源名部分。

•getQueryString 方法返回请求行中的参数部分。

•getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头。

•getRemoteAddr方法返回发出请求的客户机的IP地址。

•getRemoteHost方法返回发出请求的客户机的完整主机名。

•getRemotePort方法返回客户机所使用的网络端口号。

•getLocalAddr方法返回WEB服务器的IP地址。

•getLocalName方法返回WEB服务器的主机名。

获得客户机请求头

•getHeader(string name)方法:String

•getHeaders(String name)方法:Enumeration

•getHeaderNames()方法

获得客户机请求参数(客户端提交的数据)

•getParameter(String)方法

•getParameterValues(String name)方法

•getParameterNames方法+BeanUtils框架
取得请求头相关的信息

*a)request.getHeader(String):String

b)request.getHeaders(String):Enumeration

c)getHeaderNames():Enumeration

*2 获取请求参数的值

2)取得请求体相关的信息

a)request.getParameter(String):String

b)request.getParameterValues(String):String[]

注意:在GET请求方式下,如果参数不一致,返回null,可能出现空指针异常

c)BeanUtils框架能够自动将String参数设置到JavaBean对象中

1)无需理会参数的类型,个数,但是参数名一定要和JavaBean中的字段一致

2)String->8种基本类型自动转换,非8种基本类型可以注册转换器

3)String或String[]类型的参数自动感知装配

package cn.itcast.web.request;

import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Demo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//一次性取得所有的请求头信息
Enumeration<String> enums = request.getHeaderNames();
while(enums.hasMoreElements()){
//key表示请求头
String key = enums.nextElement();
Enumeration<String> enums2 = request.getHeaders(key);
while(enums2.hasMoreElements()){
String value = enums2.nextElement();
response.getWriter().write(key+"<->"+value+"<br/>");
}
} /*
String acceptLanguage = request.getHeader("Accept-Language");
String userAgent = request.getHeader("User-Agent");
String host = request.getHeader("Host");
response.getWriter().write("Accept-Language=" + acceptLanguage + "<br/>");
response.getWriter().write("User-Agent=" + userAgent + "<br/>");
response.getWriter().write("Host=" + host + "<br/>");
*/
}
}
package cn.itcast.web.request;

import java.io.IOException;
import java.io.PrintWriter;
import java.lang.reflect.InvocationTargetException;
import java.util.Enumeration; import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.beanutils.BeanUtils; import cn.itcast.web.domain.User; /*
* http://localhost:8080/day07/Demo2?username=jack&age=30&salary=5000&likes=dance&likes=sing回车
*/ public class Demo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //分别取得客户端提交的信息
//String strUsername = request.getParameter("username");
//String strAge = request.getParameter("age");
//String strSalary = request.getParameter("salary");
//String[] strLikes = request.getParameterValues("likes"); BeanUtils bu = new BeanUtils();
User user = new User();
Enumeration<String> enums = request.getParameterNames();
while(enums.hasMoreElements()){
String key = enums.nextElement();
String[] values = request.getParameterValues(key);
try {
bu.setProperty(user,key,values);
}catch (Exception e) {
e.printStackTrace();
}
}
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.write("用户名:" + user.getUsername() + "<br/>");
pw.write("年龄:" + user.getAge() + "<br/>");
pw.write("期望薪水:" + user.getSalary() + "<br/>");
pw.write("爱好个数:" + user.getLikes().length + "<br/>");
pw.flush();
pw.close();
}
}

*3 request应用
   1)防盗链

判段某个页面来自于何方,即referer请求头

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index.html</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<a href="/day07/DownServlet">下载</a>
</body>
</html>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index.html</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
这是广告页面
</body>
</html>
package cn.itcast.web.request;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Demo4 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //取得浏览器来自于何方
String referer = request.getHeader("referer"); //判段
if(referer!=null && referer.equals("http://localhost:8080/day07/index.html")){
//转发到download.html页面
this
.getServletContext()
.getRequestDispatcher("/download.html")
.forward(request,response);
}else{
//转发到ad.html页面
this
.getServletContext()
.getRequestDispatcher("/ad.html")
.forward(request,response);
}
}
}

2)收集表单数据
     a)项目中,用户请求的参数,最好做null或空串的二次判段

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>index.html</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="/day07/Demo5" method="post">
<table border="1" align="center">
<caption>用户注册</caption>
<tr>
<th>用户名</th>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<th>密码</th>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<th>性别</th>
<td>
<input checked type="radio" name="gender" value="male"/>男
<input type="radio" name="gender" value="female"/>女
</td>
</tr>
<tr>
<th>爱好</th>
<td>
<input type="checkbox" name="likes" value="sing"/>唱歌
<input type="checkbox" name="likes" value="dance"/>跳舞
<input type="checkbox" name="likes" value="play"/>打球
<input type="checkbox" name="likes" value="net"/>上网
</td>
</tr>
<tr>
<th>上传文件</th>
<td><input type="file" name="upfile"/></td>
</tr>
<tr>
<th>城市</th>
<td>
<select name="city">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="gz" selected>广州</option>
<option value="cq">重庆</option>
</select>
</td>
</tr>
<tr>
<th>留言</th>
<td>
<textarea name="message" rows="5" cols="20"></textarea>
</td>
</tr>
<tr>
<td>
<input type="hidden" name="id" value="20111008"/>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="提交"/>
&nbsp;&nbsp;&nbsp;&nbsp;
<input type="reset" value="重填"/>
</td>
</tr>
</table>
</form>
</body>
</html>
package cn.itcast.web.request;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Demo5 extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //将[请求体]的中文以UTF-8方式重新编码
request.setCharacterEncoding("UTF-8"); String username = request.getParameter("username");
String password = request.getParameter("password");
String gender = request.getParameter("gender");
String[] likes = request.getParameterValues("likes");
String upfile = request.getParameter("upfile");
String city = request.getParameter("city");
String message = request.getParameter("message");
String id = request.getParameter("id"); System.out.println("username="+username);
System.out.println("password="+password);
System.out.println("gender="+gender);
System.out.println("likes="+likes.length);
System.out.println("upfile="+upfile);
System.out.println("city="+city);
System.out.println("message="+message);
System.out.println("id="+id);
}
}

3)中文乱码
     a)POST方式下乱码产生的原因:浏览器发送的编码方式与Request对象的编码方式不一致

解决方案:request.setCharacterEncoding("UTF-8),该方法只能解析请求体中的乱码方式,除此之外,无力解决

b)如果用户是post方式提交,在转发情况下,依然是post请求,但重定向情况下,是get请求

c)如果用户是get方式提交,在转发和重定向情况下,都是get请求

d)405:本身请求是get请求,但未在servlet内提供对应的doGet()方法, post也是类似

针对请求头编码:

<%@ page language="java" pageEncoding="UTF-8"%>
<%@ page import="java.net.*" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'get.jsp' starting page</title>
</head>
<body>
<%-- 对中文编码 --%>
<a href="/day07/Demo7?username=<%=URLEncoder.encode("小王","UTF-8")%>">
get方式传中文
</a>
</body>
</html>
package cn.itcast.web.request;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Demo7 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { String username = request.getParameter("username"); //中文解码
byte[] buf = username.getBytes("ISO8859-1");
username = new String(buf,"UTF-8"); if(username!=null || username.trim().length()>0){
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("用户名" + username);
}
}
}

//练习获取ip地址和所属地

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户登录</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="/day07/LoginServlet" method="post">
<table border="1" align="center">
<caption>用户登录</caption>
<tr>
<th>用户名</th>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="提交"/>
&nbsp;&nbsp;&nbsp;&nbsp;
<input type="reset" value="重填"/>
</td>
</tr>
</table>
</form>
</body>
</html>
package cn.itcast.web.request;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map; import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import cn.itcast.web.domain.IpCheckBean; public class LoginServlet extends HttpServlet {
//key为IP,value为归属地
private Map<String,String> map = new HashMap<String,String>();
public void init() throws ServletException {
//在用户第一次访问前加载IP和归属地,不存在多线程安全问题
map.put("192.168.2.222","北京");
map.put("192.168.10.122","上海");
map.put("192.168.10.50","深圳");
map.put("192.168.10.33","佛山");
map.put("192.168.10.44","珠海");
map.put("127.0.0.1","广州");
}
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
//IP
String ip = request.getRemoteAddr();
IpCheckBean ipCheckBean = new IpCheckBean();
//归属地
String address = ipCheckBean.check(ip,map);
//用户名
String username = request.getParameter("username");
//将信息绑定到ServletContext对象中
ServletContext context = this.getServletContext();
context.setAttribute("username",username);
context.setAttribute("ip",ip);
context.setAttribute("address",address);
/*转发到ShowServlet
context
.getRequestDispatcher("/ShowServlet")
.forward(request,response);
*/
//重定向到ShowServlet
response.sendRedirect("/day07/ShowServlet");
}
}
package cn.itcast.web.request;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletExceppackage cn.itcast.web.request; import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ShowServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
ServletContext context = this.getServletContext();
response.setContentType("text/html;charset=UTF-8");
PrintWriter pw = response.getWriter();
pw.write("欢迎:"+context.getAttribute("username")+"光临<br/>");
pw.write("你的IP是:"+context.getAttribute("ip")+"<br/>");
pw.write("归属地:"+context.getAttribute("address")+"<br/>");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
this.doPost(request,response);
}
}

lrequest对象实现请求转发:请求转发指一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。请求转发的应用场景:MVC设计模式

*4 再谈MVC设计模式
   1)如果严格按照MVC思想的话,浏览器首页访问的是控制器,然后再由控制器转发到视图

2)位于WEB-INF/目录下的资源,客户端无法直接访问,只能通过服务端转发进入

3)request对象也可用于资源的转发

request

.getRequestDispatcher("/WEB-INF/success.html")

.forward(request,response);

4)通过正则表达式验证中文:[\u4E00-\uFA29]+

5)对于重定向而言,前后的二个Request域对象不同,如果取值不到,返回"null",不会报错

6)request对象提供了一个getRequestDispatcher方法,该方法返回一个RequestDispatcher对象,调用这个对象的forward方法可以实现请求转发。

7)request对象同时也是一个域对象,开发人员通过request对象在实现转发时,把数据通过request对象带给其它web资源处理。

•setAttribute方法

•getAttribute方法

•removeAttribute方法

•getAttributeNames方法

package cn.itcast.web.request;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import cn.itcast.web.domain.ModelBean; public class Demo8 extends HttpServlet {
//NO1
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//转发到view.html页面
RequestDispatcher rd = request.getRequestDispatcher("/WEB-INF/view.html");
rd.forward(request,response);
}
//NO2
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String username = request.getParameter("username");
ModelBean mb = new ModelBean();
boolean flag = mb.validate(username);
if(flag){
//将用户名绑定到Request域对象中
request.setAttribute("USERNAME",username); /*转发到ListServlet.java
request
.getRequestDispatcher("/ListServlet")
.forward(request,response);
*/ //重定向到ListServlet.java
response.sendRedirect("/day07/ListServlet"); }else{
request
.getRequestDispatcher("/WEB-INF/fail.html")
.forward(request,response);
}
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户登录</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="/day07/Demo8" method="post">
<table border="1" align="center">
<caption>用户登录</caption>
<tr>
<th>用户名</th>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="提交"/>
&nbsp;&nbsp;&nbsp;&nbsp;
<input type="reset" value="重填"/>
</td>
</tr>
</table>
</form>
</body>
</html>
package cn.itcast.web.request;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class ListServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String username = (String) request.getAttribute("USERNAME");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("欢迎"+username+"光临");
}
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String username = (String) request.getAttribute("USERNAME");
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("欢迎"+username+"光临");
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>用户登录</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
登录失败
</body>
</html>
package cn.itcast.web.domain;

public class ModelBean {
public boolean validate(String username){
boolean flag = false;
if(username!=null && username.matches("[\u4E00-\uFA29]+")){
flag = true;
}
return flag;
}
}

5 request的细节

1)转发是通过RequestDispatcher对象的forward(request,response)方法完成的

2)forward()方法之前的输出,如果是输出到缓冲区,再转发到其他Servlet,那么原缓冲区的数据忽略不计

3)forward()方法之前的输出,如果真正输出到浏览器,再转发到其他Servlet,再转发到其他Servlet代码忽略不计

4)forward()方法之前的输出,如果是对响应头的设置,会保留到转发的其他Servlet中

请求转发的细节

•forward方法用于将请求转发到RequestDispatcher对象封装的资源。

•如果在调用forward方法之前,在Servlet程序中写入的部分内容已经被真正地传送到了客户端,forward方法将抛出IllegalStateException异常。

•如果在调用forward方法之前向Servlet引擎的缓冲区(response)中写入了内容,只要写入到缓冲区中的内容还没有被真正输出到客户端,forward方法就可以被正常执

•行,原来写入到输出缓冲区中的内容将被清空,但是,已写入到HttpServletResponse对象中的响应头字段信息保持有效

package cn.itcast.web.request;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Demo91 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//response.setContentType("text/html;charset=UTF-8");
//PrintWriter pw = response.getWriter();
//pw.write("Demo91");
//pw.flush();
//pw.close();
//request.getRequestDispatcher("/Demo92").forward(request,response);
response.sendRedirect("/day06/success.html");
}
}
package cn.itcast.web.request;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Demo92 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.getWriter().write("哈哈");
}
}

*6 重定向和转发区别

•一个web资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理,称之为请求转发/307。

•一个web资源收到客户端请求后,通知浏览器去访问另外一个web资源进行处理,称之为请求重定向/302。
   1)转发只能相对于当前web应用而言,不能转发到其它web应用

重定向可以在当前web应用之外的其它web应用重写向资源

2)转发/表示当前web应用

重定向/表示web服务器的根目录,即webapps目录

3)转发时,浏览器地址栏不变

重定向时,浏览器地址栏改变

4)转发是服务端的内部行为,浏览器不知

重定向是浏览器和服务端的共同行为,浏览器必知

5)转发时二个Servlet共享request域对象

重定向时二个Servlet独享request域对象

6)request具有二义性:

a)请求对象

b)域对   
7 include包含

1)需要使用Servlet包含相同的页面输出时,类似于函数调用

•RequestDispatcher.include方法用于将RequestDispatcher对象封装的资源内容作为当前响应内容的一部分包含进来,从而实现可编程的服务器端包含功能。

•被包含的Servlet程序不能改变响应消息的状态码和响应头,如果它里面存在这样的语句,这些语句的执行结果将被忽略

package cn.itcast.web.request;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class Demo10 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException { //取得客户端请求的类型
String method = request.getMethod();
System.out.println("method="+method); //包含head.html(类似于函数调用)
request
.getRequestDispatcher("/common/head.html")
.include(request,response);
response.getOutputStream().write("<hr/>".getBytes()); //动态生成
response.getOutputStream().write("login.html".getBytes());
response.getOutputStream().write("<hr/>".getBytes()); //包含foot.html
request
.getRequestDispatcher("/common/foot.html")
.include(request,response);
response.getOutputStream().write("<hr/>".getBytes());
}
}

会话
   1)用户输出URL地址,有效访问某个网站,在该网站上的一系列有效操作,随后关闭浏览器的整个过程,叫一次会话

2)会话主要解决服务端如何保存每个客户端对应的私有信息。

3)会话主要有二种:

a)Cookie技术[客户端技术]

b)Session技术 
  
Cookie

request对象常用API  获取请求参数的值  request应用  MVC设计模式

1)Cookie是客户端的技术

2)每次发送请求时,客户端都会带上各自已的不同Cookie到服务端,服务端一解析Cookie,就知道是哪个客户端发送过来的信息

3)一个Cookie只能存储一种类型的信息

4)更新某个名的Cookie,即向浏览器写一个相同名的Cookie

5)Cookie一定要设置一个有效时间,如果不设置的话,默认该请求访问结束后,该Cookie自动销毁,用专业名词来讲,

Cookie的默认有效期时一个有效会话结束

package cn.itcast.web.cookie;

import java.io.IOException;
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 Demo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
/*
//服务端产生Cookie
Cookie cookie = new Cookie("username","haha");
//设置Cookie存活时间
cookie.setMaxAge(1*24*60*60);
//服务端将Cookie写到客户端暂存
response.addCookie(cookie);
*/ //取得客户端所有的Cookie
Cookie[] cookies = request.getCookies();
Cookie usernameCookie = null;
if(cookies!=null){
for(Cookie c : cookies){
if(c.getName().equals("username")){
usernameCookie = c;
break;
}
}
//如果找到了Cookie
if(usernameCookie!=null){
System.out.println("Cookie的名字:" + usernameCookie.getName());
System.out.println("Cookie的值:" + usernameCookie.getValue());
System.out.println("Cookie的生命:" + usernameCookie.getMaxAge());
System.out.println("Cookie的路径:" + usernameCookie.getPath());
}
}
}
}
package cn.itcast.web.cookie;

import java.io.IOException;
import java.util.Date;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /*
* http://localhost:8080/day07/Demo2?name=jack回车
*/
public class Demo2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
String name = request.getParameter("name");
if(name==null){
name="default";
} //取得客户端的所有Cookie的值
Cookie[] cookies = request.getCookies();
if(cookies==null){
Cookie cookie = new Cookie("name_"+name,System.currentTimeMillis()+"");
cookie.setMaxAge(1*24*60*60);
response.addCookie(cookie);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write("欢迎"+name+"首次光临,访问时间:" + new Date().toLocaleString());
}else{
//查找名为name的Cookie
Cookie nameCookie = null;
for(Cookie c : cookies){
if(c.getName().equals("name_"+name)){
nameCookie = c;
break;
}
}
//找到了
if(nameCookie!=null){
String strTime = nameCookie.getValue();
response.setContentType("text/html;charset=UTF-8");
long lastTime = Long.parseLong(strTime);
response.getWriter().write("欢迎"+name+"再次光临,你上次访问时间:" + new Date(lastTime).toLocaleString());
//更新时间
Cookie cookie = new Cookie("name_"+name,System.currentTimeMillis()+"");
cookie.setMaxAge(1*24*60*60);
response.addCookie(cookie);
}
}
}
}

*0 带用验证码功能的用户登录
  1)验证码使用一个CheckCodeSerlvet产生,通过<img src=""/>发送请求,将验证码绑定到HttpSession中

2)产生的验证码一定要在输出到浏览器之前绑定到HttpSession中

3)设置验证码禁止缓存要在输出到浏览器之前 
  4)所有响应头的设置放置在最先

package cn.itcast.web.session;

import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Random;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession; public class CheckCodeServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
response.setHeader("expires","-1");
response.setHeader("cache-control","no-cache");
response.setHeader("pragma","no-cache");
String token = Token.getNum();
//将验证码绑定到域对象
HttpSession session = request.getSession();
session.setAttribute("checkCodeServer",token);
BufferedImage image = new BufferedImage(50,25,BufferedImage.TYPE_INT_RGB);
Graphics g = image.getGraphics();
g.drawString(token,15,15);
//加干扰线
for(int i=0;i<10;i++){
Random r = new Random();
int x1 = r.nextInt(50);
int y1 = r.nextInt(25);
g.drawLine(x1, y1, x1+4,y1+4);
}
ImageIO.write(image,"JPG",response.getOutputStream());
}
}
class Token{
public static String getNum(){
Random r = new Random();
int num = r.nextInt(10000);
return num + "";
}
}
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>login.html</title>
<meta http-equiv="content-type" content="text/html; charset=UTF-8">
</head>
<body>
<form action="/day09/LoginServlet" method="post">
<table border="1" align="center">
<tr>
<th>用户名</th>
<td><input type="text" name="username"/></td>
</tr>
<tr>
<th>密码</th>
<td><input type="password" name="password"/></td>
</tr>
<tr>
<th>验证码</th>
<td>
<input type="text" name="checkCodeClient"/>
</td>
<td>
<img src="/day09/CheckCodeServlet"/>
</td>
</tr>
<tr>
<td colspan="2" align="center">
<input type="submit" value="提交"/>
</td>
</tr>
</table>
</form>
</body>
</html>
package cn.itcast.web.session;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; public class LoginServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {
//收集客户端填入的验证码
String checkCodeClient = request.getParameter("checkCodeClient");
//取得服务端填入的验证码
String checkCodeServer = (String) request.getSession().getAttribute("checkCodeServer");
//判段
response.setContentType("text/html;charset=UTF-8");
if(checkCodeClient!=null && checkCodeClient.trim().length()>0 && checkCodeServer!=null && checkCodeServer.equals(checkCodeClient)){
response.getWriter().write("验证码正确");
}else{
response.getWriter().write("验证码出错");
}
}
}