写给前端的后端:HttpServletResponse和HttpServletRequest的技巧与应用

不懂后端的前端不是好前端。
虽然现在前端发展迅速,甚至有了“自己的”后端(node.js)和服务器(nginx),但是我们的眼光还是不能局限于前端,多看看后端的内容,不说别的,对于ajax的请求与301、302重定向的理解都是有好处的吧。

配置文件.java的基本框架结构:(下文不再赘述,往里添加即可)

import ...;   //一大堆导包
public class 文件名 extends HttpServlet{
	public void doGet(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
		
	}
	public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException{
		//如果使用get(请求),这里一般写:doGet(request,response);
		//有时候post请求也这样转化到get里去
	}
}

1、解决中文输出乱码问题

为什么会有中文乱码: Tomcat默认“欧洲码”——ISO-8859-1
解决思路:转为——utf-8
(比如:HTML中有:<meta charset="utf-8">

HttpServletRequest(请求):
最先想到的应该是这一种:

String ename=new String(获取数据变量.getBytes("iso-8859-1"),"utf-8");

这样很好用,但是其缺点在于:只能对一行,或者说一个变量使用,但是比如你提交的表单数据——登录用户名和密码,总不能用一个变量去接收吧。于是,就有了下面的方法:
对于doPost方法 ,在第一行写上 )

request.setCharacterEncoding("UTF-8");

对于doGet方法 ,在tomcat8.x及以后版本中,默认中文为utf-8格式 )

亦或者,你可以找到Tomcat配置文件 -> conf(文件夹) -> server.xml -> 找到“<Connector ... port="8080" ...>”,在其中最后加上一句:URIEncoding=“utf-8”

HttpServletResponse(响应):
这个就简单多了,只要在输出语句之前加一行代码:

response.setContentType("text/html;charset=utf-8");

即可。

2、实现网页定时刷新——HttpServletResponse(响应)

还是开头的结构,我们用get方式实现:

1、后端配置“定时跳转功能”
在doGet中写入:

response.setHeader("Refresh","2;URL=要跳转去的网址");   //2秒后跳转

然后在web.xml中配置refreshServlet映射即可。

2、后端配置“当前页面自动刷新功能”
同样在doGet里:

response.setHeader("Refresh","3");   //每隔3秒定时刷新当前页面
response.getWriter().println(new java.util.Date());   //输出当前时间

3、实现请求重定向——HttpServletResponse(响应)

比如输入用户名,如果错误,就到某个指定页面,如果正确,就到成功页面,其实这是“固定进行的”。
再比如“网页劫持”,输入网址后,就会自动跳转到某个其他页面。

这都叫“重定向”——也就是业界所说“301”(现在大多数都是301,由于涉及搜索排名和爬虫爬取的问题,302不怎么用了(它不会记住排名和浏览量))

1.html的body里:

<!-- 把表单提交到工程目录下的LoginS -->
<form action="/LoginS" methods="post">
	用户名:<input type="text" name="username" /><br />
	密码:<input type="password" name="password" /><br />
	<input type="submit" value="登录">
</form>

2.html的body里:

欢迎你,登录成功!

工程目录下的LoginS的类(LoginS.java)中的doGet:

String username=request.getParameter("username");
String password=request.getParameter("password");
//假设用户名和密码分别为:it和123
if(("it").equals(username) && ("123").equals(password)){
	response.sendRedirect("/2.html");   //跳到成功页面2.html
}else{
	response.sendRedirect("/1.html");   //重新登陆
}

方法声明:String getParameter(String name) ——该方法用于获取某个指定名称的参数值,如果请求消息中没有包含指定名称的参数,则此方法返回null;如果指定名称的参数存在但没有设置值,则返回一个空串;如果请求消息中包含有多个该指定名称的参数,此方法返回第1个出现的参数值。

4、利用Rederer请求头防止“盗链”——HttpServletRequest(请求)

在实际开发中,经常会使用Referer头字段。例如:一些站点为了基因人气并且提高站点的访问量,会提供各种软件的下载页面,但是他们本身没有资源,只是将下载的超链接指向其它站点上的资源。而真正提供下载资源的这些站点为了防止这种“盗链”现象,就需要检查请求来源——只接受本站发出的下载请求。
同样的,在doGet中:

response.setContentType("text/html;charset=utf-8");
PrintWriter out=response.getWriter();
//获取referer的值
String referer=request.getHeader("referer");
//获取访问地址——指定url部分
String sitePart="http://"+request.getServerName();
//判断referer是否为空,这个头的首地址是否以指定url部分(如:sitePart)开始
if(referer!=null && referer.startsWith(sitePart)){
	out.println("dealing download......");
}else{
	//非法下载请求套转到downl.html页面
	RequestDispatcher rd=request.getRequestDispatcher('/downl.html');
	rd.forword(request,response);
}

在项目目录下编写一个downl.html文件,在body下写:

<a href="上面.java文件的文件名(不加“.java”——规矩)">download</a>

当然,我们也可以写成“过滤器”的形式:
A页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>A页面</title>
</head>
<body>
	<img alt="" width="200px" src="imgs/log1.png">
</body>
</html>

B页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>B页面</title>
</head>
<body>
	<img alt="" width="200px" src="http://127.0.0.1:8080/Http/imgs/log1.png">
</body>
</html>

拦截器

public class ReferFilter implements Filter{
	public void init(FilterConfig filterConfig) throws ServletException{
	}
	public void doFilter(ServletRequest request,ServletResponse response,FilterChain chain) throws IOException,ServletException{
		HttpServletRequest req=(HttpServletRequest)request;
		HttpServletReponse res=(HttpServletResponse)reponse;
		//获取每次的请求来源
		String referer=req.getHeader("referer");
		//判断referer是否为空,而且这个头的首地址是否以指定url部分开始
		if(referer == null || !referer.contains("http://127.0.0.1:8080/Http/A.jsp")){
			//如果为空,或者不是从指定url过来的请求——就“重定向”到错误页面!
			req.getRequestDispatcher("/img/error.png").forward(req,res);
			return;
		}
		chain.doFilter(req,res);
	}
	public void destory(){
	}
}

然后去配置信息:

<filter>
	<filter-name>RefererFilter</filter-name>
	<filter-class>zzuli.edu.cn.RefererFilter</filter-class>
</filter>
<filter-mapping>
	<filter-name>RefererFilter</filter-name>
	<url-pattern>/imgs/*</url-pattern>
</filter-mapping>

5、利用请求头开发多端应用—— 综合应用

所谓“ 多端应用 ”,就是:在PC和移动端不一样的页面。
这个需要利用到请求头 Header 中的 User-Agent 字段。(请求的机型)

还是在doGet中:

String userAgent=request.getHeader("User-Agent");   //发送过去的数据——属于“请求”的范围——服务器响应它,做出相应改变
response.setContentType("text/html;charset=utf-8");
String output="";
if(userAgent.indexOf("Window NT")!==-1){
	output="<h1>这是PC端</h1>";
}else if(userAgent.indexOf("iPhone")!==-1 || userAgent.indexOf("Android")!==-1){
	output="<h1>这是移动端</h1>";
}
response.getWriter().println(output);   //“写”到页面上

这段代码中的“output=”那两行,在实际项目中,都是换成具体“重定向”的页面,展示在用户面前。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恪愚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值