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

	}

}

 

   


首先,我们需要创建一个用于访问数据库的 JavaBean,假设我们叫它 UserBean。UserBean 需要有以下方法: 1. 用于验证用户登录信息的方法:boolean validate(String username, String password),返回一个 boolean 值表示验证结果是否成功。 2. 用于获取用户信息的方法:User getUser(String username),返回一个 User 对象表示该用户的信息。 其中,User 是一个 JavaBean,存储用户的信息,比如用户名、密码、性别等。 接下来,我们可以编写一个 index.jsp 页面,包含一个表单,用于用户输入用户名、密码和验证码: ```html <html> <head> <title>用户登录</title> </head> <body> <h1>用户登录</h1> <form action="login" method="post"> 用户名:<input type="text" name="username"/><br/><br/> 密码:<input type="password" name="password"/><br/><br/> 验证码:<input type="text" name="verify"/><img src="verifyCode"/><br/><br/> <input type="submit" value="登录"/> </form> </body> </html> ``` 其中,验证码的图片是通过一个 servlet 生成的,我们需要在 web.xml 中配置该 servlet: ```xml <servlet> <servlet-name>VerifyCodeServlet</servlet-name> <servlet-class>com.example.VerifyCodeServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>VerifyCodeServlet</servlet-name> <url-pattern>/verifyCode</url-pattern> </servlet-mapping> ``` 接下来,我们编写一个 LoginServlet 来处理用户登录请求。该 Servlet 首先验证验证码是否正确,然后调用 UserBean 的 validate 方法来验证用户名和密码是否正确,最后根据验证结果进行相应的处理。 ```java @WebServlet("/login") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String username = request.getParameter("username"); String password = request.getParameter("password"); String verifyCode = request.getParameter("verify"); String sessionVerifyCode = (String) request.getSession().getAttribute("verifyCode"); if (!verifyCode.equalsIgnoreCase(sessionVerifyCode)) { request.setAttribute("error", "验证码错误"); request.getRequestDispatcher("/index.jsp").forward(request, response); return; } UserBean userBean = new UserBean(); if (userBean.validate(username, password)) { User user = userBean.getUser(username); request.getSession().setAttribute("user", user); response.sendRedirect("welcome.jsp"); } else { request.setAttribute("error", "用户名或密码错误"); request.getRequestDispatcher("/index.jsp").forward(request, response); } } } ``` 在 LoginServlet 中,我们使用了 request.getSession() 方法来获取 HttpSession 对象,用于保存用户信息。当用户信息验证通过后,我们将用户信息保存在 session 中,并重定向到 welcome.jsp 页面。如果验证失败,则将错误信息保存在 request 中,并转发回 index.jsp 页面。 最后,我们还需要编写一个 VerifyCodeServlet 来生成验证码图片。这里我们使用了第三方库 Kaptcha 来生成验证码图片。在 doGet 方法中,我们将生成的验证码字符串保存在 HttpSession 中,以便后续验证时使用。 ```java public class VerifyCodeServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { HttpSession session = request.getSession(); // 创建验证码图片 Producer producer = new DefaultKaptcha(); String text = producer.createText(); BufferedImage image = producer.createImage(text); // 保存验证码字符串到 session 中 session.setAttribute("verifyCode", text); // 输出验证码图片 response.setContentType("image/png"); ServletOutputStream outputStream = response.getOutputStream(); ImageIO.write(image, "png", outputStream); outputStream.flush(); outputStream.close(); } } ``` 最后,我们需要在 web.xml 中配置 Kaptcha 的 servlet 和 filter: ```xml <servlet> <servlet-name>KaptchaServlet</servlet-name> <servlet-class>com.google.code.kaptcha.servlet.KaptchaServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>KaptchaServlet</servlet-name> <url-pattern>/kaptcha.jpg</url-pattern> </servlet-mapping> <filter> <filter-name>KaptchaFilter</filter-name> <filter-class>com.google.code.kaptcha.servlet.KaptchaFilter</filter-class> <init-param> <param-name>kaptcha.border</param-name> <param-value>no</param-value> </init-param> <init-param> <param-name>kaptcha.textproducer.char.length</param-name> <param-value>4</param-value> </init-param> <init-param> <param-name>kaptcha.textproducer.font.size</param-name> <param-value>30</param-value> </init-param> <init-param> <param-name>kaptcha.image.width</param-name> <param-value>120</param-value> </init-param> <init-param> <param-name>kaptcha.image.height</param-name> <param-value>45</param-value> </init-param> </filter> <filter-mapping> <filter-name>KaptchaFilter</filter-name> <url-pattern>/login</url-pattern> </filter-mapping> ``` 这样,我们就完成了一个简单的用户登录界面,并且实现了验证码功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值