1.5 实现网页的定时跳转并刷新
代码语言:javascript复制(1)定时跳转:从一个注册页面跳转到登陆界面,输入之前注册的用户名和密码。
代码如下:
//[1]定时跳转,需要用到Refresh响应头
response.setHeader("Refresh", "5;URL=/chapter04/login.html");
(2)定时刷新:在当前页面的地址不发生变化,但是当前页面自己定时刷新,
页面数据会发生变化。
代码如下:
//[2]定时刷新
response.setHeader("Refresh", "5");
response.getWriter().print(new Date());
1.6 实现重定向
代码语言:javascript复制实现重定向相关方法:
[1]第一种方式:302和Location配合使用,实现重定向
//1.设置状态码
response.setStatus(302);
//2.设置响应头,完成重定向到登陆界面的操作
response.setHeader("location","/chapter04/login.html");
[2]第二种方式:sendRedirect("/chapter04/login.html");
重定向通过登陆案例来完成:
需求分析:在登陆页面输入用户名和密码,在LoginServlet里面判断用户名
和密码是否正确。如果输入错误,会重新定向到登陆界面。如果
正确,跳转到欢迎界面。
获取登陆界面提交的用户名和密码:request.getParameter()方法
welcome.html如下:
代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>欢迎您登陆成功!</h1>
</body>
</html>
login.html
代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>登陆页面</h1>
<form action="http://localhost:8080/chapter04/login" method="get">
用户名:<input type="text" name="username"><br/>
密码: <input type="password" name="psw"/><br/>
<input type="submit" value="登陆"/>
</form>
</body>
</html>
代码语言:javascript复制protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//[1]获取登陆的用户名和密码
String name=request.getParameter("username");
String password=request.getParameter("psw");
//[2]判断用户名和密码是否正确(应该查数据库,这里方便起见先不查数据库)
if(name.equals("admin")&&password.equals("123")) {//表明输入的数据正确
response.sendRedirect("/chapter04/welcome.html");
}else {//登陆失败
response.sendRedirect("/chapter04/login.html");
}
}
重定向的特点: <1>浏览器地址栏发生变化 <2>发送了两次请求,都是由浏览器发送的请求 重定向的路径:由于是浏览器发送的请求,所以路径必须要带项目名称, 比如:/chapter04/welcome.html; 3.HttpServletRequest请求对象 HttpServletRequest它是一个接口,它的父接口ServletRequest,在开发中,常用 的是带协议的请求对象。 请求消息:请求行、请求头、请求参数 <1>获取请求行消息的相关方法: 常用的请求行方法: [1]获取请求提交的方式:getMethod(); [2]获取请求的协议:getProtocol(); [3]获取项目名称:getContentPath(); [4]获取servlet路径:getServletPath(); [5]获取请求路径:getRequestURI(),getRequestURL(); 例如:
代码语言:javascript复制 //1.获取请求方式
String method=request.getMethod();
System.out.println("请求方式:" method);
//2.获取请求的协议
String proto=request.getProtocol();
System.out.println("请求协议:" proto);
//3.获取项目路径
String contextpath=request.getContextPath();
System.out.println("项目路径:" contextpath);
//4.获取servlet路径
String servletpath=request.getServletPath();
System.out.println("servlet路径:" servletpath);
//5.获取请求的路径
String pathURI=request.getRequestURI();
String pathURL=request.getRequestURL().toString();
System.out.println("uri对应的值:" pathURI "url路径对应的值:URL=" pathURL);
uri对应的值:/chapter04/line
url路径对应的值:URL=http://localhost:8080/chapter04/line
<2>获取请求消息头相关的方法: [1]根据消息头获取值:String value=getHeader(消息头的名称) [2]获取所有的消息头:Enumeration er=getHeaderNames(); 例如:
代码语言:javascript复制 //处理响应中文的乱码问题
response.setContentType("text/html;charset=utf-8");
//1.获取所有的消息头名称
Enumeration<String> er=request.getHeaderNames();
//2.遍历
while(er.hasMoreElements()) {
//3.获取消息头
String name=er.nextElement();
//4.获取消息头对应的值
String value=request.getHeader(name);
response.getWriter().print("消息头:" name " " value "<br/>");
}
根据Refer请求消息头,做一个防盗链的案例: (下面图片只用来说明思路)
难点:怎么判断这个发起的下载请求是从别的网站发起的? 解决方法:根据Referer请求头对应的值是否包含了服务器的名称, 如果包含就说明是从本网站下载的,否则就不是.
代码语言:javascript复制//DownLoadServlet.java 这里我只列出了doGet()方法
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//防盗链
//1.获取Refer请求头:referer=http://localhost:8080/chapter04/download
String referer=request.getHeader("Referer");
//2.获取服务器名称:比如说从腾讯发起的请求,服务器对应www.tengxun.com,从快播发送的请求,服务器命名称:www.kuaibo.com
String serverName=request.getServerName();
//3.判断是否是从本网站发起的下载请求
if(referer!=null&&referer.contains(serverName)){
//refer请求头对应的值包含了服务器名称,说明就是从本网站发起的请求,允许下载
response.getWriter().print("download.............");
}else {
//说明不是从本网站发起的请求,不允许下载,可以定向到本网站的下载页面
//从而让用户从本网站的页面开启下载
response.sendRedirect("/chapter04/download.html");
}
}
download.html如下
代码语言:javascript复制<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<a href="/chapter04/download">从这个网站的页面打开,才能下载(下次记住了啊)----自己人
</a>
</body>
</html>
<3>.获取请求参数相关的方法: [1]根据name属性值,获取用户输入的值: String value=getParameter(name属性对应的值); [2]根据name属性值,获取用户选择的值: String[] values=getParameterValues(name属性对应的值); [3]没有参数,获取所有值: Map<String,String[]>map=getParameterMap(); 比如: //1.根据name属性值获取用户输入的值 String username=request.getParameter(“username”); String password=request.getParameter(“password”); //2.获取用户选择的值 String[] hobbys=request.getParameterValues(“hobby”); //response.getWriter().println("username: " username); //response.getWriter().println("password: " password); //response.getWriter().println("hobby: “ Arrays.toString(hobbys)); Map<String,String[]> map=request.getParameterMap(); //遍历map Set set=map.keySet(); for(String key:set) { String[] value=map.get(key); System.out.println(“name属性的值” key ” " Arrays.toString(value)); } <4>.解决请求参数的中文乱码问题 中文乱码处理分两种情况: [1].处理get方式提交的中文乱码 使用的String的构造方法解决的中文乱码:new String(字符数组,编码格式); 代码:
代码语言:javascript复制//1.获取用户名
//request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String value=request.getParameter("username");
String newvalue = URLDecoder.decode(value,"UTF-8");//这个没问题,下面String构造函数出错
// String newvalue=new String(value.getBytes("ISO8859-1"),"utf-8");
response.getWriter().print("处理后的值:" newvalue);
[2].处理post请求的中文乱码问题: post提交会把参数首先提交到request对象的缓冲区中,缓冲区的 默认编码是ISO8859-1,不支持中文 处理方法:把request缓冲区的编码给设置成支持中文的码表格式. 代码: request.setCharacterEncoding(“utf-8”); 例如:
代码语言:javascript复制 //1.获取用户输入的值
//处理请求中文的乱码问题
request.setCharacterEncoding("utf-8");
String value=request.getParameter("username");
System.out.println(value);//控制台若输出中文说明请求中文的乱码已解决
//处理响应中文的乱码问题
response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
out.print(value);//若浏览器打印出中文,说明响应中文乱码已解决
<5>通过request对象传递数据 什么是域对象:在一定的范围内可以存值和取值. request域对象:在一次请求中可以存值和取值 [1]存值:setAttribute(String key,Object obj); [2]取值:Object obj=getAttribute(String key); [3]移除值:removeAttribute(String key);