1.登陆信息
登陆后每次请求都应该带有登录信息。此时我们需要拦截器。
使用threalocal代替session保存了此次用户信息。
下面是拦截器代码
@Component
public class CommunityInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(CommunityInterceptor.class);
@Autowired
private UserService userService;
@Autowired
private HostHolder hostHolder;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String ticket = CookieUtil.getValue(request, "ticket");
if (ticket != null){
LoginTicket loginTicket = userService.findLoginTicket(ticket);
if (loginTicket != null && loginTicket.getStatus() == 0 && loginTicket.getExpired().after(new Date())){
User user = userService.findUserById(loginTicket.getUserId());
//我们这里通过cookie获取凭证获取到的user需要存起来
hostHolder.setUser(user);
}
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
//模板引擎能直接使用
User user = hostHolder.getUser();
if (user != null && modelAndView != null){
modelAndView.addObject("loginUser",user);
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
//模板之后
hostHolder.clear();
}
}
2.头像的上传
把文件存本地,然后在数据库的URl存带有文件名的web地址。然后通过web地址访问controller方法,读取本地的图片返回给前端。
@RequestMapping(path = "upload",method = RequestMethod.POST)
public String uploadHeader(MultipartFile headerImage, Model model){
if (headerImage == null){
model.addAttribute("error","您还没上传图片");
return "/site/setting";
}
//文件的名字要变成随机的,要不然会被覆盖
String originalFilename = headerImage.getOriginalFilename();
//获取.png
String substring = originalFilename.substring(originalFilename.lastIndexOf("."));
if (StringUtils.isBlank(substring)){
model.addAttribute("error","文件格式不正确");
return "/site/setting";
}
//文件改名
originalFilename = CommunityUtil.generateUUID() + substring;
//文件存放路径
File dest = new File(uploadPath + "/" +originalFilename);
File file = new File(uploadPath);
if (!file.exists() && !file.isDirectory()){
file.mkdir();
}
try {
//存文件
headerImage.transferTo(dest);
} catch (IOException e) {
logger.error("上传文件失败:"+e.getMessage());
throw new RuntimeException("上传文件失败:",e);
}
//更新头像访问路径。要web访问路径,浏览器不能直接访问你的本地文件
//http://XXXXX/community/xx.png
User user = hostHolder.getUser();
//通过下面的路径去访问,返回图片的方法
String headerUrl = domain + contextPath + "/user/header/" + originalFilename;
userService.updateHeader(user.getId(),headerUrl);
return "redirect:/index";
}
@RequestMapping(path = "/header/{fileName}",method = RequestMethod.GET)
public void getHeader(@PathVariable("fileName") String fileName, HttpServletResponse response){
//服务器存放路径
fileName = uploadPath + "/" +fileName;
String substring = fileName.substring(fileName.lastIndexOf(".") + 1);
response.setContentType("image/"+ substring);
try (
//java7新写法,这样写这里声明的变量在最后会自动加上变量。只要变量有close方法,都会执行
//先把文件读出来
//在输出
FileInputStream fileInputStream = new FileInputStream(fileName);
OutputStream outputStream = response.getOutputStream();
){
byte[] bytes = new byte[1024];
int b = 0;
while ((b =fileInputStream.read(bytes)) != -1){
outputStream.write(bytes,0,b);
}
} catch (IOException e) {
logger.error("读取头像失败:"+e.getMessage());
e.printStackTrace();
}
}