欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SSH框架网上商城项目第18战之过滤器实现购物登录功能的判断

程序员文章站 2024-03-12 09:26:26
上一节我们做完了购物车的基本操作,但是有个问题是:当用户点击结算时,我们应该做一个登录的判断,判断用户有没有登录,没有登录的话,得首先让用户登录。这就用到了过滤器的技术了,...

上一节我们做完了购物车的基本操作,但是有个问题是:当用户点击结算时,我们应该做一个登录的判断,判断用户有没有登录,没有登录的话,得首先让用户登录。这就用到了过滤器的技术了,过滤器是专门拦截页面请求的,它与拦截器的原理差不多,拦截器是专门拦截action请求的,所以各有所用,如果直接是页面的跳转,不经过action的话,我们只要写一个拦截器即可,如果需要跳转到一个action处理,那么我们就得写一个拦截器。
1. 登录跳转的原理
先说一下实现原理:写一个过滤器,在web.xml中配置一下需要拦截的url,这样的话,当用户的请求url中满足配置的话,就会执行我们自己写的过滤器,在过滤器中,我们首先检查session中有没有登录过的user,如果没有说明没有登录,然后拿到用户想要访问的页面url和参数,重新拼接成url放到session中,然后重定向到登陆页面,登录后跳转到action处理,处理完后跳转到session中保存的url,即原来用户想去的地方。这样就完成了登陆的跳转了。

2. 登录跳转的实现
当现实购物车页面后,我们点击结账,它会自动跳转到订单确认的页面,如下:

SSH框架网上商城项目第18战之过滤器实现购物登录功能的判断

但是此时如果用户没登录,我们肯定不能直接跳到订单确认页面,所以我们要用过滤器拦下来判断一下,下面写过滤器:
2.1 过滤器的实现
过滤器的实现要实现filter接口,并覆写三个方法即可,其实我们主要要覆写其中一个方法即可。如下:

public class userfilter implements filter { 
 
 @override 
 public void destroy() { 
  // todo auto-generated method stub 
 
 } 
 
 @override 
 public void dofilter(servletrequest request, servletresponse response, 
   filterchain chain) throws ioexception, servletexception { 
  httpservletrequest req = (httpservletrequest) request; 
  httpservletresponse res = (httpservletresponse) response; 
  // 判断当前session是否有用户信息 
  if(req.getsession().getattribute("user") == null) { 
   //保存当前客户想要去的url地址 
   string gourl = req.getservletpath();//获得用户想要去的地址 
   string param = req.getquerystring(); //获得地址中携带的参数 
   if(param != null) { 
    gourl = gourl + "?" + param; //重新拼好请求地址+参数 
   } 
   //把当前客户想要访问的地址,存储到session中 
   req.getsession().setattribute("gourl", gourl); 
    
   //非法请求,跳转到登陆页面 
   req.getsession().setattribute("error", "非法请求,请登录!"); 
   res.sendredirect(req.getcontextpath() + "/ulogin.jsp"); 
  } else { 
   //如果有下一个过滤器则跳转,否则直接到目标页面 
   chain.dofilter(request, response); 
  } 
 } 
 
 @override 
 public void init(filterconfig config) throws servletexception { 
  // todo auto-generated method stub 
 
 } 
} 

从实现的代码来看,主要腹泻了dofilter方法,在方法里,首先判断当前session中是否有用户的信息,如果没有,说明没有登录,那么要先将用户想要去的url地址和地址中的参数保存下来,拼成新的url存到session中,然后重定向到登陆页面,让用户登陆。如果session中有用户信息,说明已经登录过了,直接放行到用户想去的页面。
写好了filter,别忘了在web.xml中配置要过滤的url,配置如下:

SSH框架网上商城项目第18战之过滤器实现购物登录功能的判断

所以会过滤上面的${shop}/user/confirm.jsp。接下来我们看看登陆页面,其实就是两个框框,用户名和密码,主要看它跳到哪个action去:

SSH框架网上商城项目第18战之过滤器实现购物登录功能的判断

我们看到,它跳转到了useraction中的login方法去执行逻辑。下面我们实现useraction:
2.2 action的实现
在useraction中,我们首先进行登陆的判断,即在数据库中查找有没有该用户名和密码的用户,如果成功,则将user存到session中,然后返回一个结果,交给struts2处理,代码如下:

@controller("useraction") 
@scope("prototype") 
public class useraction extends baseaction<user> { 
 public string login() { 
  //进行登陆的判断 
  model = userservice.login(model); 
  if(model == null) { 
   session.put("error", "登陆失败"); 
   return "login"; 
  } else { 
   //登录成功,先将用户存储到session中 
   session.put("user", model); 
   //根据session中gourl是否有值而决定页面的跳转 
   if(session.get("gourl") == null) { 
    return "index"; //跳到首页 
   } else { 
    return "gourl"; 
   } 
  } 
 } 
} 

我们看看struts.xml中的配置:

SSH框架网上商城项目第18战之过滤器实现购物登录功能的判断

因为我们把gourl存在session中了,但是在struts.xml中我们不能像在java代码里去拿session,然后拿参数,但是我们可以从值栈中取,上面是从值栈中取数据的方法。
2.3 service层的登陆判断
service层主要就是上面action中用到的login方法,实现比较简单,如下:

//userservice接口 
public interface userservice extends baseservice<user> { 
 //用户登陆,成功返回该user 
 public user login(user user); 
} 
 
//userserviceimpl实现类 
@service("userservice") 
public class userserviceimpl extends baseserviceimpl<user> implements 
  userservice { 
 
 @override 
 public user login(user user) { 
  string hql = "from user u where u.login=:login and u.pass=:pass"; 
  return (user) getsession().createquery(hql) // 
   .setstring("login", user.getlogin()) // 
   .setstring("pass", user.getpass()) // 
   .uniqueresult(); 
 } 
 
} 

好了,这样我们用过滤器实现了用户登录的判断与跳转,登陆过后,就能跳转到订单确认页面了,效果如下:

SSH框架网上商城项目第18战之过滤器实现购物登录功能的判断

SSH框架网上商城项目第18战之过滤器实现购物登录功能的判断

整个流程测试完毕,功能正常。其实这里还可以再完善一点,我们其实应该在加入购物车之前就应该要进行登录判断,也就是说,购物车页面的时候已经是登录状态了,这里是订单确认页面判断登录的。不过在购物车页面前进行判断的话,我们就不好用过滤器了,我们得用拦截器,因为跳转到购物车页面请求的是action,不是普通页面,请求action的时候我们得用拦截器拦截来判断,后期再来完善这里吧,现在先把这里的功能基本实现了再说~好了,登录判断与跳转就做好了。

原文地址:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。