java学习之jsp第30天(--利用filter实现自动登录--)

你想要多大的成功,你愿意为这份成功付出什么?

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);

	}

}

 

   


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值