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="提交"/> <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="提交"/> <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="提交"/> <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
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("验证码出错"); } } }