您当前的位置:首页 > 计算机 > 编程开发 > Java

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

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

项目的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:上述图片描述的功能并不完整,代码也还在开发....

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