基于javaweb+mysql的springboot在线网盘系统(java+jsp+springboot+maven+mysql+thymeleaf+ftp)
运行环境
Java≥8、MySQL≥5.7
开发工具
eclipse/idea/myeclipse/sts等均可配置运行
适用
课程设计,大作业,毕业设计,项目练习,学习演示等
功能说明
基于javaweb+mysql的SpringBoot在线网盘系统(java+jsp+springboot+maven+mysql+thymeleaf+ftp)
一、项目简述
功能:用户的邮箱注册、验证码验证以及用户登录。 不需要注册账号,也可以上传满足条件的临时文件,但是只4小时内有效。 文件的管理,上传、下载、重命名、删除、查看统计数据、分类管理等。 文件夹的管理,创建、删除、重命名。 文件的分享,支持通过链接和二维码的分享方式等等,以及管理员对用户的管理等等。
二、项目运行
环境配置:
Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)
项目技术:
JSP +Springboot+ SpringMVC + MyBatis + ThymeLeaf + FTP+ JavaScript + JQuery + Ajax + maven等等
List<MyFile> myFiles = null;
if (folderId == 0){
//当前目录为根目录
myFiles = myFileService.getRootFilesByFileStoreId(loginUser.getFileStoreId());
}else {
//当前目录为其他目录
myFiles = myFileService.getFilesByParentFolderId(folderId);
}
for (int i = 0; i < myFiles.size(); i++) {
if ((myFiles.get(i).getMyFileName()+myFiles.get(i).getPostfix()).equals(name)){
logger.error("当前文件已存在!上传失败...");
map.put("code", 501);
return map;
}
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = format.format(new Date());
String path = loginUser.getUserId()+"/"+dateStr +"/"+folderId;
if (!checkTarget(name)){
logger.error("上传失败!文件名不符合规范...");
map.put("code", 502);
return map;
}
Integer sizeInt = Math.toIntExact(files.getSize() / 1024);
//是否仓库放不下该文件
if(store.getCurrentSize()+sizeInt > store.getMaxSize()){
logger.error("上传失败!仓库已满。");
map.put("code", 503);
return map;
}
//处理文件大小
String size = String.valueOf(files.getSize()/1024.0);
int indexDot = size.lastIndexOf(".");
size = size.substring(0,indexDot);
int index = name.lastIndexOf(".");
String tempName = name;
String postfix = "";
int type = 4;
if (index!=-1){
tempName = name.substring(index);
name = name.substring(0,index);
//获得文件类型
type = getType(tempName.toLowerCase());
postfix = tempName.toLowerCase();
}
try {
//提交到FTP服务器
boolean b = FtpUtil.uploadFile("/"+path, name + postfix, files.getInputStream());
if (b){
//上传成功
logger.info("文件上传成功!"+files.getOriginalFilename());
//向数据库文件表写入数据
myFileService.addFileByFileStoreId(
MyFile.builder()
//更新仓库表的当前大小
fileStoreService.addSize(store.getFileStoreId(),Integer.valueOf(size));
try {
Thread.sleep(5000);
map.put("code", 200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}else{
logger.error("文件上传失败!"+files.getOriginalFilename());
map.put("code", 504);
}
} catch (IOException e) {
e.printStackTrace();
}
return map;
}
/**
* @Description 网盘的文件下载
* @Param [fId]
* @return void
**/
@GetMapping("/downloadFile")
public String downloadFile(@RequestParam Integer fId){
if (fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission() == 2){
logger.error("用户没有下载文件的权限!下载失败...");
return "redirect:/error401Page";
}
//获取文件信息
MyFile myFile = myFileService.getFileByFileId(fId);
String remotePath = myFile.getMyFilePath();
String fileName = myFile.getMyFileName()+myFile.getPostfix();
try {
//去FTP上拉取
OutputStream os = new BufferedOutputStream(response.getOutputStream());
response.setCharacterEncoding("utf-8");
// 设置返回类型
response.setContentType("multipart/form-data");
// 文件名转码一下,不然会出现中文乱码
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
}
/**
* 用户登录
* @param map 存储提示信息
* @return java.lang.String
*/
@PostMapping("/login")
public String login(User user, Map<String, Object> map) {
User userByEmail = userService.getUserByEmail(user.getEmail());
if (userByEmail != null && userByEmail.getPassword().equals(user.getPassword())) {
session.setAttribute("loginUser", userByEmail);
logger.info("登录成功!"+userByEmail);
return "redirect:/index";
}else{
User user1 = userService.getUserByEmail(user.getEmail());
String errorMsg = user1 == null ? "该邮箱尚未注册" : "密码错误";
logger.info("登录失败!请确认邮箱和密码是否正确!");
//登录失败,将失败信息返回前端渲染
map.put("errorMsg", errorMsg);
return "index";
}
}
/**
* @return void
* @Description 向注册邮箱发送验证码, 并验证邮箱是否已使用
* @Param [userName, email, password]
**/
@ResponseBody
@RequestMapping("/sendCode")
public String sendCode(String userName, String email, String password) {
User userByEmail = userService.getUserByEmail(email);
if (userByEmail != null) {
logger.error("发送验证码失败!邮箱已被注册!");
return "exitEmail";
}
logger.info("开始发送邮件.../n" + "获取的到邮件发送对象为:" + mailSender);
mailUtils = new MailUtils(mailSender);
String code = "123456";
session.setAttribute(email + "_code", code);
map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission());
return "u-admin/video-files";
}
/**
* @Description 前往所有音频页面
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/music-files")
public String toMusicFilePage( Map<String, Object> map) {
List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),4);
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
map.put("files", files);
map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission());
return "u-admin/music-files";
}
/**
* @Description 前往其他文件页面
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/other-files")
public String toOtherFilePage( Map<String, Object> map) {
List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),5);
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
map.put("files", files);
map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission());
return "u-admin/other-files";
}
/**
* @Description 登录之后的用户主页
* @Param [map]
* @return java.lang.String
**/
myFiles = myFileService.getRootFilesByFileStoreId(loginUser.getFileStoreId());
}else {
//当前目录为其他目录
myFiles = myFileService.getFilesByParentFolderId(folderId);
}
for (int i = 0; i < myFiles.size(); i++) {
if ((myFiles.get(i).getMyFileName()+myFiles.get(i).getPostfix()).equals(name)){
logger.error("当前文件已存在!上传失败...");
map.put("code", 501);
return map;
}
}
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String dateStr = format.format(new Date());
String path = loginUser.getUserId()+"/"+dateStr +"/"+folderId;
if (!checkTarget(name)){
logger.error("上传失败!文件名不符合规范...");
map.put("code", 502);
return map;
}
Integer sizeInt = Math.toIntExact(files.getSize() / 1024);
//是否仓库放不下该文件
if(store.getCurrentSize()+sizeInt > store.getMaxSize()){
logger.error("上传失败!仓库已满。");
map.put("code", 503);
return map;
}
//处理文件大小
String size = String.valueOf(files.getSize()/1024.0);
int indexDot = size.lastIndexOf(".");
size = size.substring(0,indexDot);
int index = name.lastIndexOf(".");
String tempName = name;
String postfix = "";
int type = 4;
if (index!=-1){
tempName = name.substring(index);
name = name.substring(0,index);
//获得文件类型
type = getType(tempName.toLowerCase());
postfix = tempName.toLowerCase();
}
* @return java.lang.String
**/
@GetMapping("/logout")
public String logout() {
logger.info("用户退出登录!");
session.invalidate();
return "redirect:/";
}
}
package com.moti.controller;
/**
* @ClassName: SystemController
* @Description: 系统页面跳转控制器
* @Version: 1.0
**/
@Controller
public class SystemController extends BaseController {
Logger logger = LogUtils.getInstance(SystemController.class);
/**
* @return java.lang.String
* @Description 前往我的网盘
* @Param [fId, fName, error, map]
**/
@GetMapping("/files")
public String toFileStorePage(Integer fId, String fName, Integer error, Map<String, Object> map) {
//判断是否包含错误信息
if (error != null) {
if (error == 1) {
map.put("error", "添加失败!当前已存在同名文件夹");
}
* @ClassName: SystemController
* @Description: 系统页面跳转控制器
* @Version: 1.0
**/
@Controller
public class SystemController extends BaseController {
Logger logger = LogUtils.getInstance(SystemController.class);
/**
* @return java.lang.String
* @Description 前往我的网盘
* @Param [fId, fName, error, map]
**/
@GetMapping("/files")
public String toFileStorePage(Integer fId, String fName, Integer error, Map<String, Object> map) {
//判断是否包含错误信息
if (error != null) {
if (error == 1) {
map.put("error", "添加失败!当前已存在同名文件夹");
}
if (error == 2) {
map.put("error", "重命名失败!文件夹已存在");
}
}
//包含的子文件夹
List<FileFolder> folders = null;
//包含的文件
List<MyFile> files = null;
//当前文件夹信息
FileFolder nowFolder = null;
//当前文件夹的相对路径
List<FileFolder> location = new ArrayList<>();
if (fId == null || fId <= 0) {
//代表当前为根目录
fId = 0;
folders = fileFolderService.getRootFoldersByFileStoreId(loginUser.getFileStoreId());
files = myFileService.getRootFilesByFileStoreId(loginUser.getFileStoreId());
nowFolder = FileFolder.builder().fileFolderId(fId).build();
location.add(nowFolder);
} else {
//当前为具体目录,访问的文件夹不是当前登录用户所创建的文件夹
FileFolder folder = fileFolderService.getFileFolderByFileFolderId(fId);
if (folder.getFileStoreId() - loginUser.getFileStoreId() != 0){
return "redirect:/error401Page";
* @Version: 1.0
**/
@Controller
public class AdminController extends BaseController {
private Logger logger = LogUtils.getInstance(AdminController.class);
/**
* @Description 前往用户管理页面
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/manages-users")
public String manageUsers(Map<String,Object> map,Integer cur){
if (loginUser.getRole() == 1){
//用于无访问权限
logger.error("当前登录用户:"+loginUser.getUserName()+"无管理员权限!");
return "redirect:/error401Page";
}
//获取全部的用户
Integer usersCount = userService.getUsersCount();
//获取当前查询的页数,如果为空,默认为0
cur = (cur == null || cur<0)?0:cur;
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
//分页获得20个用户信息
Page<Object> page = PageHelper.startPage(cur, 20);
List<UserToShow> users = userService.getUsers();
map.put("statistics", statistics);
map.put("users", users);
map.put("page", page);
map.put("usersCount", usersCount);
logger.info("用户管理域的内容:"+map);
return "admin/manage-users";
}
/**
* @Description 修改用户的权限和最大容量
* @Param [uId, pre, size]
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/doc-files")
public String toDocFilePage( Map<String, Object> map) {
List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),1);
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
map.put("files", files);
map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission());
return "u-admin/doc-files";
}
/**
* @Description 前往所有图像页面
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/image-files")
public String toImageFilePage( Map<String, Object> map) {
List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),2);
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
map.put("files", files);
map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission());
return "u-admin/image-files";
}
/**
* @Description 前往所有视频页面
* @Param [map]
* @return java.lang.String
**/
@GetMapping("/video-files")
public String toVideoFilePage( Map<String, Object> map) {
List<MyFile> files = myFileService.getFilesByType(loginUser.getFileStoreId(),3);
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
map.put("files", files);
map.put("permission", fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission());
return "u-admin/video-files";
}
* @Param [request]
* @return boolean
**/
public static boolean isMSBrowser(HttpServletRequest request) {
String[] IEBrowserSignals = {"MSIE", "Trident", "Edge"};
String userAgent = request.getHeader("User-Agent");
for (String signal : IEBrowserSignals) {
if (userAgent.contains(signal)){
return true;
}
}
return false;
}
}
package com.moti.controller;
/**
* @Description 登录控制器
map.put("files", files);
map.put("nowFolder", nowFolder);
map.put("location", location);
logger.info("网盘页面域中的数据:" + map);
return "u-admin/files";
}
/**
* @Description 前往文件上传页面
* @Param [fId, fName, map]
* @return java.lang.String
**/
@GetMapping("/upload")
public String toUploadPage(Integer fId, String fName, Map<String, Object> map) {
//包含的子文件夹
List<FileFolder> folders = null;
//当前文件夹信息
FileFolder nowFolder = null;
//当前文件夹的相对路径
List<FileFolder> location = new ArrayList<>();
if (fId == null || fId <= 0) {
//代表当前为根目录
fId = 0;
folders = fileFolderService.getRootFoldersByFileStoreId(loginUser.getFileStoreId());
nowFolder = FileFolder.builder().fileFolderId(fId).build();
location.add(nowFolder);
} else {
//当前为具体目录
folders = fileFolderService.getFileFolderByParentFolderId(fId);
nowFolder = fileFolderService.getFileFolderByFileFolderId(fId);
//遍历查询当前目录
FileFolder temp = nowFolder;
while (temp.getParentFolderId() != 0) {
temp = fileFolderService.getFileFolderByFileFolderId(temp.getParentFolderId());
location.add(temp);
}
}
Collections.reverse(location);
//获得统计信息
FileStoreStatistics statistics = myFileService.getCountStatistics(loginUser.getFileStoreId());
map.put("statistics", statistics);
map.put("folders", folders);
map.put("nowFolder", nowFolder);
map.put("location", location);
logger.info("网盘页面域中的数据:" + map);
return "u-admin/upload";
}
/**
accessToken = accessTokenObj.getAccessToken();
tokenExpireIn = accessTokenObj.getExpireIn();
logger.error("accessToken" + accessToken);
request.getSession().setAttribute("demo_access_token", accessToken);
request.getSession().setAttribute("demo_token_expirein", String.valueOf(tokenExpireIn));
// 利用获取到的accessToken 去获取当前用的openid -------- start
OpenID openIDObj = new OpenID(accessToken);
openID = openIDObj.getUserOpenID();
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
if (userInfoBean.getRet() == 0) {
logger.info("用户的OPEN_ID: " + openID);
logger.info("用户的昵称: " + removeNonBmpUnicode(userInfoBean.getNickname()));
logger.info("用户的头像URI: " + userInfoBean.getAvatar().getAvatarURL100());
//设置用户信息
User user = userService.getUserByOpenId(openID);
if (user == null){
user = User.builder()
.openId(openID).userName(removeNonBmpUnicode(userInfoBean.getNickname()))
.imagePath(userInfoBean.getAvatar().getAvatarURL100()).
registerTime(new Date()).build();
if (userService.insert(user)){
logger.info("注册用户成功!当前注册用户" + user);
FileStore store = FileStore.builder().userId(user.getUserId()).build();
if (fileStoreService.addFileStore(store) == 1){
user.setFileStoreId(store.getFileStoreId());
userService.update(user);
logger.info("注册仓库成功!当前注册仓库" + store);
}
} else {
logger.error("注册用户失败!");
}
}else {
user.setUserName(removeNonBmpUnicode(userInfoBean.getNickname()));
user.setImagePath(userInfoBean.getAvatar().getAvatarURL100());
userService.update(user);
}
logger.info("QQ用户登录成功!"+user);
session.setAttribute("loginUser", user);
return "redirect:/index";
} else {
logger.error("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());
}
}
} catch (QQConnectException e) {
} finally {
logger.error("登录成功!");
}
return "登录失败!请查看日志信息...";
}
/**
* @Description 处理掉QQ网名中的特殊表情
logger.error("登录失败:没有获取到响应参数");
return "accessTokenObj=>" + accessTokenObj + "; accessToken" + accessTokenObj.getAccessToken();
} else {
accessToken = accessTokenObj.getAccessToken();
tokenExpireIn = accessTokenObj.getExpireIn();
logger.error("accessToken" + accessToken);
request.getSession().setAttribute("demo_access_token", accessToken);
request.getSession().setAttribute("demo_token_expirein", String.valueOf(tokenExpireIn));
// 利用获取到的accessToken 去获取当前用的openid -------- start
OpenID openIDObj = new OpenID(accessToken);
openID = openIDObj.getUserOpenID();
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);
UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();
if (userInfoBean.getRet() == 0) {
logger.info("用户的OPEN_ID: " + openID);
logger.info("用户的昵称: " + removeNonBmpUnicode(userInfoBean.getNickname()));
logger.info("用户的头像URI: " + userInfoBean.getAvatar().getAvatarURL100());
//设置用户信息
User user = userService.getUserByOpenId(openID);
if (user == null){
user = User.builder()
.openId(openID).userName(removeNonBmpUnicode(userInfoBean.getNickname()))
.imagePath(userInfoBean.getAvatar().getAvatarURL100()).
registerTime(new Date()).build();
if (userService.insert(user)){
logger.info("注册用户成功!当前注册用户" + user);
FileStore store = FileStore.builder().userId(user.getUserId()).build();
if (fileStoreService.addFileStore(store) == 1){
user.setFileStoreId(store.getFileStoreId());
userService.update(user);
logger.info("注册仓库成功!当前注册仓库" + store);
}
} else {
logger.error("注册用户失败!");
}
}else {
user.setUserName(removeNonBmpUnicode(userInfoBean.getNickname()));
user.setImagePath(userInfoBean.getAvatar().getAvatarURL100());
userService.update(user);
}
logger.info("QQ用户登录成功!"+user);
session.setAttribute("loginUser", user);
return "redirect:/index";
} else {
logger.error("很抱歉,我们没能正确获取到您的信息,原因是: " + userInfoBean.getMsg());
}
}
}
fileFolderService.deleteFileFolderById(folder.getFileFolderId());
}
}
package com.moti.controller;
/**
* @ClassName: BaseController
* @Description: 控制器的基类,所有控制器必须继承此类
* @Version: 1.0
**/
public class BaseController {
@Autowired
protected UserService userService;
@Autowired
protected MyFileService myFileService;
@Autowired
protected FileFolderService fileFolderService;
@Autowired
protected FileStoreService fileStoreService;
@Autowired
protected TempFileService tempFileService;
protected HttpServletRequest request;
protected HttpServletResponse response;
protected HttpSession session;
protected User loginUser;
@Autowired
protected JavaMailSenderImpl mailSender;
* @Description 网盘的文件下载
* @Param [fId]
* @return void
**/
@GetMapping("/downloadFile")
public String downloadFile(@RequestParam Integer fId){
if (fileStoreService.getFileStoreByUserId(loginUser.getUserId()).getPermission() == 2){
logger.error("用户没有下载文件的权限!下载失败...");
return "redirect:/error401Page";
}
//获取文件信息
MyFile myFile = myFileService.getFileByFileId(fId);
String remotePath = myFile.getMyFilePath();
String fileName = myFile.getMyFileName()+myFile.getPostfix();
try {
//去FTP上拉取
OutputStream os = new BufferedOutputStream(response.getOutputStream());
response.setCharacterEncoding("utf-8");
// 设置返回类型
response.setContentType("multipart/form-data");
// 文件名转码一下,不然会出现中文乱码
response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode(fileName, "UTF-8"));
boolean flag = FtpUtil.downloadFile("/" + remotePath, fileName, os);
if (flag) {
myFileService.updateFile(
MyFile.builder().myFileId(myFile.getMyFileId()).downloadTime(myFile.getDownloadTime() + 1).build());
os.flush();
os.close();
logger.info("文件下载成功!" + myFile);
}
} catch (Exception e) {
e.printStackTrace();
}
return "success";
}
/**
* @Description 删除文件
* @Param [fId, folder]
* @return java.lang.String
**/
@GetMapping("/deleteFile")
public String deleteFile(@RequestParam Integer fId,Integer folder){
//获得文件信息
MyFile myFile = myFileService.getFileByFileId(fId);
String remotePath = myFile.getMyFilePath();
user.setRole(1);
if (userService.insert(user)) {
FileStore store = FileStore.builder().userId(user.getUserId()).currentSize(0).build();
fileStoreService.addFileStore(store);
user.setFileStoreId(store.getFileStoreId());
userService.update(user);
logger.info("注册用户成功!当前注册用户" + user);
logger.info("注册仓库成功!当前注册仓库" + store);
} else {
map.put("errorMsg", "服务器发生错误,注册失败");
return "index";
}
session.removeAttribute(user.getEmail() + "_code");
session.setAttribute("loginUser", user);
return "redirect:/index";
}
/**
* 用户登录
* @param map 存储提示信息
* @return java.lang.String
*/
@PostMapping("/login")
public String login(User user, Map<String, Object> map) {
User userByEmail = userService.getUserByEmail(user.getEmail());
if (userByEmail != null && userByEmail.getPassword().equals(user.getPassword())) {
session.setAttribute("loginUser", userByEmail);
logger.info("登录成功!"+userByEmail);
return "redirect:/index";
}else{
User user1 = userService.getUserByEmail(user.getEmail());
String errorMsg = user1 == null ? "该邮箱尚未注册" : "密码错误";
logger.info("登录失败!请确认邮箱和密码是否正确!");
//登录失败,将失败信息返回前端渲染
map.put("errorMsg", errorMsg);
return "index";
}
}
/**
* @return void
session.setAttribute(email + "_code", code);
return "success";
}
/**
* @Description 请求QQ登录
* @Param []
* @return void
**/
@GetMapping("/loginByQQ")
public void login() {
response.setContentType("text/html;charset=utf-8");
try {
response.sendRedirect(new Oauth().getAuthorizeURL(request));
logger.info("请求QQ登录,开始跳转...");
} catch (QQConnectException | IOException e) {
e.printStackTrace();
}
}
/**
* @Description QQ登录回调地址
* @Param []
* @return java.lang.String
**/
@GetMapping("/connection")
public String connection() {
try {
AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);
String accessToken = null, openID = null;
long tokenExpireIn = 0L;
if ("".equals(accessTokenObj.getAccessToken())) {
logger.error("登录失败:没有获取到响应参数");
return "accessTokenObj=>" + accessTokenObj + "; accessToken" + accessTokenObj.getAccessToken();
} else {
accessToken = accessTokenObj.getAccessToken();
tokenExpireIn = accessTokenObj.getExpireIn();
logger.error("accessToken" + accessToken);
request.getSession().setAttribute("demo_access_token", accessToken);
request.getSession().setAttribute("demo_token_expirein", String.valueOf(tokenExpireIn));
// 利用获取到的accessToken 去获取当前用的openid -------- start
OpenID openIDObj = new OpenID(accessToken);
openID = openIDObj.getUserOpenID();
UserInfo qzoneUserInfo = new UserInfo(accessToken, openID);