[java Web]Filter使用,用户30天自动登陆

本文介绍了如何利用Java Web的Filter来实现用户30天自动登录的功能。通过创建Filter拦截所有应用页面,详细讲解了强制类型转换在接口中的应用,并探讨了request.getSession()方法在设置不同参数时的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<p>
使用Filter用户30天自动登陆</p><p>思路:1、在Servlet端新建Login,其中逻辑:</p><p>                                                                  1、用户登陆逻辑;</p><p>                                                                   2、判断勾选“30天自动登录“的的checkbox的value值是否为“true”,表示勾选了</p><p>                                                                         1、session设置。。。。2、依据逻辑结果,转发到相应的jsp界面。</p>

public class Login extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	    /**
	     * 用户登陆
	     */
	    PrintWriter writer = response.getWriter();
	    //获得从客户端post上来的regName和pwd
	    String regName = request.getParameter("regName");
	    String pwd = request.getParameter("pwd");
	    String sql = "SELECT * FROM USER WHERE regName=? AND pwd=?";
	    User user = new User();
	    //从数据库提取数据并返回一个user对象
	    try {
		DataSource ds = JDBCUtils.getDataSource();
		QueryRunner queryrunner = new QueryRunner(ds);
		user = queryrunner.query(sql, new BeanHandler<User>(User.class), regName,pwd);
		
		
	    } catch (PropertyVetoException | SQLException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	    }
	    //根据user对象的状态进行判断并进行响应的跳转
	    if(user==null)
	    {
		//user不存在,提示跳转到注册页面
		writer.println("该用户不存在,请注册!");
		response.setHeader("refresh", "3;url="+request.getContextPath()+"/register.jsp");
	    }else{
		//user存在,表示该用户登陆成功,先在session中存入该用户,用于页面jsp端调用
		request.getSession(false).setAttribute("user", user);
		//判断是否点击了请记住密码这个东西
		if("true".equals(request.getParameter("check"))){
		    //新建一个Cookie,并将其发送给login.jsp
		    Cookie cookie = new Cookie("auto_user",regName+":"+pwd);
		    cookie.setMaxAge(3600*24);
		    cookie.setPath(request.getContextPath());
		    response.addCookie(cookie);    
		}
		writer.println("登陆成功!3秒后跳转~~");
		//response.sendRedirect("index.jsp");
		response.setHeader("refresh", "3;url="+request.getContextPath()+"/index.jsp");
	    }
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
	    doGet(request, response);
	}

}

新建一个Filter,拦截所有在该应用中的页面。

	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		/**
		 * 用户自动登陆,之所以使用过滤器,是因为:
		 *     在登陆成功之后,在保存期限内,无论直接访问那个页面,该用户就处于登陆状态
		 */
	    /**
	     * 需要值得注意的地方是,Filter中的request参数是ServletRequest,而非HttpServletRequest
	     * 需要强行转换。
	     */
	    
	    //转型代码:均为接口,且HttpServletRequest继承于servletRequest。
	    HttpServletRequest HRequest = (HttpServletRequest) request;
	    HttpServletResponse HResponse = (HttpServletResponse) response;
	    //判断是否有Cookie,以及是否有auto_user这个Cookie
	    Cookie[] cookies = HRequest.getCookies();
	    //只有没有登陆,才能做自动登陆
	    /**
	     * HRequest.getSession(false)中的参数的含义:
	     *    true:如果没有Session那么就创建一个Session,并且返回该Session;
	     *    false:如果有Session,那么就返回该Session,如果没有,就返回NULL
	     */
	    
	    if(HRequest.getSession(false)==null||HRequest.getSession().getAttribute("user")==null){
		if(cookies!=null){
			for (int i = 0; i < cookies.length; i++) {
			    Cookie cookie = cookies[i];
			    //如果有auto_user这个Cookie,判断其中regName和pwd是否正确
			    if("auto_user".equals(cookie.getName()));
			    {
				User user = new User();
				//有auto_user这个Cookie,获取regName和pwd
				String regName = cookie.getValue().split(":")[0];
				String pwd = cookie.getValue().split(":")[1];
				//从数据库中做出对比;
				String sql = "SELECT * FROM USER WHERE regName=? AND pwd=?";
				try {
				    QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
				    user = queryRunner.query(sql, new BeanHandler<User>(User.class), regName,pwd);
				} catch (PropertyVetoException | SQLException e) {
				    // TODO Auto-generated catch block
				    e.printStackTrace();
				}
				//对user进行判断
				if(user!=null){
				    //user不为空,则将user设置进入Session中
				   //如果正确,那么就直接将session设置一下。
				    HRequest.getSession(false).setAttribute("user", user);
				 
				}
				break;
			    }
			    
			}
		    }
	    }
	    
	    
	    //无论以上如何,均要放行。
		chain.doFilter(request, response);
	}

以上几点编程的注意点,

一、在

if("auto_user".equals(cookie.getName()));
			    {
				User user = new User();
				//有auto_user这个Cookie,获取regName和pwd
				String regName = cookie.getValue().split(":")[0];
				String pwd = cookie.getValue().split(":")[1];
				//从数据库中做出对比;
				String sql = "SELECT * FROM USER WHERE regName=? AND pwd=?";
				try {
				    QueryRunner queryRunner = new QueryRunner(JDBCUtils.getDataSource());
				    user = queryRunner.query(sql, new BeanHandler<User>(User.class), regName,pwd);
				} catch (PropertyVetoException | SQLException e) {
				    // TODO Auto-generated catch block
				    e.printStackTrace();
				}
				//对user进行判断
				if(user!=null){
				    //user不为空,则将user设置进入Session中
				   //如果正确,那么就直接将session设置一下。
				    HRequest.getSession(false).setAttribute("user", user);
				 
				}
				break;
			    }
这个地方,我们可以这样写

Cookie findC = null;
			if(cs!=null){
				for(Cookie c : cs){
					if("autologin".equals(c.getName())){
						findC = c;
						break;
					}
				}

这样在找到符合额Cookie之后,就直接break掉。执行以下的逻辑代码,可以优化代码(是的代码较为易懂,而不会像自己写额那样,都在一个if语句里面,这样不好看。)


二、

 //转型代码:均为接口,且HttpServletRequest继承于servletRequest。
	    HttpServletRequest HRequest = (HttpServletRequest) request;
	    HttpServletResponse HResponse = (HttpServletResponse) response;

这里的强制转换的理解:父类的应用被强制转换为子类的引用,这里之所以能够强转,均为接口,还未事项实例对象,可以强行转换,我们称之为“向下转型“。


三、

/**
	     * HRequest.getSession(false)中的参数的含义:
	     *    true:如果没有Session那么就创建一个Session,并且返回该Session;
	     *    false:如果有Session,那么就返回该Session,如果没有,就返回NULL
	     */
	    
	    if(HRequest.getSession(false)==null||HRequest.getSession().getAttribute("user")==null){
利用request创建Session对象时,一般使用request.getSession()无参的构造方法,表示:如果过没有session,就创建一个;

                                                            如果使用request.getSession(false or true)的构造方法,表示:

                                                                                                      1、true:和无参的构造方法含义一致;

                                                                                                       2、false:如果没有get到Session,那么就直接返回null,否则返session。


    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值