javaEE为基础的前后端交互

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等字段来使其拥有记忆功能.

  • 22
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值