苍穹外卖day01
对于http协议请求协议:浏览器将数据以请求格式发送到服务器。请求行、请求头 、请求体get请求只有请求行和请求体post请求则是三个都有1)请求行:请求方式、资源路径、协议/版本组成(之间使用空格分隔)Host表示请求的主机名User-Agent浏览器版本。例如:Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79 ,IE浏览器的标识类似Mozilla/5.0 (Wind
今天是写外卖的第一天,昨天主要就下载了下资料,并且配置了前端环境后端环境
我用接口测试没有用黑马的yapi 用的是apifox 也挺好用的 推荐!!!!!
目录
今日完结任务:
- 新增员工接口
- 分页查询
- 启用禁用员工账号
- 分类管理
- 其他补充
1.新增员工
在新增员工这里用到了一个ThreadLocal
我们在spring后端发起的每一个请求,都是一个独自的线程
线程安全性: ThreadLocal 本身为每个线程提供独立的变量副本,因此是线程安全的,但需确保不同线程之间不会错误地修改对方的数据。
在使用后必须remove该线程,不然可能会造成内存泄漏
2.分页查询
运用了pagehelper插件实现分页查询,这样就不用在sql中再写limit了
在xml中写sql语句时,利用分页插件实现分页查询,这里使用了动态sql <where> 标签会智能处理:只有当至少有一个条件满足时,才会插入 WHERE 关键字会自动删除条件开头多余的 AND 或 OR所以无论哪个条件满足,生成的 SQL 都是正确的
还有一点小小的问题, <if test="name != null and name != ''"> 判断空得是'' 不能是' '
3.启用禁用员工账号一点小细节
parameterType 是 MyBatis XML 映射文件中的一个重要属性,用于指定传入 SQL 语句的参数类型。
基本作用: parameterType 告诉 MyBatis:这个 SQL 语句将会接收什么类型的参数。
4.分类管理接口
和员工管理的接口很像crud
5.补充
1.http
请求简单介绍
对于http协议
请求协议:浏览器将数据以请求格式发送到服务器。包括:请求行、请求头 、请求体
get请求只有请求行和请求体
post请求则是三个都有
1)请求行:请求方式、资源路径、协议/版本组成(之间使用空格分隔)
2)请求头:
Host | 表示请求的主机名 |
User-Agent | 浏览器版本。 例如:Chrome浏览器的标识类似Mozilla/5.0 ...Chrome/79 ,IE浏览器的标识类似Mozilla/5.0 (Windows NT ...)like Gecko |
Accept | 表示浏览器能接收的资源类型,如text/*,image/*或者*/*表示所有; |
Accept-Language | 表示浏览器偏好的语言,服务器可以据此返回不同语言的网页; |
Accept-Encoding | 表示浏览器可以支持的压缩类型,例如gzip, deflat |
Content-Type | 请求主体的数据类型 |
Content-Length | 数据主体的大小(单位:字节) |
偶尔还带token
3)请求体:则是post请求里面带的参数
2.响应
响应几乎是一样的:响应行,响应头, 响应体
1)响应行: 协议及版本、响应状态码、状态码描述
2)响应头:
Content-Type | 表示该响应内容的类型,例如text/html,image/jpeg |
Content-Length | 表示该响应内容的长度(字节数); |
Content-Encoding | 表示该响应压缩算法,例如gzip ; |
Cache-Control: | 指示客户端应如何缓存,例如max-age=300表示可以最多缓存300秒 ; |
Set-Cookie: | 告诉浏览器为当前页面所在的域设置cookie |
3)响应体 :响应数据
状态码分类 说明
1xx 响应中 --- 临时状态码。表示请求已经接受,告诉客户端应该继续请求或者如果已经完成则忽略
2xx 成功 --- 表示请求已经被成功接收,处理已完成
3xx 重定向 --- 重定向到其它地方,让客户端再发起一个请求以完成整个处理
4xx 客户端错误 --- 处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
5xx 服务器端错误 --- 处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等
2.jwt.令牌登录
JWT全称 JSON Web Token (官网:https://jwt.io/)
JWT的组成: (JWT令牌由三个部分组成,三个部分之间使用英文的点来分割)
- 第一部分:Header(头), 记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}
- 第二部分:Payload(有效载荷),携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}
- 第三部分:Signature(签名),防止Token被篡改、确保安全性。将header、payload,并加入指定秘钥,通过指定签名算法计算而来。
jwt就是把三个部分进行了base64编码,xxxxxxx.yyyyyyy.zzzzzz,x就是头部,y就是负载,z就是签名签名 = HA256( base64(header) + "." + base64(payload), 你的密钥 ) 然后将签名附在JWT的第三部分。这个签名是Header和Payload的“数字指纹”。
这个密钥是你自己所设置的,利用密钥才有可能解密第三部分,这样验证时只有一样的令牌才会通过,如果不一样就会拒绝(检验作用)
另外,在登陆时会用到两个技术(都可以用)对令牌进行验证
Filter过滤器
Interceptor拦截器
讲解:
1)先自定义拦截器
实现HandlerInterceptor接口,并重写其所有方法
//自定义拦截器
@Component
public class DemoInterceptor implements HandlerInterceptor {
//目标资源方法执行前执行。 返回true:放行 返回false:不放行
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("preHandle .... ");
return true; //true表示放行
}
//目标资源方法执行后执行
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("postHandle ... ");
}
//视图渲染完毕后执行,最后执行
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("afterCompletion .... ");
}
}
注意:
-
preHandle方法:目标资源方法执行前执行。 返回true:放行 返回false:不放行
-
postHandle方法:目标资源方法执行后执行
-
afterCompletion方法:视图渲染完毕后执行,最后执行
2). 注册配置拦截器
public class WebConfig implements WebMvcConfigurer {
//自定义的拦截器对象
@Autowired
private DemoInterceptor demoInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//注册自定义拦截器对象
registry.addInterceptor(demoInterceptor).addPathPatterns("/**");//设置拦截器拦截的请求路径( /** 表示拦截所有请求)
}
}
这里也是可以设置不拦截那些路径的
实例:
**
* jwt令牌校验的拦截器
*/
@Component
@Slf4j
public class JwtTokenUserInterceptor implements HandlerInterceptor {
@Autowired
private JwtProperties jwtProperties;
/**
* 校验jwt
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//判断当前拦截到的是Controller的方法还是其他资源
if (!(handler instanceof HandlerMethod)) {
//当前拦截到的不是动态方法,直接放行
return true;
}
//1、从请求头中获取令牌
String token = request.getHeader(jwtProperties.getUserTokenName());
//2、校验令牌
try {
log.info("jwt校验:{}", token);
Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);
Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString());
log.info("当前用户的id:", userId);
BaseContext.setCurrentId(userId);
//3、通过,放行
return true;
} catch (Exception ex) {
//4、不通过,响应401状态码
response.setStatus(401);
return false;
}
}
}
**
* 配置类,注册web层相关组件
*/
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
@Autowired
private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;
/**
* 注册自定义拦截器
*
* @param registry
*/
protected void addInterceptors(InterceptorRegistry registry) {
log.info("开始注册自定义拦截器...");
registry.addInterceptor(jwtTokenAdminInterceptor)
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/employee/login");
}
总结:
今天到此结束!!!!!!!!!!!!!!!!!!!!!!
更多推荐
所有评论(0)