2024-08-08

以下是一个简化的示例,展示了如何在使用SSM框架结合ajax和JWT实现登录时获取token的过程:

  1. 用户发送登录请求到服务器,服务器验证通过后,生成JWT token。
  2. 服务器将token作为响应返回给客户端。
  3. 客户端将token存储起来,例如在localStorage或sessionStorage中。
  4. 客户端后续的请求都会包含这个token,以证明身份。

后端代码(Spring MVC + JWT):




// 登录接口
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
    // 验证用户凭证
    User user = userService.authenticate(loginRequest.getUsername(), loginRequest.getPassword());
    if (user == null) {
        return new ResponseEntity<>("登录失败", HttpStatus.UNAUTHORIZED);
    }
    // 生成token
    String token = Jwts.builder()
            .setSubject(user.getUsername())
            .setExpiration(new Date(System.currentTimeMillis() + 864000000))
            .signWith(SignatureAlgorithm.HS512, "YourSecretKey")
            .compact();
    
    // 返回生成的token
    return ResponseEntity.ok(new AuthResponse(token));
}
 
// 其他受保护的接口
@GetMapping("/protected")
public ResponseEntity<?> protectedResource(@RequestHeader("Authorization") String token) {
    // 验证token
    Claims claims = Jwts.parser()
            .setSigningKey("YourSecretKey")
            .parseClaimsJws(token.replace("Bearer", ""))
            .getBody();
    
    String username = claims.getSubject();
    if (username != null) {
        // 根据username获取用户权限
        List<String> permissions = userService.getUserPermissions(username);
        return ResponseEntity.ok(new UserPermissionsResponse(permissions));
    }
    return new ResponseEntity<>("Token not valid", HttpStatus.UNAUTHORIZED);
}

前端代码(JavaScript + jQuery + ajax):




$(document).ready(function() {
    $('#loginForm').submit(function(e) {
        e.preventDefault();
        var loginData = {
            username: $('#username').val(),
            password: $('#password').val()
        };
        
        $.ajax({
            url: '/login',
            type: 'POST',
            contentType: 'application/json',
            data: JSON.stringify(loginData),
            success: function(response) {
                // 登录成功后保存token
                localStorage.setItem('token', 'Bearer ' + response.token);
                // 跳转到主页或其他页面
                window.location.href = '/';
            },
            error: funct
2024-08-08

XMLHttpRequest 对象用于与服务器交换数据,也就是我们常说的AJAX通信。

以下是创建和使用 XMLHttpRequest 对象的基本步骤:

  1. 创建 XMLHttpRequest 对象
  2. 设置请求参数
  3. 发送请求
  4. 处理服务器响应

以下是一个使用 XMLHttpRequest 对象发送 GET 请求的示例:




// 创建 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
 
// 设置请求参数
var method = 'GET';
var url = 'your-endpoint-url';
 
// 发送请求
xhr.open(method, url, true);
xhr.send();
 
// 处理服务器响应
xhr.onreadystatechange = function () {
  if (xhr.readyState === 4 && xhr.status === 200) {
    // 请求成功,处理响应数据
    var response = xhr.responseText;
    console.log(response);
  } else {
    // 请求未完成或请求失败
    console.log('Status: ' + xhr.status);
    console.log('Body: ' + xhr.responseText);
  }
};

以上代码创建了一个 XMLHttpRequest 对象,设置了请求方法为 GET 和请求的 URL,然后发送请求。当请求状态改变时,它会检查 readyState 是否为 4(请求已完成)和 HTTP 状态码是否为 200(OK,请求成功),如果是,则处理服务器响应的数据。如果请求未完成或请求失败,它会输出状态和响应体。

2024-08-08

在AJAX中,我们通常需要处理几个常见的问题,包括跨域请求问题、缓存问题、数据类型问题、超时问题等。以下是针对这些问题的解决方案和示例代码。

  1. 处理跨域请求问题

    解决方案:使用JSONP或CORS。

    示例代码:

    
    
    
    // 使用JSONP
    $.ajax({
        url: 'http://example.com/api',
        dataType: 'jsonp',
        success: function(data) {
            console.log(data);
        }
    });
     
    // 使用CORS
    // 服务器端需要设置允许跨域资源共享
  2. 处理缓存问题

    解决方案:在URL后添加一个唯一的查询参数,防止缓存。

    示例代码:

    
    
    
    $.ajax({
        url: 'http://example.com/api',
        data: {
            _: new Date().getTime() // 添加当前时间戳防止缓存
        },
        success: function(data) {
            console.log(data);
        }
    });
  3. 处理数据类型问题

    解决方案:指定正确的dataType

    示例代码:

    
    
    
    $.ajax({
        url: 'http://example.com/api',
        dataType: 'json', // 指定返回数据为JSON
        success: function(data) {
            console.log(data);
        }
    });
  4. 处理超时问题

    解决方案:设置合理的超时时间。

    示例代码:

    
    
    
    $.ajax({
        url: 'http://example.com/api',
        timeout: 30000, // 设置超时时间为30秒
        success: function(data) {
            console.log(data);
        },
        error: function(xhr, textStatus, errorThrown) {
            if (textStatus == 'timeout') {
                console.log('请求超时');
            }
        }
    });

这些示例展示了如何处理AJAX请求中常见的问题。在实际开发中,根据具体需求选择合适的方法和参数设置。

2024-08-08

在JavaWeb中,可以使用AJAX(Asynchronous JavaScript and XML)来发送异步请求。以下是一个简单的例子,展示了如何使用JavaScript发送异步GET请求:

HTML部分:




<!DOCTYPE html>
<html>
<head>
    <title>AJAX Example</title>
    <script>
        function sendAjaxGetRequest() {
            var xhr = new XMLHttpRequest(); // 创建一个新的XMLHttpRequest对象
            xhr.onreadystatechange = function() { // 当readyState改变时触发
                if (xhr.readyState === 4 && xhr.status === 200) { // 请求完成并且成功
                    document.getElementById("result").innerHTML = xhr.responseText; // 更新页面内容
                }
            };
            xhr.open("GET", "servletURL", true); // 初始化请求:URL,方法,异步
            xhr.send(); // 发送请求
        }
    </script>
</head>
<body>
 
<button onclick="sendAjaxGetRequest()">Send AJAX GET Request</button>
<div id="result"></div>
 
</body>
</html>

Java Servlet部分(ServletURL.java):




import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
 
public class ServletURL extends HttpServlet {
    public void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
            
            response.setContentType("text/plain");
            PrintWriter out = response.getWriter();
            out.print("Hello, World!"); // 响应内容
            out.flush();
    }
}

在这个例子中,当用户点击按钮时,JavaScript会通过AJAX异步发送一个GET请求到指定的Servlet URL。Servlet处理完请求后,会返回一个文本响应。当响应就绪时,JavaScript会更新页面中id为"result"的元素的内容。

2024-08-08

以下是一个简化的Spring Security登录功能的示例,使用Vue.js, Element UI和axios实现前后端分离。

后端(Spring Boot):




@RestController
@RequestMapping("/api/auth")
public class AuthController {
 
    @Autowired
    private AuthenticationManager authenticationManager;
 
    @PostMapping("/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
        try {
            Authentication authentication = authenticationManager.authenticate(
                new UsernamePasswordAuthenticationToken(loginRequest.getUsername(), loginRequest.getPassword())
            );
            SecurityContextHolder.getContext().setAuthentication(authentication);
            return ResponseEntity.ok("Login successful");
        } catch (AuthenticationException e) {
            return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");
        }
    }
}
 
public class LoginRequest {
    private String username;
    private String password;
 
    // Getters and Setters
}

前端(Vue.js):




<template>
  <el-form ref="loginForm" :model="loginForm" label-width="120px">
    <el-form-item label="Username">
      <el-input v-model="loginForm.username" name="username"></el-input>
    </el-form-item>
    <el-form-item label="Password">
      <el-input type="password" v-model="loginForm.password" name="password"></el-input>
    </el-form-item>
    <el-form-item>
      <el-button type="primary" @click="login">Login</el-button>
    </el-form-item>
  </el-form>
</template>
 
<script>
import axios from 'axios';
 
export default {
  data() {
    return {
      loginForm: {
        username: '',
        password: ''
      }
    };
  },
  methods: {
    login() {
      axios.post('/api/auth/login', this.loginForm)
        .then(response => {
          console.log(response.data);
          // 登录成功后的处理逻辑,例如保存JWT
        })
        .catch(error => {
          console.error('Login failed', error.response.data);
          // 登录失败后的处理逻辑
        });
    }
  }
};
</script>

确保你的Spring Security配置正确,并且Vue.js项目已经配置了axios以发送HTTP请求。这个例子只是一个简单的展示如何实现登录功能的参考,你需要根据自己的项目需求进行相应的安全配置和错误处理。

2024-08-08

为了使用Ajax与MySQL进行数据的增删改查,你需要一个服务器端语言来处理Ajax请求并与MySQL数据库交互。以下是使用PHP作为服务器端语言的示例代码。

首先,确保你的服务器配置正确,并且可以使用PHP脚本。

以下是PHP脚本示例,用于处理Ajax请求并与MySQL数据库交互:




<?php
$mysqli = new mysqli("localhost", "username", "password", "database");
 
// 检查连接
if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
}
 
// 根据请求类型执行操作
switch($_GET['action']) {
    case 'get':
        // 执行获取数据的查询
        $result = $mysqli->query("SELECT * FROM table_name");
        $data = [];
        while($row = $result->fetch_assoc()) {
            $data[] = $row;
        }
        echo json_encode($data);
        break;
        
    case 'add':
        // 执行添加数据的操作
        $name = $mysqli->real_escape_string($_GET['name']);
        $mysqli->query("INSERT INTO table_name (name) VALUES ('$name')");
        echo "Record added";
        break;
        
    case 'edit':
        // 执行编辑数据的操作
        $id = $mysqli->real_escape_string($_GET['id']);
        $name = $mysqli->real_escape_string($_GET['name']);
        $mysqli->query("UPDATE table_name SET name='$name' WHERE id='$id'");
        echo "Record updated";
        break;
        
    case 'delete':
        // 执行删除数据的操作
        $id = $mysqli->real_escape_string($_GET['id']);
        $mysqli->query("DELETE FROM table_name WHERE id='$id'");
        echo "Record deleted";
        break;
}
 
$mysqli->close();
?>

以下是Ajax请求的示例代码:




// 获取数据
$.ajax({
    url: 'your_php_script.php?action=get',
    type: 'get',
    dataType: 'json',
    success: function(data) {
        // 处理获取到的数据
        console.log(data);
    }
});
 
// 添加数据
$.ajax({
    url: 'your_php_script.php?action=add&name=JohnDoe',
    type: 'get',
    success: function(response) {
        // 处理响应
        console.log(response);
    }
});
 
// 编辑数据
$.ajax({
    url: 'your_php_script.php?action=edit&id=1&name=JohnDoe',
    type: 'get',
    success: function(response) {
        // 处理响应
        console.log(response);
    }
});
 
// 删除数据
$.ajax({
    url: 'your_php_script.php?action=delete&id=1',
    type: 'get',
    success: function(response) {
        // 处理响应
        console.log
2024-08-08

以下是一个使用PHP、jQuery和Ajax实现的简单示例,用于批量上传图片文件,并显示进度条。

HTML 部分:




<form id="uploadForm" enctype="multipart/form-data">
    <input type="file" name="images[]" multiple>
    <button type="submit">上传</button>
</form>
<div id="progress">
    <!-- 进度条将被添加到这里 -->
</div>
 
<script src="https://code.jquery.com/jquery-3.5.1.min.js"></script>

JavaScript 部分 (jQuery):




$(document).ready(function (e) {
    $('#uploadForm').ajaxForm({
        beforeSend: function() {
            $('#progress').html('<div class="progress"><div class="progress-bar progress-bar-striped active" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="100" style="width: 0%"></div></div>');
        },
        uploadProgress: function(event, position, total, percentComplete) {
            var width = percentComplete + '%'; // 计算进度条的宽度
            $('.progress-bar').width(width).attr('aria-valuenow', percentComplete);
        },
        success: function() {
            // 成功上传后的回调函数
            alert('图片上传成功!');
        },
        error: function() {
            // 上传失败的回调函数
            alert('图片上传失败!');
        }
    });
});

PHP 部分 (upload.php):




<?php
if ($_FILES) {
    $total = count($_FILES['images']['name']); // 获取文件数量
 
    for ($i = 0; $i < $total; $i++) {
        $tmpFilePath = $_FILES['images']['tmp_name'][$i];
        if ($tmpFilePath != ""){
            // 设置文件名和路径
            $newFilePath = "uploads/" . $_FILES['images']['name'][$i];
 
            // 上传文件
            if (move_uploaded_file($tmpFilePath, $newFilePath)) {
                // 文件上传成功
            } else {
                // 文件上传失败
            }
        }
    }
    echo "上传成功";
} else {
    echo "没有文件上传";
}
?>

确保服务器配置允许文件上传,并设置了适当的 upload_max_filesizepost_max_size 值。

以上代码实现了基本的文件批量上传功能,并在上传过程中显示了进度条。实际应用时,你可能需要添加更多的错误处理、安全性检查和用户体验改进。

2024-08-08

JavaWeb综合案例通常是一个包含多个模块的大型项目,涉及到多个技术栈和框架,如Spring、Spring MVC、MyBatis、Redis、ActiveMQ等。具体项目会根据不同的版本和教学内容有所差异。

以下是一个简化的电商平台项目的核心代码示例:

商品模块(ProductService.java)




@Service
public class ProductService {
    @Autowired
    private ProductMapper productMapper;
 
    public List<Product> getAllProducts() {
        return productMapper.selectAll();
    }
 
    public Product getProductById(int id) {
        return productMapper.selectByPrimaryKey(id);
    }
 
    // 其他商品相关业务逻辑
}

订单模块(OrderService.java)




@Service
public class OrderService {
    @Autowired
    private OrderMapper orderMapper;
 
    public Order createOrder(Order order) {
        orderMapper.insert(order);
        return order;
    }
 
    // 其他订单相关业务逻辑
}

控制器(ProductController.java)




@Controller
@RequestMapping("/product")
public class ProductController {
    @Autowired
    private ProductService productService;
 
    @RequestMapping(value = "/list", method = RequestMethod.GET)
    public String getProductList(Model model) {
        List<Product> products = productService.getAllProducts();
        model.addAttribute("products", products);
        return "productList";
    }
 
    // 其他控制器方法
}

这些代码片段展示了如何使用Spring框架和MyBatis框架来实现服务层和控制层的逻辑。具体的实现细节会根据项目需求和教学内容有所不同。

2024-08-08



// 简单的Ajax函数封装
function ajax(url, method, data, callback) {
  var xhr = new XMLHttpRequest();
  xhr.open(method, url, true);
  xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
      callback(xhr.responseText);
    }
  };
  if (method === 'POST') {
    xhr.setRequestHeader('Content-type', 'application/x-www-form-urlencoded');
  }
  xhr.send(data);
}
 
// 使用封装后的ajax函数
var url = 'https://api.example.com/data';
var method = 'GET'; // 或者 'POST'
var data = 'key1=value1&key2=value2'; // POST请求时使用
 
ajax(url, method, data, function(response) {
  console.log('收到服务器响应:', response);
});

这段代码定义了一个ajax函数,它接受urlmethoddatacallback作为参数,并执行HTTP请求。使用时,只需调用ajax函数并提供必要的参数即可。这是一个非常基础的Ajax函数封装示例,适合作为学习如何使用XMLHttpRequest对象进行网络通信的起点。

2024-08-08

Ajax(Asynchronous JavaScript and XML)是一种创建交互式网页的技术,可以使网页的更新不需要重新加载整个页面。

以下是使用原生JavaScript创建一个简单的Ajax请求的示例:




// 创建一个新的 XMLHttpRequest 对象
var xhr = new XMLHttpRequest();
 
// 配置请求类型、URL 以及是否异步处理
xhr.open('GET', 'your-api-endpoint', true);
 
// 设置请求完成的回调函数
xhr.onreadystatechange = function () {
  // 请求完成并且响应状态码为 200
  if (xhr.readyState === XMLHttpRequest.DONE) {
    if (xhr.status === 200) {
      // 处理请求成功的响应数据
      console.log(xhr.responseText);
    } else {
      // 处理请求失败
      console.error('AJAX Request was unsuccessful');
    }
  }
};
 
// 发送请求
xhr.send();

这段代码创建了一个XMLHttpRequest对象,并配置了一个GET请求到指定的URL。当请求完成时,它会检查响应状态,并且如果请求成功(状态码200),它会在控制台输出响应文本。

注意:现代的开发中,我们通常会使用更现代的API,例如fetch,它提供了更好的语法和更多的功能。上述代码使用了XMLHttpRequest,因为它是所有现代浏览器都支持的基础Ajax技术。