1.服务器的创建
关于服务器的创建,我们可以通过后端来实现.
首先我们需要在编译器中创建一个javaEE项目,之后在该项目中创建一个类并且该类继承于HttpServlet.关于HttpServlet这一类,我们做如下解释:
HttpServlet抽象类
该类是一个抽象类,其中包含初始化方法(init),程序终止方法(destory)等等,还有最关键的两个与前端交互的方法dopost()和doget(),其中如何得到前端数据,如何将数据传回前端,取决于前端.
Web.xml的配置
当我们创建完该类并且将交互方法进行重写后,开始在web.xml中配置servlet,用于存储和传输数据.我们可以通过如下代码进行配置
<servlet>
<servlet-name>dromServer</servlet-name><!--为servlet对象定义名称-->
<!--配置servlet类名,服务器启动时会创建此类的对象,只创建一次-->
<servlet-class>com.ffyc.dromServer.web.LoginServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!--为servlet配置访问地址-->
<servlet-mapping>
<servlet-name>dromServer</servlet-name>
<url-pattern>/login</url-pattern><!--前端访问地址,必须以'/'开头-->
</servlet-mapping>
其中servlet-name的参数是你创建的javaee项目的名字,而servlet-class是你在该项目中前后端数据交互的类的地址.之后servlet-mapping为前后端交互配置,其中url-pattern是前端访问地址
Tomcat的配置
当我们将上述操作配置成功后,我们开始着手配置服务器的启动项,我们服务器通过Tomcat环境来启动,首先如果我们要使用Tomcat,我们得先下载Tomcat,之后我们在项目中配置Tomcat
将Tomcat配置成功后我们就完成了服务器的初步创建
2.前后端信息的传递
在后端中的Servlet中,我们通过HttpServletRequest类所创建的对象中的getParameter("前端中变量的名称")从而来获得前端中的数据.我们还可以通过HttpServletReponse类所创建的对象中的getWriter()方法来获取PrintWriter对象,但在这之前,我们要明白java后端和前端所用的语言是不同的,所以我们要引进二者共用的语言json.
json在xml中的配置
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.14.2</version>
</dependency>
在此配置后就可以进行数据的互通.
3.过滤器
过滤器就是指在前端向后端传输数据的时候,会先通过过滤器之后再到达后端,相当于是一个中转站,再次中转站中,我们可以进行汉字的编码使用,也可以通过过滤器进行跨域的操作,通过上述操作,我们就大大减少了代码的冗余性,也增强了代码的可读性.那么什么是跨域呢,我们展开谈谈.
跨域问题
什么是跨域:跨域就是一个url请求中的协议,域名和端口其中任一一个与当前页面的url不一致时,便称之为跨域.通俗理解就是浏览器当前页面不能够插手其他页面的事情,如果你要实现服务器向前端页面传回数据,由于域的不同,就产生了跨域问题,关于跨域问题我们通过一个过滤器来进行跨域操作.
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebFilter(urlPatterns = "/*")
public class CorsFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("跨域过滤器");
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
HttpServletResponse httpServletResponse = (HttpServletResponse) servletResponse;
//允许携带Cooike时不能设置为* 否则前端报错
httpServletResponse.setHeader("Access-Control-Allow-Origin",httpServletRequest.getHeader("origin")); //允许所有请求跨域\
httpServletResponse.setHeader("Access-Control-Allow-Methods","*"); //允许跨域的方式为GET,POST,HEAD等等
httpServletResponse.setHeader("Access-Control-Allow-Headers","*"); //允许跨域的请求头
httpServletResponse.setHeader("Access-Control-Allow-Credentials","true"); //是否携带cookie
filterChain.doFilter(servletRequest,servletResponse);
}
}
4.标准化数据格式
由于我们从后端到前端的过程中数据具有多样化,无法在前端中使用前端的方法进行判断数据的传输,所以我们通过定义一个result类来定义传输代码code,前端提示desc和该对象result.我们可以在前端中通过后端传回的code数据为200来判断是否成功传输过来,也可以通过desc来进行后端对前端的提醒,最后通过result中存储的所需数据来供前端的使用.
5.Web会话跟踪
什么时web的会话跟踪,由于我们申请的http请求是无状态的,所以当用户发出请求时,服务器才会做出响应,当用户想在同一个网站的不同页面进行跳转的时候,就无法确定是否是同一个用户,所以就产生了Web会话跟踪,那么如何进行Web会话跟踪呢,我们可以通过给每一个客户定义一个token专属令牌来区分客户的身份.那么什么时token令牌呢
token令牌
token是由服务端生成的一串字符串,当进行第一次登陆后,服务器便会给该用户生成一个token字符串,之后当该用户访问客户端时只需带上这个token字符串比那可以进行用户的区分,保证了数据的安全性.
如何在后端生成token
我们可以通过一个工具类JWT来实现:
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.ffyc.dromServer.model.Admin;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
/**
* JWT工具类
*/
public class JWTUtil {
/**
* 根据用户id,账号生成token
* @param u
* @return
*/
public static String getToken(Admin u) {
String token = "";
try {
//过期时间 为1970.1.1 0:0:0 至 过期时间 当前的毫秒值 + 有效时间
Date expireDate = new Date(new Date().getTime() + 10*1000);
//秘钥及加密算法
Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
//设置头部信息
Map<String,Object> header = new HashMap<>();
header.put("typ","JWT");
header.put("alg","HS256");
//携带id,账号信息,生成签名
token = JWT.create()
.withHeader(header)
.withClaim("id",u.getId())
.withClaim("account",u.getAccount())
.withExpiresAt(expireDate)
.sign(algorithm);
}catch (Exception e){
e.printStackTrace();
return null;
}
return token;
}
/**
* 验证token是否有效
* @param token
* @return
*/
public static boolean verify(String token){
try {
//验签
Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
JWTVerifier verifier = JWT.require(algorithm).build();
DecodedJWT jwt = verifier.verify(token);
return true;
} catch (Exception e) {//当传过来的token如果有问题,抛出异常
return false;
}
}
/**
* 获得token 中playload部分数据,按需使用
* @param token
* @return
*/
public static DecodedJWT getTokenInfo(String token){
return JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);
}
}
通过在Servlet类中调用该工具类的对象从而获得一个token码,并将其存入到浏览器中供网页鉴别,那么为什么我们每次重新打开网页都要再前端中存入数据呢?这时候就要解释一下我们的http无状态了.
http无状态
http无状态指的是以http协议开头的网页不具备记忆功能,但是我们可以通过cooike等字段来使其拥有记忆功能.