<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。