开发规范:Restful
get:查询
post:新增
put:修改
delete:删除
rest:Representational state transfer表述性状态转换,一种软件架构风格,通常加s
注解:
日志注解:@Slf4j
//private static Logger log= LoggerFactory.getLogger(DeptController.class);
log.info("查询全部部门数据");
@ResponseBody会自动转数据为json
@RequestMapping(value = "/depts",method = RequestMethod.GET) = @GetMapping("/depts")
@RequestParam(defaultValue=)
@PathVariable路径接收注解,位置在方法形参中
@RequestBody实体类接收注解 一般post/put请求
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Value注解 用于外部配置属性注入 @Value("${配置文件中的key}") 加在属性上就行,配合@Component
配置文件自动注入
要求:
key值的后缀和属性名一致
提供get/set方法(@Date)
交给ioc管理(@Component)
使用类注解@ConfigurationProperties(prefix="前缀")批量注入
引入依赖(可以不引入,提供配置文件中的提示):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
多列编辑:alt shift 左键或者alt 左键拖动
properties文件字符串不加引号,不要空格
server.port=8080
server.address=127.0.0.1
springboot yml配置文件:application.yml
server:
port: 8080
address: 127.0.0.1
yml基本语法:
大小写敏感
数值前必须有空格,作为分隔符
使用缩进表示层级关系,缩进是空格(idea会转Tab为空格)
缩进空格数目不重要,对齐就行
#注释
yml定义对象/Map集合
user:
name: Tom
age: 18
password: 123456
定义数组/List/Set集合
hobby:
-java
-game
405:请求方式不允许
分页查询:
配置依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.4.7</version>
</dependency>
前端页面放在static中
文件上传
1.前端页面三要素
表单项type="file"
表单提交方式post
表单的enctype属性multipart/form-data
2.服务端接收文件
MultipartFile
文件上传:本地存储
在服务端,接收到上传的文件之后,将文件存储到本地服务器磁盘中
uuid:通用唯一识别码
public ResultVO upload(String username, Integer age, MultipartFile image) throws IOException {
log.info("文件上传");
//获取原始文件名
String oldName = image.getOriginalFilename();
int index = oldName.lastIndexOf(".");
String subName = oldName.substring(index);
final String uuid = UUID.randomUUID().toString();
String newName = uuid + subName;
//将接收的文件转存到磁盘文件中
image.transferTo(new File("D:\\Users\\JavawebCode\\web二期\\Javaweb\\tlias-web-management\\file\\" + newName));
//getSize()获取文件大小 字节
//getBytes()获取文件内容的字节数组
//getInputStream()获取接收到的文件内容的输入流
return ResultVO.success();
}
#配置单个文件上传大小限制
spring.servlet.multipart.max-file-size=10MB
#配置单个请求最大大小限制(一次请求可以上传多个文件)
spring.servlet.multipart.max-request-size=100MB
登录认证
登录标记:用户登录成功后,每一次请求中,都可以获取到该标记
统一拦截:过滤器Filter(servlet提供)
拦截器Interceptor(springboot提供)
会话技术:浏览器与服务器的一次连接称一次会话,打开浏览器,访问服务器,会话建立,直到一方断开连接,会话结束(一次会话可以包含多个请求与响应)
会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一会话的多次请求中共享数据
会话跟踪方案:
客户端会话跟踪技术:cookie 存储在浏览器本地,http支持 响应头setCookie ,请求头携带cookie
服务器会话跟踪技术:session 存储在服务器,基于cookie实现,通过id获取session
令牌技术:服务器生成,客户端存储令牌
JWT:json web token 定义了简洁的(本质是字符串)、自包含(可以存储自定义信息)的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,信息安全。
组成:头.有效载荷.签名
头Header:记录令牌类型,签名算法
有效载荷Payload:携带自定义信息、默认信息(令牌的有效期、签发日期等)等
签名Signature:防止token被篡改,确保安全。将header、payload,并入指定密钥,通过签名算法计算而来
json通过Base64编码成字符串
场景:登录认证
登陆成功后生成令牌
后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,在处理
生成:
引入依赖
<!-- JWT令牌-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
private static SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
private static String secretKey = "itheima";
private static Long expires = 43200000L;
public static String generatorJwt(Map<String, Object> claims) {
String jwt = Jwts.builder()
.signWith(signatureAlgorithm, secretKey)
.setClaims(claims)
.setExpiration(new Date(System.currentTimeMillis() + expires))
.compact();
return jwt;
}
public static Claims parseJwt(String jwt) {
Claims claims = Jwts.parser()
.setSigningKey(secretKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
过滤器(Filter)
javaweb的三大组件之一(Servlet、Filter、Listener)
过滤器可以把对资源的请求拦截下来
应用场景:登录校验、统一编码处理、敏感字符处理等
使用:
实现Filter接口,实现doFilter方法
配置@WebFilter(urlPattern="")
引导类(启动类):@ServletComponentScan 开启对javaweb(servlet)组件的支持
过滤器链:注解配置的Filter,优先级按照过滤器类名进行排序
import com.alibaba.fastjson.JSONObject;
import com.example.config.ResultVO;
import com.example.utils.JWTUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StringUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Slf4j
@WebFilter(urlPatterns = "/*")
public class LoginCheckFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse) response;
//1.获取请求url
final String url = req.getRequestURL().toString();
log.info("请求的url:{}",url);
//2.解析url,判断是否包含login,如果包含,放行
if(url.contains("login")){
log.info("登录操作,放行");
chain.doFilter(request,response);
return;
}
//3.获取请求头中的令牌(token)
final String jwt = req.getHeader("token");
//4.判断令牌是否存在
if(!StringUtils.hasLength(jwt)){
log.info("请求头token为空,返回未登录的信息");
ResultVO error=ResultVO.error("NOT_LOGIN");
//手动转换 对象-->json 阿里巴巴fastjson
final String notLogin= JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return;
}
//5.解析token
try {
JWTUtils.parseJwt(jwt);
} catch (Exception e) {
e.printStackTrace();
log.info("解析jwt令牌失败,返回未登录的信息");
ResultVO error=ResultVO.error("NOT_LOGIN");
//手动转换 对象-->json 阿里巴巴fastjson
final String notLogin= JSONObject.toJSONString(error);
resp.getWriter().write(notLogin);
return;
}
//6.放行
log.info("令牌合法,放行");
chain.doFilter(request,response);
}
}
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.76</version>
</dependency>
拦截器(Interceptor)
一种动态拦截方法调用机制,类似于过滤器。Spring框架中提供,用来动态拦截控制器中方法的执行
使用:
1.定义拦截器,实现HandlerInterceptor接口,交给IOC
2.注册拦截器,实现WebMvcConfigurer接口,addInterceptors方法
拦截路径:
/*一级路径
/**任意路径
/dept/* /dept下一级,不包含
/dept/** /dept下的所有,包含
全局异常处理器
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)//捕获所有异常
public ResultVO ex(Exception ex){
ex.printStackTrace();
return ResultVO.error("操作失败");
}
}
Other
@ResponseBody
类型:方法注解、类注解
作用:将方法返回值直接响应,如果返回值类型是 实体对象/集合,将转换为json
说明:@RestController=@Controller+@ResponseBody
html文件放于static中,public或resource
三层架构
controller接收前端发送的请求,对请求进行处理并响应数据
service
dao:Data Access Object数据访问层,数据增删改查
内聚 耦合
内聚:软件中各个功能模块内部功能联系
耦合:衡量软件中各个层/模块之间的依赖、关联程度
控制反转:Inversion Of control 简称IOC。对象的创建控制权由程序自身转移到外部(容器),称控制反转
@Component 将当前类交给IOC容器管理,成为IOC容器中的bean
@Component的衍生注解
@Controller(@RestController=@ResponseBody+@Controller)
@Service
@Repository
依赖注入:Dependency Injection,简称DI。容器为应用程序提供运行时,所依赖的资源,称依赖注入
@Autowired 依赖注入 默认按类型自动装配
如果同类型的bean存在多个:
类注解@Primary声明优先级
@Autowired+@Qualifier("bean的名称")
@Resource(name="bean的名称")
@Resource和@Autowired区别
@Autowired是spring框架提供的注解,而@Resource是JDK提供的注解
@Autowired默认按类型进行注入,而@Resource默认按名称进行注入
Bean对象:IOC容器中创建、管理的对象,称为Bean
@SpringBootApplication默认扫描当前包及其子包
手动包扫描:@ComponentScan({"dao","com.example"})