你想要多大的成功,你愿意为这份成功付出什么?
1 . 比较数据库的字段,进行创建 User对象;
public class User {
private int id;
private String username;
private String password;
public User() {
super();
// TODO Auto-generated constructor stub
}
2.创建jsp文件 , 里面写登入网页提交用的from表单;
<body>
${msg }
<form action="${pageContext.request.contextPath }/loginservlet" method="post">
账号 <input type="text" name="username"></br>
密码 <input type="text" name="password"></br>
自动登录 <input type="checkbox" name="autologin"></br>
<input type="submit" value="提交">
</form>
</body>
3.创建loginServlet:
1. 从表单中获取数据,并且封装成一个对象User类;
2. 调用逻辑层方法.然后调用dao层的方法 ,通过user的属性, 去判断数据库中有没有对应的一条数据,有返回true;
2.1 如果有则登录成功, 获取Session, 把表单封装的user对象存储起来,这样可以在下个页面显示( 谁谁谁登录了) --可以请求转发,也可以重新定向; 去一个新的页面
当登录成功, 1. 自己创建cookie保存表单数据( user&password); 2. 设置cookie保存路径("/"); 3. 判断自动登录是否勾上;如果勾上(!=null 或者==on), 设置cookie存活时间, 否则cookie存活时间为零, 5.将cookie添加到响应中去;
2.2: 如果登录失败可以利用request 保存错误的登录信息,然后回写到请求转发的页面上;
package com.lanou3g;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class Loginservlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
// 防止请求数据乱码;
request.setCharacterEncoding("UTF-8");
// 获取参数哦
String username = request.getParameter("username");
String password = request.getParameter("password");
String autologin = request.getParameter("autologin");
User user = new User();
user.setUsername(username);
user.setPassword(password);
// 调用逻辑层方法
UserService service = new UserService();
User u = service.findUser(user);
if (u != null) {
//处理cookie ,将账号密码拼接进去 在访问网页的时候, 就可以处理cookie;
Cookie cookie = new Cookie("user", username+"&"+password);
//整个目录都能用
cookie.setPath("/");
//判断是否点了自动登录
if (autologin!=null) {
//点了 设置cookie的保存时间 on
cookie.setMaxAge(Integer.MAX_VALUE);
}else {
//没点记住我 , 删除cookie
cookie.setMaxAge(0);
}
//将cookie 添加到响应中
response.addCookie(cookie);
// 等录成功
request.getSession().setAttribute("user", u);
request.getRequestDispatcher("/home.jsp").forward(request, response);
} else {
// 登录失败
request.setAttribute("msg", "登录失败");
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
4. service层主要干的事情,调用Dao层中的方法;
package com.lanou3g;
import java.sql.SQLException;
public class UserService {
private UserDao dao = new UserDao();
public User findUser(User user) {
User user2 =null;
try {
user2 = dao.findUser(user);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return user2;
}
}
5.dao层主要干的事情; 1. 获取数据连接池, 2. 获取QueryRunner对象 要使用里面的方法; 主要方法有
queryRunner.query(sql, new BeanHandler<>(User.class), params); //返回一个对象
queryRunner.query(sql, new BeanListHandler<>(User.class), params) //返回对象的集合
queryRunner.query(sql, new ScalarHandler<>(), params); //返回list集合总记录数
6.Filter 主要作用过滤所有jsp, 是浏览器和服务器之间的一道滤网. 需要一个类继承Filter接口
注意: 需要在Xml.web中进行配置, 与servlet配置类似 路径写"/*" 拦截所有jsp;
在本题目作用. 1. 通过判断网址来处理实现实现自动, 如果访问的不是/login.jsp界面,而是home.jsp界面;
通过判断网址尾部是不是.jsp来决定是否拦截;
2. 如果网址尾部不是login.jsp; 获取session 判断session里面有没有值, 如果session里面有值, 说账号正在登陆状态, 我们没办法登陆, 如果session里面保存的user值是null, 那么说明我们没有登陆, 这时我们就可以去获取cookie中的值,
通过遍历cookie,找到里面保存用户名和密码的cookie; 然后取出来,给一个User对象赋值,在去对比数据库里面有没有. 数据库返回来一个user对象不等于null时候, 就可以进行登录了;
这时可以开始自动登录了; 先查询数据库(看看以前保存的用户名和密码有没有被更改, 如果数据库中能找到)
3. 将数据库中返回来的user保存到session然后就可以在下一jsp网页上进行显示了( 主界面);
4. 开始放行;chain.doFilter( request,response );
public class Myfilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 1.把参数转换成httpServletRequset 子类方法比较多;
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
// 通过请求获取到请求网址, 通过请求网址进行判断?http://localhost:8080/sh-web-autologin/login.jsp
// 首先要获取到login.jsp
String uri = req.getRequestURI();/// sh-web-autologin/login.jsp
String path = req.getContextPath();/// sh-web-autologin
String url = uri.substring(path.length());// 获取访问的路径 /login.jsp;
// 判断网址 处理自动登录
if (!url.equals("/login.jsp")) {
// 不是这个我们要写自动登录 访问不是这个页面
// 没登录过 才去自动登录(判断session里面有没有值 有没有user)
// 获取session 判断里面有没有user
User user = (User) req.getSession().getAttribute("user");
if (user == null) {
// 真没登录过, 进行自动登录; 获取cookie里面保存的
Cookie[] cookies = req.getCookies();
// 判断cookie不等于null才去遍历cookie
if (cookies != null) {
String username = "";
String password = "";
for (Cookie cookie : cookies) {
if (cookie.getName().equals("user")) {
// 如果是这个,就取出对应的值
String value = cookie.getValue();
String[] values = value.split("&");
username = values[0];
password = values[1];
}
}
User u = new User();
u.setUsername(username);
u.setPassword(password);
// 自动登录 首先查询数据库, 需要service方法查询数据库
UserService service = new UserService();
User findUser = service.findUser(u);
if (findUser != null) {
// 数据库有值了,进行自动登录, 就是把值放入到session中去
// 此处必须用user, 毕竟欢迎那边用的是user
req.getSession().setAttribute("user", findUser);
}
}
}
}
// 放行
chain.doFilter(request, response);
}
}