当前位置:   article > 正文

写一个简单的管理系统(前端:Vue-cli, 后端Jdbc连接mysql数据库,项目部署tomcat)_jdbc的大作业前端后端联动能不能不用tomcat

jdbc的大作业前端后端联动能不能不用tomcat

一.前端

1.登陆组件

 2.管理组件

 3.异步请求发送后端,验证账号跟密码

首先使用axios来发送, 因为原生态的ajax代码繁琐

<1>首先要引入axios.js文件或者安装axios的脚手架

    npm install axios
这里就引入axios.js的组件来使用axios发送请求

<2>下载完成后, 在main.js里面配置axios全局配置

 <3>导入后就能直接用axios语法来发送请求

发送get请求

  1. this.$http.get("http://localhost:8080/webBack_5.14/login?account=jwq&password=111").then(function(resp){
  2. //业务逻辑代码
  3. })

发送post请求

  1. this.$http.get("http://localhost:8080/webBack_5.14/login?account=jwq&password=111").then(function(resp){
  2. //业务逻辑代码
  3. })

4.异步请求发送后端 数据转化json

由于json是一种轻量级的数据格式, 所以前后端传输数据时候, 经常用json格式来传输

在前端可以写一个方法来转化数据格式:

请求里做参数转json格式,直接发送json的请求

 

5.防止通过浏览器地址恶意访问

如果仅仅是通过登录框验证密码还是不够安全, 还可以通过URL地址来直接进行访问, 就会跳过登录的页面。

 

所以要将一个验证信息放到浏览器里—>(sessionStorage)

sessionStorage

他是浏览器里可以存储数据的容器, 在关闭浏览器时就会清除

因此将用户信息存储到sessionStorage(会话储存) 里 , 在进入具体操作的网页网页时候可以先进行判断, 如果有会话存储里有账号, 那么就可以进行访问, 不然那就回到登录的页面, 这样验证就更加符合需求,

而且此时的sessionStorage还可以将登录人的信息, 账号放到页面上显示, 就好像京东这些购物软件, 将用户人的登录信息展示到我的这一页面,就可以将操作人的信息放到sessionStorage里面, 随后在哪个页面想要获取渲染在前端时, 就可以随时获取, 非常方便

登陆账号的id会显示到右上角 

 

 具体操作

<1>放入account

<2>添加web会话跟踪技术 

这是在router对象的那个index.js文件里配置

 提高安全性(session不安全), 使用token来验证

session缺点

浏览器里的数据时可以随时改的, 就会让一些不法分子走漏洞, 所以在前端验证并不是万全之策
用户认证之后,服务端做认证记录,如果认证的记录被保存在内存
中的话,这意味着用户下次请求还必须要请求在这台服务器上,这样才能拿到授权的资源,这样在分布式的应用上,相应的限制了负载均衡器的能力。
因此要引入另一种安全的高效的验证操作, token 验证方式.

具体操作

首先在登录成功之后, 要在后端生成token, 再将token连随响应数据一并发送给前端, 前端得到token之后, 在接下来的每一次发送请求都会将token携带到请求里, 到后端来验证token是否正确, 正确就继续执行操作, 不正确就要返回 token不对的异常信息.

生成token

首先导入包

由JWT的方式生成token   点击去看JWT

JWT工具类

  1. package com.ffyc.webback.util;
  2. import com.auth0.jwt.JWT;
  3. import com.auth0.jwt.JWTVerifier;
  4. import com.auth0.jwt.algorithms.Algorithm;
  5. import com.auth0.jwt.interfaces.DecodedJWT;
  6. import com.ffyc.webback.dao.Admin;
  7. import java.util.Date;
  8. import java.util.HashMap;
  9. import java.util.Map;
  10. /**
  11. * JWT工具类
  12. */
  13. public class JWTUtil {
  14. /**
  15. * 根据用户id,账号生成token
  16. * @param
  17. * @return
  18. */
  19. public static String getToken(Admin admin) {
  20. String token = "";
  21. try {
  22. //过期时间 为1970.1.1 0:0:0 至 过期时间 当前的毫秒值 + 有效时间
  23. Date expireDate = new Date(new Date().getTime() + 10*1000);
  24. //秘钥及加密算法
  25. Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
  26. //设置头部信息
  27. Map<String,Object> header = new HashMap<>();
  28. header.put("typ","JWT");
  29. header.put("alg","HS256");
  30. //携带id,账号信息,生成签名
  31. token = JWT.create()
  32. .withHeader(header)
  33. .withClaim("id",admin.getId())
  34. .withClaim("account",admin.getAccount())
  35. .withExpiresAt(expireDate)
  36. .sign(algorithm);
  37. }catch (Exception e){
  38. e.printStackTrace();
  39. return null;
  40. }
  41. return token;
  42. }
  43. /**
  44. * 验证token是否有效
  45. * @param token
  46. * @return
  47. */
  48. public static boolean verify(String token){
  49. try {
  50. //验签
  51. Algorithm algorithm = Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE");
  52. JWTVerifier verifier = JWT.require(algorithm).build();
  53. DecodedJWT jwt = verifier.verify(token);
  54. return true;
  55. } catch (Exception e) {//当传过来的token如果有问题,抛出异常
  56. return false;
  57. }
  58. }
  59. /**
  60. * 获得token 中playload部分数据,按需使用
  61. * @param token
  62. * @return
  63. */
  64. public static DecodedJWT getTokenInfo(String token){
  65. return JWT.require(Algorithm.HMAC256("ZCEQIUBFKSJBFJH2020BQWE")).build().verify(token);
  66. }
  67. }

将token信息封装到admin对象里, 一并返回前端

  1. package com.ffyc.webback.dao;
  2. public class Admin {
  3. private int id;
  4. private String password;
  5. private String account;
  6. private String token;
  7. public String getToken() {
  8. return token;
  9. }
  10. public void setToken(String token) {
  11. this.token = token;
  12. }
  13. public int getId() {
  14. return id;
  15. }
  16. public void setId(int id) {
  17. this.id = id;
  18. }
  19. public String getPassword() {
  20. return password;
  21. }
  22. public void setPassword(String password) {
  23. this.password = password;
  24. }
  25. public String getAccount() {
  26. return account;
  27. }
  28. public void setAccount(String account) {
  29. this.account = account;
  30. }
  31. }

前端将信息放入浏览器的会话存储里

 请求发送时,后端验证token

<1>配置过滤器 (除了登录都要走这个过滤器)

我们可以通过给走这个过滤器的请求添加一层级的路径, 具体如下图

 

 这样就可以区分经过验证token过滤器与不验证token过滤器的请求了, 不验证就直接写请求地址, 验证就加上一层级的/token.

添加请求拦截器

这是在每次请求时,将token放在请求的请求头区域里, 到后端浏览器调用

响应拦截器 

在前端处理后端响应回来的状态码时, 每一个组件对相同部分状态码总是同一个业务流程, 如: 500 状态码时候, 就会弹出服务器异常的信息, 那这样会繁琐很多, 使得代码冗余。

在每次接收响应时, 可以根据状态码来做统一给用户做出响应结果, 可以将那些状态码放入响应拦截器里

 二.后端搭建

1. 项目构建

后端结构: 如下

 2.连接数据库

<1.>登陆账号判断

  1. package com.ffyc.webback.dao;
  2. import java.sql.*;
  3. public class LoginDao{
  4. public Admin login(String account, String password) throws ClassNotFoundException, SQLException {
  5. Connection connection = null;
  6. PreparedStatement ps =null;
  7. Admin admin= null;
  8. try{
  9. Class.forName("com.mysql.cj.jdbc.Driver");//动态加载Driver
  10. String url = "jdbc:mysql://127.0.0.1:3306/webdb?serverTimezone=Asia/Shanghai";
  11. String uname = "root";
  12. String pwd = "root";
  13. connection = DriverManager.getConnection(url,uname,pwd);
  14. ps = connection.prepareStatement("SELECT id,account FROM admins WHERE account = ? AND PASSWORD = ?");
  15. ps.setObject(1,account);
  16. ps.setObject(2,password);
  17. ResultSet rs = ps.executeQuery();
  18. while (rs.next()){
  19. admin = new Admin();
  20. admin.setId(rs.getInt("id"));
  21. admin.setAccount(rs.getString("account"));
  22. }
  23. }finally {
  24. if(connection !=null){
  25. connection.close();
  26. }
  27. if (ps != null){
  28. ps.close();
  29. }
  30. }
  31. return admin;
  32. }
  33. }

<2>业务处理层

  1. public class LoginServlet extends HttpServlet {
  2. @Override
  3. public void service(ServletRequest req, ServletResponse resp) throws ServletException, IOException {
  4. String account = req.getParameter("account");
  5. String password = req.getParameter("password");
  6. CommonRes commonRes = null;
  7. try{
  8. LoginDao loginDao = new LoginDao();
  9. Admin admin = loginDao.checkAccount(account, password);
  10. System.out.println(admin);
  11. if (admin!=null){
  12. //生成token
  13. String token = JWTUtil.token(admin);
  14. admin.setToken(token);
  15. commonRes = new CommonRes(200,admin,"登录成功");
  16. }else{
  17. commonRes = new CommonRes(201,"账号或密码错误");
  18. }
  19. }catch(Exception e){
  20. e.printStackTrace();
  21. commonRes = new CommonRes(500,"服务器异常");
  22. }
  23. //将common结果转化成jason格式返回
  24. resp.setContentType("text/html;charset=UTF-8");
  25. Writer writer = resp.getWriter();
  26. ObjectMapper mapper = new ObjectMapper();
  27. String jsonstr = mapper.writeValueAsString(commonRes);
  28. writer.write(jsonstr);
  29. }

3. 解决前后端编码不一致的问题问题

所以在获取参数之前,要对请求 设置编码
request.setContetnType("text/html;charset=utf-8");, 在请求头设置编码
同理, 后端服务器给前端做出响应的时候也应该设置响应编码, 否则会出现前端接收响应时, 响应的是乱码问题
response.setContetnType("text/html;charset=utf-8")


4.跨域问题

跨域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。但是一般情况下不能这么做,它是由浏览器的同源策略造成

由此我们可以写过一个过滤器来实现

  1. package com.ffyc.webback.filter;
  2. import javax.servlet.*;
  3. import javax.servlet.annotation.WebFilter;
  4. import javax.servlet.http.HttpServletRequest;
  5. import javax.servlet.http.HttpServletResponse;
  6. import java.io.IOException;
  7. public class CorsFilter implements Filter {
  8. public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  9. HttpServletResponse httpResponse = (HttpServletResponse) servletResponse;
  10. HttpServletRequest httpRequest = (HttpServletRequest) servletRequest;
  11. //允许携带Cookie时不能设置为* 否则前端报错
  12. httpResponse.setHeader("Access-Control-Allow-Origin", httpRequest.getHeader("origin"));//允许所有请求跨域
  13. httpResponse.setHeader("Access-Control-Allow-Methods", "*");//允许跨域的请求方法GET, POST, HEAD 等
  14. httpResponse.setHeader("Access-Control-Allow-Headers", "*");//允许跨域的请求头
  15. httpResponse.setHeader("Access-Control-Allow-Credentials", "true");//是否携带cookie
  16. filterChain.doFilter(servletRequest, servletResponse);
  17. }
  18. }

然后在web.xml里面配置过滤器

6. 后端对返回结果进行封装

由于每次对后端结果进行返回时候,只能一个一个返回, 所以此时可以封装一个返回的结果集

commonRes

  1. public class CommonResult {
  2. private int code;
  3. private Object data;
  4. private String message;
  5. public CommonResult(int code, Object data, String message) {
  6. this.code = code;
  7. this.data = data;
  8. this.message = message;
  9. }
  10. public CommonResult(int code, String message) {
  11. this.code = code;
  12. this.message = message;
  13. }
  14. public int getCode() {
  15. return code;
  16. }
  17. public void setCode(int code) {
  18. this.code = code;
  19. }
  20. public Object getData() {
  21. return data;
  22. }
  23. public void setData(Object data) {
  24. this.data = data;
  25. }
  26. public String getMessage() {
  27. return message;
  28. }
  29. public void setMessage(String message) {
  30. this.message = message;
  31. }
  32. }

7. 后端对返回结果进行转化json格式后进行响应

<1>首先要导入jar包

 <2>在使用mapper对象里的writeValuesAsString()对响应结果进行json格式的处理

  1. Writer writer = resp.getWriter();
  2. ObjectMapper mapper = new ObjectMapper();
  3. //commonRes这是上面说的返回结果集对象,放入mapper对象的
  4. //方法里,转json格式
  5. String jsonstr = mapper.writeValueAsString(commonRes);
  6. writer.write(jsonstr);

<3>json响应结果查看

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/547417
推荐阅读
相关标签
  

闽ICP备14008679号