不懂后端的前端不是好前端。
虽然现在前端发展迅速,甚至有了“自己的”后端(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=”那两行,在实际项目中,都是换成具体“重定向”的页面,展示在用户面前。