欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Servlet学习笔记6(request请求对象、response响应对象2)

程序员文章站 2022-05-13 19:06:05
...

1.5 实现网页的定时跳转并刷新

(1)定时跳转:从一个注册页面跳转到登陆界面,输入之前注册的用户名和密码。
  代码如下:
  //[1]定时跳转,需要用到Refresh响应头
  response.setHeader("Refresh", "5;URL=/chapter04/login.html");
(2)定时刷新:在当前页面的地址不发生变化,但是当前页面自己定时刷新,
          页面数据会发生变化。
  代码如下:
  		//[2]定时刷新
	response.setHeader("Refresh", "5");
	response.getWriter().print(new Date());

1.6 实现重定向

实现重定向相关方法:
[1]第一种方式:302和Location配合使用,实现重定向
             //1.设置状态码
	response.setStatus(302);
	//2.设置响应头,完成重定向到登陆界面的操作
	response.setHeader("location","/chapter04/login.html");
[2]第二种方式:sendRedirect("/chapter04/login.html");
   重定向通过登陆案例来完成:
   需求分析:在登陆页面输入用户名和密码,在LoginServlet里面判断用户名
            和密码是否正确。如果输入错误,会重新定向到登陆界面。如果
	正确,跳转到欢迎界面。
获取登陆界面提交的用户名和密码:request.getParameter()方法

welcome.html如下:

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>欢迎您登陆成功!</h1>
</body>
</html>

login.html

<!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>
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();

例如:

  //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();

例如:

  //处理响应中文的乱码问题
		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/>");
		}

<3>根据Refer请求消息头,做一个防盗链的案例:
(下面图片只用来说明思路)
Servlet学习笔记6(request请求对象、response响应对象2)
难点:怎么判断这个发起的下载请求是从别的网站发起的?
解决方法:根据Referer请求头对应的值是否包含了服务器的名称,
如果包含就说明是从本网站下载的,否则就不是.

//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如下

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
   <a href="/chapter04/download">从这个网站的页面打开,才能下载(下次记住了啊)----自己人
   </a>
</body>
</html>
相关标签: Servlet