`
lyhapple
  • 浏览: 48618 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

安全有效的实现两星期内自动登陆功能(三)

    博客分类:
  • java
阅读更多

 

 前半部分请见安全有效的实现两星期内自动登陆功能(一)

                          安全有效的实现两星期内自动登陆功能(二)

AutoLogonFilter.java

过滤器程序,可在WEB-INF/web.xml中设置过滤规则,本文对过滤规则不作介绍,此程序主要作用是检查用户在上一次登陆时是否保存了Cookie,如果保存了,就处理Cookie信息,并帮助用户自动登陆

本程序主要调用了CookieUtil.java中的读取与自动登陆方法,即readCookieAndLogon方法

 

package cn.itcast.filter;

 

import java.io.IOException;

 

import javax.servlet.Filter;

import javax.servlet.FilterChain;

import javax.servlet.FilterConfig;

import javax.servlet.ServletException;

import javax.servlet.ServletRequest;

import javax.servlet.ServletResponse;

import javax.servlet.http.Cookie;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

import cn.itcast bean.User;

import cn.itcast.util.CookieUtil;

 

public class AutoLogonFilter implements Filter {

      

       public void destroy() {

       }

      

//保存cookie时的cookieName,CookieUtil.java中的设置相同

       private final static String cookieDomainName = “cn.itcast”;

      

       public void doFilter(ServletRequest req, ServletResponse resp,

                     FilterChain chain) throws IOException, ServletException {

              HttpServletRequest request = (HttpServletRequest)req;

              HttpServletResponse response = (HttpServletResponse)resp;

              HttpSession session = request.getSession(true);

              User user = (User)session.getAttribute("user");

             

              //如果封装的user不为空,说明已经登陆,则继续执行用户的请求.下面的就不处理了

              if(user!=null){

                     chain.doFilter(request,response);

                     return;

              }

             

              //user为空,说明用户还没有登陆,就尝试得到浏览器传送过来的Cookie

              Cookie cookies[] = request.getCookies();

              String cookieValue = null;

              if(cookies!=null){

                     for(int i=0;i

                            if (cookieDomainName.equals(cookies[i].getName())) {

                                   cookieValue = cookies[i].getValue();

                                   break;

                            }

                     }

              }

 

              //如果cookieValue为空,也继续执行用户请求

              if(cookieValue==null){

                     chain.doFilter(request,response);

                     return;

              }

 

              //cookieValue不为空执行下面的方法,调用CookieUtil.java中的readCookieAndLogon方法

              try{

                     CookieUtil.readCookieAndLogon(cookieValue, request, response, chain);

              }catch(Exception e){

                     e.printStackTrace();

              }

       }

 

       public void init(FilterConfig arg0) throws ServletException {

       }

}

 

CheckLogonServlet.java

验证用户登陆信息的Servlet,此程序调用了CookieUtil.java中的saveCookie方法

 

package cn.itcast.servlet;

 

/*

 * update 2007.09.23 by lyhapple

 * 检查用户登陆

 * */

 

import java.io.IOException;

 

import javax.servlet.ServletException;

import javax.servlet.http.HttpServlet;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import javax.servlet.http.HttpSession;

 

import cn.itcast.bean.User;

import cn.itcast.dao.UserDAO;

import cn.itcast.factory.DaoImplFactory;

import cn.itcast.util.CookieUtil;

 

public class CheckLogonServlet extends HttpServlet {

 

       public void doGet(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

              doPost(request, response);

       }

 

       public void doPost(HttpServletRequest request, HttpServletResponse response)

                     throws ServletException, IOException {

              request.setCharacterEncoding("utf-8");

              String username = request.getParameter("username").trim();

              String password = CookieUtil.getMD5(request.getParameter("password"));

              String remeberMe = request.getParameter("remeberMe");

              HttpSession session = request.getSession(false);

 

              // 将接收到的用户名传递到UserDaocheckUser方法中,检查用户

              // 返回一个User类型的对象

              UserDAO ud = DaoImplFactory.getInstance();

              User user = ud.selectUserByUsername(username);

              if (user == null) {

                     request.setAttribute("checkUserError","");用户名不存在,请先注册

                     request.getRequestDispatcher("index.jsp").forward(request, response);

                     return;

              }

 

              if(!password.equals(user.getPassword())){

                     request.setAttribute("checkPasswordError","");密码输入错误,请重新输入

                     request.getRequestDispatcher("index.jsp").forward(request, response);

                     return;

              }

             

              //保存Cookie,这里调用了CookieUtil.java中的saveCookie方法,将上面的user对象作为参数传递

              if ("on".equals(remeberMe)) {

                     CookieUtil.saveCookie(user, response);

              }

              //Session中保存用户信息,并转向用户的个人信息页面

              session.setAttribute("user", user);

              request.getRequestDispatcher("User/userInfo.jsp").forward(request,response);

       }

}

 

UserDAO.javaDaoImplFactory.java属于持久层相关的程序,这里就不贴出来了,读者可根据自己需要选择不同的持久层框架,在本程序中只要实现查询用户的功能就可以了

 

转载请注明出处,谢谢!

 

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    教你用Java安全有效的实现两星期内自动登陆功能

    ### 教你用Java安全有效地实现两周内自动登录功能 #### 概述 本文将详细介绍如何使用Java技术安全地实现用户两周内的自动登录功能。自动登录功能为用户提供了一种便捷的体验,允许用户在一定时间内无需重复输入...

    2022年办公自动化实用教程自测题汇编.docx

    20. **Excel的自动填充**:序列如“星期一、星期二、星期三”等可以通过自动填充快速输入,而“第一类、第二类、第三类”这种序列则不能直接自动填充,因为它们不是连续的数字或字母序列。 以上内容详细介绍了办公...

    Laravel (Lumen) 解决JWT-Auth刷新token的问题

    最终,当刷新成功后,客户端会得到一个全新的token,这个token再次具有一个小时的有效期,但通过刷新操作可以延长其有效时间至两个星期。这样做的好处是,避免了用户在每次请求都需要重新登录,提高了用户体验。 ...

    delphi 开发经验技巧宝典源码

    0206 如何在DBGrid中实现复制、粘贴功能 137 0207 在DBGrid中将选中的多行删除 137 0208 在DataGrid中如何使标题文字居中 138 0209 如何把ListBox中的内容拖曳到另一个ListBox中 139 0210 把DBGrid中的数据...

    delphi 开发经验技巧宝典源码06

    0206 如何在DBGrid中实现复制、粘贴功能 137 0207 在DBGrid中将选中的多行删除 137 0208 在DataGrid中如何使标题文字居中 138 0209 如何把ListBox中的内容拖曳到另一个ListBox中 139 0210 把DBGrid中的数据...

    国防科技大学linux授课PPT_12

    要实现每两分钟发送一次当前登录用户数量给用户hexy,可以编写如下的`crontab`条目: ``` */2 * * * * root (echo "current date `date`">/tmp/count; echo "the current user count is:`who | wc -l`">>/tmp/count;...

    C#编程经验技巧宝典

    2 <br>0003 设置程序代码行序号 3 <br>0004 开发环境全屏显示 3 <br>0005 设置窗口的自动隐藏功能 3 <br>0006 根据需要创建所需解决方案 4 <br>0007 如何使用“验证的目标架构”功能 4 ...

    Oracle9i的init.ora参数中文说明

    该参数的值可以是包含在双引号内的任何有效的日期格式掩码。例如: ''MMM/DD/YYYY''。 值范围: 任何有效的日期格式掩码, 但不得超过一个固定长度。 默认值: 派生 nls_timestamp_tz_format: 说明: 与 NLS_TIME_TZ_...

    如何编写批处理文件批处理文件批处理文件

    简明批处理教程22009年10月20日 星期二 下午 05:35 最近对于批处理技术的探讨比较热,也有不少好的批处理程序发布,但是如果没有一定的相关知识恐怕不容易看懂和理解这些批处理文件,也就更谈不上自己动手编写了,古...

Global site tag (gtag.js) - Google Analytics