项目的github地址:youzelian/shareFiles: javaweb项目 (github.com)
示例:
整个项目由三部分组成:数据库,前端,后端。
- 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;
前端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:单独展示文件内容
七个DTO和对应的七个DAO、Service,一个Filter过滤器,二十二个Servlet以及一个帮助类pageHelper。使用的连接池是druid
主要讲解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)
2.在autoLoginAndCheckFilter.java中首先分析是否是受限资源,如果是则获取session和cookie中的值,分析判断是否符合条件,如果符合条件则放行,否则跳转至登陆页面;如果不是受限资源则直接放行
3.logoutServlet.java,登出(注销)只需要删除cookieAuto即可
注意:每次重新部署或者重启服务器都会导致session中的值消失,而用户的信息都是存在session中,有些页面用到session中的数据,重启后会出错。所以需要重新登录或者回到index主页面,因为过滤器设置了一个后台补充代码(???之间的代码???)
大家使用session和cookie的时候要记住session是存储在服务器中的,cookie是存储到本地的。服务器重启session中的值会消失,而cookie中的值不会消失。就相当于cookie是电脑本地的一个文件夹,东西保存在本地不去删除就不会消失,而session是网络上的文件夹,每次重启服务器,获取的session值都会重新刷新,之前保存在网络上的东西就会丢失。
ps:上述图片描述的功能并不完整,代码也还在开发....