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