2025年3月25日 星期二 甲辰(龙)年 月廿四 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > Java

java web项目——共享文件系统

时间:01-14来源:作者:点击数:38

项目的github地址:youzelian/shareFiles: javaweb项目 (github.com)

示例:

整个项目由三部分组成:数据库,前端,后端。

1.数据库

表的创建代码
  • create table users(
  • user_id int primary key auto_increment,
  • user_name varchar(30),
  • user_pwd varchar(20),
  • user_gender char(2),
  • user_email varchar(20),
  • user_tel char(11),
  • user_address varchar(100),
  • user_img_path varchar(100),
  • personal_signature varchar(255),
  • user_of_club int,
  • pwd_req varchar(50),
  • pwd_req_answer varchar(100)
  • )
  • create table files(
  • file_id int primary key auto_increment,
  • file_name varchar(50),
  • file_type varchar(20),
  • file_download_link varchar(100),
  • file_vote int,
  • file_collect int,
  • file_download_amount int,
  • file_of_club int,
  • file_introduction varchar(255)
  • )
  • create table comments(
  • comment_id int primary key auto_increment,
  • f_id int,
  • u_id int,
  • comment_content varchar(255),
  • foreign key(f_id) references files(file_id),
  • foreign key(u_id) references users(user_id)
  • )
  • create table user_file(
  • uf_id int primary key auto_increment,
  • u_id int,
  • f_id int,
  • foreign key(f_id) references files(file_id),
  • foreign key(u_id) references users(user_id)
  • )
  • create table clubs(
  • club_id int primary key auto_increment,
  • club_name varchar(100),
  • club_introduce varchar(255),
  • club_numbers int
  • )
  • create table user_club(
  • uc_id int primary key auto_increment,
  • u_id int,
  • c_id int,
  • foreign key(u_id) references users(user_id),
  • foreign key(c_id) references clubs(club_id)
  • )
  • create table file_club(
  • fc_id int primary key auto_increment,
  • f_id int,
  • c_id int,
  • foreign key(f_id) references files(file_id),
  • foreign key(c_id) references clubs(club_id)
  • )
表数据的删除代码
  • SET foreign_key_checks = 0;
  • truncate table clubs
  • truncate table comments
  • truncate table file_club
  • truncate table files
  • truncate table user_club
  • truncate table user_file
  • truncate table users
  • SET foreign_key_checks = 1;

2.前端

前端jsp页面共有14个,分别为:

LoginRegistrationPage.jsp:登录注册页面

prompt.jsp:提示页面,进行一部分增删改查后给出提示并倒计时跳转至相应页面

index.jsp:主页面

ownPage.jsp:个人主页页面,展示有关个人信息

forgetPwd.jsp:忘记密码页面,填写密保后重新设置密码

changePwd.jsp:填写旧密码后填写新密码

myFiles.jsp:我的文件页面,显示我收藏的文件

myClubs.jsp:我的俱乐部页面,显示我加入的俱乐部

addClub.jsp:进行创建俱乐部的操作

addFile.jsp:进行上传文件的操作

club.jsp:显示所有的俱乐部

clubShow.jsp:单独展示俱乐部所拥有的文件

community.jsp:社区,展示所有的文件

fileShow.jsp:单独展示文件内容

3.后端

七个DTO和对应的七个DAO、Service,一个Filter过滤器,二十二个Servlet以及一个帮助类pageHelper。使用的连接池是druid

4.技术讲解

主要讲解Filter过滤器autoLoginAndCheckFilter和session以及cookie

autoLoginAndCheckFilter代码:

  • package Filter;
  • import DTO.User;
  • import Service.UserService;
  • import javax.servlet.*;
  • import javax.servlet.annotation.WebFilter;
  • import javax.servlet.http.Cookie;
  • import javax.servlet.http.HttpServletRequest;
  • import javax.servlet.http.HttpServletResponse;
  • import javax.servlet.http.HttpSession;
  • import java.io.IOException;
  • import java.net.URLDecoder;
  • import java.util.List;
  • @WebFilter("/*")
  • public class autoLoginAndCheckFilter implements Filter {
  • @Override
  • public void init(FilterConfig filterConfig) throws ServletException {
  • }
  • @Override
  • public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
  • // 1.判断前准备
  • // a.将ServletRequest转换成HttpServletRequest
  • HttpServletRequest request = (HttpServletRequest) servletRequest;
  • HttpServletResponse response = (HttpServletResponse) servletResponse;
  • // b.通过request对象获取用户的请求路径
  • String uri = request.getRequestURI();
  • // c.截取uri最后一个/后的路径,即为请求路径
  • String requestPath = uri.substring(uri.lastIndexOf("/") + 1);
  • // 2.判断:如果请求路径是非受限资源则直接放行,如果是受限资源则需要验证用户是否登录
  • // a.受限资源判断
  • if ("".equals(requestPath) || "index.jsp".equals(requestPath)) {
  • //进入if代码,表示此请求是受限资源,需要验证用户是否登录
  • //3.判断session中是否有一次性登录标记,如果有则表示用户已经登录--放行,session没有再判断cookie,cookie有则放行并存入session
  • //如果都没有则表示用户未登录,发送到登录页面,提示请先登录
  • /*****获得session中的值和cookie中的值*****/
  • // 获得session中存入的tempLogin值
  • HttpSession session = request.getSession();
  • String tempLogin = (String) session.getAttribute("tempLogin");
  • // 获得cookie
  • Cookie[] cookies = request.getCookies();
  • String cookieAuto = null;
  • for (int i = 0; cookies != null && i < cookies.length; i++) {
  • if ("cookieAuto".equals(cookies[i].getName())) {// 找到了指定的cookie
  • cookieAuto = cookies[i].getValue();
  • break;
  • }
  • }
  • /*****获得session中的值和cookie中的值*****/
  • // 判断tempLogin中是否有信息,只允许一次登录,登录完销毁,再次访问主页需要填写账号密码
  • if (tempLogin != null) {
  • // 销毁一次性登录标记tempLogin
  • session.removeAttribute("tempLogin");
  • filterChain.doFilter(request, response);
  • }
  • // 如果session中没有tempLogin信息,则判断cookie中有没有信息,有信息再判断在数据库是否有对应信息有则存入session并放行,没有则跳转到登录页面;cookie没有则直接跳转到登录页面
  • else if (cookieAuto != null) {
  • String[] parts = cookieAuto.split("-");
  • String username = parts[0];
  • int count = 0;
  • // 对cookie中的userName值解码
  • username = URLDecoder.decode(username, "utf-8");
  • String password = parts[1];
  • UserService userService = new UserService();
  • List<User> userList = userService.listUser();
  • for (User users : userList) {
  • // 如果cookie值在数据库有对应的值则放行并将sessionAuto存入session
  • if (users.getUserName().equals(username) && users.getUserPwd().equals(password)) {
  • // 此处是为了写项目而写的,重新将user写入session(因为重新部署或重新启动session都会丢失)
  • // ??????????
  • // 保存user值到session中
  • User user = userService.checkUser(username);
  • request.getSession().setAttribute("user", user);
  • // ??????????
  • session.setAttribute("sessionAuto", "yes");
  • filterChain.doFilter(request, response);
  • break;
  • }
  • else {
  • count++;
  • }
  • }
  • // 如果count的数等于userList的成员数量则表明没有,跳转到登录页面
  • if (count == userList.size()) {
  • // 转到登录页面并判断是不是越界查看
  • if (!requestPath.equals("")) {
  • request.setAttribute("tipsHeader", "<label style='color:red;'>请先登录!</label>");
  • }
  • request.getRequestDispatcher("LoginRegistrationPage.jsp").forward(request, response);
  • }
  • }
  • // session没有tempLogin并且cookie也没有cookieAuto则直接跳转到login.jsp
  • else {
  • // 转到登录页面并判断是不是越界查看
  • if (!requestPath.equals("")) {
  • request.setAttribute("tipsHeader", "<label style='color:red;'>请先登录!</label>");
  • }
  • request.getRequestDispatcher("LoginRegistrationPage.jsp").forward(request, response);
  • }
  • }
  • // b.非受限资源直接放行
  • else {
  • filterChain.doFilter(request, response);
  • }
  • }
  • @Override
  • public void destroy() {
  • }
  • }

ps:此过滤器的主要功能是对所有运行的文件进行分析,文件符合条件则放行,否则跳转至登陆页面

有关程序运行逻辑

1.在登录页面LoginRegistrationPage.jsp输入账号、密码验证码,选择勾选自动登录(cookieAuto)或者不勾选(tempLogin)

  • loginServlet.java:自动登录,在cookie添加cookieAuto标记;一次性登录,在session中添加tempLogin标记。

2.在autoLoginAndCheckFilter.java中首先分析是否是受限资源,如果是则获取session和cookie中的值,分析判断是否符合条件,如果符合条件则放行,否则跳转至登陆页面;如果不是受限资源则直接放行

  • autoLoginAndCheckFilter.java:session中有一次性登录标记tempLogin,直接放行并销毁标记;cookie中有cookieAuto,查询数据库并配对成功再放行

3.logoutServlet.java,登出(注销)只需要删除cookieAuto即可

  • 没有cookieAuto,过滤器则会判断不符合条件,跳转至登录页面

注意:每次重新部署或者重启服务器都会导致session中的值消失,而用户的信息都是存在session中,有些页面用到session中的数据,重启后会出错。所以需要重新登录或者回到index主页面,因为过滤器设置了一个后台补充代码(???之间的代码???)

大家使用session和cookie的时候要记住session是存储在服务器中的,cookie是存储到本地的。服务器重启session中的值会消失,而cookie中的值不会消失。就相当于cookie是电脑本地的一个文件夹,东西保存在本地不去删除就不会消失,而session是网络上的文件夹,每次重启服务器,获取的session值都会重新刷新,之前保存在网络上的东西就会丢失。

5.项目图

流程图:
UI设计图:
E-R图:
角色图:

ps:上述图片描述的功能并不完整,代码也还在开发....

方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门