request对象常用API 获取请求参数的值 request应用 MVC设计模式
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("验证码出错");
}
}
}
request对象常用API 获取请求参数的值 request应用 MVC设计模式的更多相关文章
- 在OnActionExecuted 获取请求参数的值(包含类类型)
1.在OnActionExecuting里 获取请求参数的值 比较简单 /// <summary> /// 获取首参数的值 /// </summary> /// <par ...
- 入门servlet:request获取请求参数通用方式
一.获取请求参数通用方式 1. String getParameter(String name):根据参数名称获取参数值 例:username=flypig&password=2343 2. ...
- servlet-api api文档获取请求参数
1.假如有个get请求后面带有的参数如下: a=b&a2=b2&a3=b3&a4=b4. 如果想获取所有的key,value.这个时候可以根据request的getQueryS ...
- JavaWeb request对象常用操作
JavaWeb request对象常用操作 CreateTime--2018年6月1日16点47分 Author:Marydon 一.前提 import javax.servlet.http.Ht ...
- struts2获取请求参数的三种方式及传递给JSP参数的方式
接上一篇文章 package test; import com.opensymphony.xwork2.ActionSupport; import javax.servlet.http.*; impo ...
- springMVC(spring)+WebSocket案例(获取请求参数)
开发环境(最低版本):spring 4.0+java7+tomcat7.0.47+sockjs 前端页面要引入: <script src="http://cdn.jsdelivr.ne ...
- ServletRequest HttpServletRequest 请求方法 获取请求参数 请求转发 请求包含 请求转发与重定向区别 获取请求头字段
ServletRequest 基本概念 JavaWeb中的 "Request"对象 实际为 HttpServletRequest 或者 ServletRequest, ...
- spring(spring mvc)整合WebSocket案例(获取请求参数)
开发环境(最低版本):spring 4.0+java7+tomcat7.0.47+sockjs 前端页面要引入: <script src="http://cdn.jsdelivr.ne ...
- SpringMVC 获取请求参数
1.获取Request response对象 在SpringMVC的注解开发中,可以选择性的接收Request和Response对象来使用 2.获取request对象请求参数 a.通过request对 ...
随机推荐
- Linux 获取文件夹下的所有文件
作者:jostree 转载请注明出处 http://www.cnblogs.com/jostree/p/4129616.html #include <string> #include &l ...
- js判断屏幕分辨率的代码
通过下面的代码判断分辨率 <script language="JavaScript"> <!-- Begin function redirectPage() { ...
- Kakfa揭秘 Day7 Producer源码解密
Kakfa揭秘 Day7 Producer源码解密 今天我们来研究下Producer.Producer的主要作用就是向Kafka的brokers发送数据.从思考角度,为了简化思考过程,可以简化为一个单 ...
- JDBC 简介
[摘要] 1) JDBC : (Java Database Connectivity ,java数据基础连接)是标准的Java 访问数据库的API.即Java数据库编程接口,是一组标准的Java语言中 ...
- JavaScript 权威指南第6版 - [阅读笔记]
JavaScript 基础 Page 13 (1)<script> 的属性:async,charset,defer='defer',language已废,src,type (2)n ...
- Teradata基础教程中的数据库试验环境脚本
Teradata基础教程中的数据库表: Customer: 客户信息表 Location: 位置信息表 Employee: 雇员信息表 Job: 工作信息表 Department: 部门表 ...
- OFBIZ bug_create-component ERROR
开发环境:win7 64位 Eclipse 运行create-component,报一下错误: Buildfile: F:\workspace\opensource\apache-obiz\apach ...
- iOS CoCoa编程中视图控制器与视图类(转)
分类: iPhone2012-05-28 11:19 837人阅读 评论(0) 收藏 举报 cocoa编程iosuinavigationcontrolleruiviewiphone iPhone编程规 ...
- Sql之表的连接总结
1.交叉连接(就是将两张表的数据 交叉组合在一起) 有两张表 客户表:[Sales.Customers] 和订单表:[Sales.Orders]. 业务需求:实现 Customer中custid(客户 ...
- python学习笔记29(python中堆的使用)
堆(heap):优先队列的一种,使用优先队列能够以任意顺序增加对象,并且能在任意时间(可能在增加对象的同时)找到(也可能是移除)最小元素,比用于列表中min的方法要高效. Python中并没有独立的堆 ...