DO、POST两种基本请求方式的区别

  • GET在浏览器回退时是无害的,而POST会再次提交请求。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求在URL中传送的参数是有长度限制的,而POST么有。
  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中。
    (本标准答案参考自w3schools)
好的,这里给出一个SpringBoot+Vue前后端分离的项目中实现请求头中加Token的完整示例。 1. 后端配置 首先,在后端的Spring Boot项目中,我们需要进行如下配置: 1.1 创建一个Token的工具类,用于生成、解析、校验Token。 ```java package com.example.demo.util; import io.jsonwebtoken.Claims; import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.Map; @Component public class TokenUtils { /** * token有效期(小时) */ @Value("${token.expire.hours}") private int expireHours; /** * token加密密钥 */ @Value("${token.secret}") private String secret; /** * 生成Token */ public String generateToken(String username) { Map<String, Object> claims = new HashMap<>(); claims.put("username", username); Date now = new Date(); Date expireTime = new Date(now.getTime() + expireHours * 60 * 60 * 1000); return Jwts.builder() .setClaims(claims) .setIssuedAt(now) .setExpiration(expireTime) .signWith(SignatureAlgorithm.HS256, secret) .compact(); } /** * 解析Token */ public Claims parseToken(String token) { return Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); } /** * 校验Token是否过期 */ public boolean isTokenExpired(Date expirationTime) { return expirationTime.before(new Date()); } } ``` 1.2 创建一个自定义的拦截器,在请求头中验证Token。 ```java package com.example.demo.interceptor; import com.example.demo.util.TokenUtils; import io.jsonwebtoken.Claims; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @Component public class TokenInterceptor implements HandlerInterceptor { @Autowired private TokenUtils tokenUtils; /** * 在请求处理之前进行拦截,验证Token */ @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token == null || token.isEmpty()) { response.setStatus(401); return false; } Claims claims = tokenUtils.parseToken(token); if (claims == null || tokenUtils.isTokenExpired(claims.getExpiration())) { response.setStatus(401); return false; } return true; } /** * 在请求处理之后进行拦截 */ @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // do nothing } /** * 在请求处理完成之后进行拦截 */ @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // do nothing } } ``` 1.3 配置拦截器 在Spring Boot的配置文件中,将拦截器加入到拦截器链中。 ```yaml spring: mvc: # 配置拦截器 interceptor: # 自定义拦截器 - class: com.example.demo.interceptor.TokenInterceptor ``` 2. 前端配置 在前端的Vue项目中,我们需要进行如下配置: 2.1 创建一个请求拦截器,在请求头中添加Token。 ```javascript import axios from 'axios' const instance = axios.create({ baseURL: process.env.VUE_APP_API_URL, timeout: 10000 }) // 请求拦截器 instance.interceptors.request.use( config => { const token = localStorage.getItem('token') if (token) { config.headers.Authorization = token } return config }, error => { return Promise.reject(error) } ) export default instance ``` 2.2 创建一个响应拦截器,在Token失效时跳转到登录页。 ```javascript import router from '@/router' // 响应拦截器 instance.interceptors.response.use( response => { return response }, error => { if (error.response && error.response.status === 401) { localStorage.removeItem('token') router.push('/login') } return Promise.reject(error) } ) ``` 3. 测试 至此,我们已经完成了Token的生成、解析、校验,以及在请求头中添加Token,Token失效时跳转到登录页的配置。下面我们可以进行测试了。 3.1 登录时生成Token 在登录接口中,当用户名和密码正确时,生成Token并返回给前端。 ```java @RestController @RequestMapping("/api/auth") public class AuthController { @Autowired private TokenUtils tokenUtils; @PostMapping("/login") public ResponseEntity<?> login(@RequestBody AuthRequest request) { // 验证用户名和密码 // ... // 生成Token String token = tokenUtils.generateToken(request.getUsername()); // 返回Token return ResponseEntity.ok(new AuthResponse(token)); } } ``` 3.2 在请求头中添加Token 在每次请求时,将Token存储到localStorage中,在请求拦截器中获取Token并添加到请求头中。 ```javascript import api from '@/api' export default { login(username, password) { return api.post('/auth/login', { username, password }) .then(res => { const token = res.data.token localStorage.setItem('token', token) return token }) } } ``` 3.3 Token失效时跳转到登录页 当后端返回401(未授权)时,响应拦截器会将Token从localStorage中删除,并跳转到登录页。 ```javascript import api from '@/api' export default { getProfile() { return api.get('/user/profile') .then(res => { return res.data }) } } ``` 以上就是完整的示例,希望可以帮助到你。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值