为什么会有跨域问题?
域名,端口不一样都是跨域,前后端域名相同
跨域问题解决:
自定义配置类实现 WebMvcConfigurer 接口,重写 addCorsMappings() 方法
@Configuration
public class WebMVCConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 跨域设置
registry.addMapping("/**")
.allowCredentials(true)
.allowedOrigins("http://localhost:8080")
.allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE")
}
}
分页显示文章信息
首先创建一个Page类封装前端的分页参数,利用mybatis-plus提供的page对象来进行分页查询,同时添加排序条件,此时查询出来的数据还不是我们前端需要的,还得根据查询的文章id查询文章的标签相关信息,然后再把所有信息通过BeanUtils.copyProperties()方法复制到ArticleVo中,返回给前端。
最新文章
构造一个条件构造器,根据文章创建时间来排序,查询文章的名称,展示前面最个最新文章
//最新文章
@Override
public Result newArticle(int limit) {
LambdaQueryWrapper<Article> wrapper = new LambdaQueryWrapper<>();
wrapper.orderByDesc(Article::getCreateDate)
.select(Article::getId,Article::getTitle)
.last("limit "+limit);
List<Article> articles = articleMapper.selectList(wrapper);
return Result.success(copyList(articles,false,false));
}
统一异常处理
创建一个统一异常处理类,加上@ControllerAdvice,就会对加了@Controller的方法进行拦截处理,AOP实现。
@ControllerAdvice
public class AllExceptionHandler {
//处理Exception.class异常
@ExceptionHandler(Exception.class)
//返回json数据
@ResponseBody
public Result doExceptionHandler(Exception e) {
return Result.fail(-999,"系统异常,抱歉!");
}
}
登录功能实现
1)首先检查参数是否合法
2)再对密码进行MD5加密处理 DigestUtils.md5Hex(password);,
3)在对账号进行验证。如果账号密码正确使用jwt生成token,并返回给前端。
登陆后用户的token会存放在浏览器本地,当用户登陆时会在请求头携带token,token中含有用户的id,用户的信息实际存放在redis中。token放在请求头中,所以要获取token通过@RequestHeader(“Authorization”)注解获取
退出登录
退出登录就是删除redis中的toke
注册功能
1)判断参数是否合法;
2)判断账户是否已经存在;
3)若合法并且不存在,则创建新用户;
4)生成token;
5)token即用户信息存入redis;
6)返回给前端token.
登录拦截器
1)自定义拦截器实现 HandlerInterceptor 接口,重写 preHandle() 方法。
2)拦截器注册到容器中,即在实现了WebMvcConfigrer的类中配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new loginInterceptor())
.addPathPatterns("/**");//拦截的路径
.addExcludePathPatterns("/login"); //放行的路径
}
3)获取token request.getHeader("Authorization"); 判断token是否为空,为空未登录,进行拦截
return false;
4)token不为空,去做认证 loginService.checkToken(token); 由于token中保存了用户id,查询id是否存在就行
5)验证成功,放行 return true;
发布文章
发布文章要实现三个功能,文章分类获取、文章标签获取、发布功能实现。
首先查询所有的文章分类,和文章标签。
1)从前端就收到文章相关数据
2)Article表中存入文章相关属性;
3)Article_tag表中存入标签和文章id;
4)Article_body表中存入文章内容。
头像文件上传与下载
文件上传
1)controller中接收的参数类型必须为 MultipartFile 参数名要与表单中的name属性名称相同
文件上传的大小可以在配置文件中设置
@PostMapping
public Result upload(MultipartFile file){
file.transferTo(new File("D:\")) ; // 文件转存的位置
}
文件下载
@GettMapping
public Result upload(String name,HttpServletResponse response){
//输入流读取文件内容
FileInputStream fileInputStream= new FileInputStream(new File("D:\")); //写文件上传的位置
//输出流将文件写回浏览器
ServletOutputStream outputStream= response.getOutputStream();
int len=0;
byte[] bytes=new byte[1024].
while( (len=fileInputStream.read(bytes)) !=-1 ){
outputtream.write(bytes,0,len);
}
}