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

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

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

但是此时如果用户没登录,我们肯定不能直接跳到订单确认页面,所以我们要用过滤器拦下来判断一下,下面写过滤器:
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,配置如下:

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

我们看到,它跳转到了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中的配置:

因为我们把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();
 } 

}

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

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

原文地址:http://blog.csdn.net/eson_15/article/details/51425010

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

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索ssh
, 框架
, 登录
, 过滤器
网上商城
ssh框架过滤器、ssh框架网上商城、ssh框架实现购物车、ssh框架实现的购物车、ssh框架购物车,以便于您获取更多的相关知识。

时间: 2024-09-20 12:27:49

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

SSH框架网上商城项目第12战之添加和更新商品功能_java

添加商品部分原理和添加商品类别是一样的,参考文章:添加和更新商品类别,不过要比商品类别复杂,因为商品的属性有很多,对应的数据库中的字段也就多了,添加商品还有个选项是上传图片,这一小块内容会在下一篇文章中单独说明,因为这涉及到一个知识点,就是Struts2实现文件上传功能.其他废话不多说了,现在开始完善添加商品部分的代码:1. 添加商品1.1 添加商品的UI实现 首先完成query.jsp中添加商品部分的代码: 接下来我们看save.jsp中的具体实现: <%@ page language="

SSH框架网上商城项目第16战之Hibernate二级缓存处理首页热门显示_java

网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要进入商品的详细信息页面,就像淘宝里面那样.那么每次点击都要去后台查询一下该商品的详细信息,就会发送相应的sql语句,每次刷新一下详细页面也会发sql语句,这样的话,性能肯定会受到很大的影响.那么使用Hibernate的二级缓存就可以解决这个问题. 有些人可能会想,我们可以使用重定向,这样的话,在用户第一次访问的时候把信息查出来放到session中,以后每次用户刷新就可以去session中拿了,这样就不用去数据库中

SSH框架网上商城项目第21战之详解易宝支付的流程_java

这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的API.那么问题来了,使用第三方支付平台最主要的一件事就是获取该平台的API,我们首先得获取他们的API以及开发文档,然后才可以做进一步的开发. 1. 获取易宝的API 获取API的第一步,要在易宝上注册一个账号,这个账号是商家的账号,后面买家付款后,会将钱款存入该账号中,然后商家自己提取到银行卡,易宝

SSH框架网上商城项目第13战之Struts2文件上传功能_java

上一节我们做完了添加和更新商品的功能,这两个部分里有涉及到商品图片的上传,并没有详细解说.为此,这篇文章详细介绍一下Struts2实现文件上传的功能.1. 封装文件信息我们首先得有一个Model来封装文件的信息,这个Model里需要有三个属性:文件.文件类型和文件名.针对我们要传的图片,我们新建一个Model如下: public class FileImage { private File file; private String contentType; private String file

SSH框架网上商城项目第11战之查询和删除商品功能实现_java

在第8节我们完成了查询和删除商品类别的功能,那么现在实现查询和删除商品的功能就很好做了,原理和第8节一模一样,只是修改一些参数,比如请求不同的action等.由于查询和删除商品不需要弹出新的UI窗口,所以我们只要完成完成query.jsp中相应的部分以及相应的后台即可.1. 查询商品功能的实现查询功能主要在查询框中实现,从上一节可知,查询框用的是一个text:"<input id='ss' name='serach' />",我们通过把普通的文本框转化为查询搜索文本框来实现

SSH框架网上商城项目第2战之基本增删查改、Service和Action的抽取_java

上一节<SSH框架网上商城项目第1战之整合Struts2.Hibernate4.3和Spring4.2>我们搭建好了Struts2.Hibernate和Spring的开发环境,并成功将它们整合在一起.这节主要完成一些基本的增删改查以及Service.Dao和Action的抽取.1. Service层的抽取        上一节中,我们在service层简单写了save和update方法,这里我们开始完善该部分的代码,然后对service层的代码进行抽取.1.1 完善CategoryServic

SSH框架网上商城项目第14战之商城首页UI的设计_java

前面我们利用EasyUI和SSH搭建好了后台的基本框架,做好了后台的基本功能,包括对商品类别的管理和商品的管理等,这一节我们开始搭建前台页面. 做首页的思路:假设现在商品的业务逻辑都有了,首先我们需要创建一个监听器,在项目启动时将首页的数据查询出来放到application里,即在监听器里调用后台商品业务逻辑的方法. 1.  首页商品显示逻辑在首页,我们只显示商品热点类别中的前几个商品,比如热点类别有儿童休闲类,女性休闲类,男性休闲类,那我们会有三个板块来显示不同的商品类,每个类别里再显示几个具

SSH框架网上商城项目第8战之查询和删除商品类别功能实现_java

上一节我们完成了使用DataGrid显示所有商品信息,这节我们开始添加几个功能:添加.更新.删除和查询.首先我们实现下前台的显示,然后再做后台获取数据.1. 添加.更新.删除和查询功能的前台实现DataGrid控件里有个toolbar属性,是添加工具栏的,我们可以在toolbar属性中添加这些按钮来实现相应的功能.先看一下官方文档对toolbar的定义: 我们使用数组的方式定义工具栏,在query.jsp页面中新添加如下代码: <%@ page language="java" i

SSH框架网上商城项目第6战之基于DataGrid的数据显示_java

EasyUI中DataGrid以表格形式展示数据,并提供了丰富的选择.排序.分组和编辑数据的功能支持.DataGrid的设计用于缩短开发时间,并且使开发人员不需要具备特定的知识.它是轻量级的且功能丰富.单元格合并.多列标题.冻结列和页脚只是其中的一小部分功能. 1. 回顾一下第4节内容 在第4节中,我们使用EasyUI搭建好了左侧菜单栏,并且通过点击菜单选项在右边弹出对应的选项卡.这节我们来使用DataGrid把右边的选项卡部分做好.先看一下第4节中最后的aindex.jsp文件(也可参见第4节