2.27显示登陆信息,头像上传

86 阅读2分钟

1.登陆信息

登陆后每次请求都应该带有登录信息。此时我们需要拦截器。

_F)YAXA{4HUOQBQ98Q)N8.png

使用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.头像的上传

IN5U0EEIFS@}{QC(W6%B}15.png

把文件存本地,然后在数据库的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();
    }
}