转自:https://blog.csdn.net/eson_15/article/details/51425010

上一节我们做完了购物车的基本操作,但是有个问题是:当用户点击结算时,我们应该做一个登录的判断,判断用户有没有登录,没有登录的话,得首先让用户登录。这就用到了过滤器的技术了,过滤器是专门拦截页面请求的,它与拦截器的原理差不多,拦截器是专门拦截Action请求的,所以各有所用,如果直接是页面的跳转,不经过Action的话,我们只要写一个拦截器即可,如果需要跳转到一个Action处理,那么我们就得写一个拦截器。

1. 登录跳转的原理
        先说一下实现原理:写一个过滤器,在web.xml中配置一下需要拦截的url,这样的话,当用户的请求url中满足配置的话,就会执行我们自己写的过滤器,在过滤器中,我们首先检查session中有没有登录过的user,如果没有说明没有登录,然后拿到用户想要访问的页面url和参数,重新拼接成url放到session中,然后重定向到登陆页面,登录后跳转到Action处理,处理完后跳转到session中保存的url,即原来用户想去的地方。这样就完成了登陆的跳转了。

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

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

2.1 过滤器的实现
        过滤器的实现要实现Filter接口,并覆写三个方法即可,其实我们主要要覆写其中一个方法即可。如下:

 1 public class UserFilter implements Filter {
 2
 3     @Override
 4     public void destroy() {
 5         // TODO Auto-generated method stub
 6
 7     }
 8
 9     @Override
10     public void doFilter(ServletRequest request, ServletResponse response,
11             FilterChain chain) throws IOException, ServletException {
12         HttpServletRequest req = (HttpServletRequest) request;
13         HttpServletResponse res = (HttpServletResponse) response;
14         // 判断当前session是否有用户信息
15         if(req.getSession().getAttribute("user") == null) {
16             //保存当前客户想要去的url地址
17             String goURL = req.getServletPath();//获得用户想要去的地址
18             String param = req.getQueryString(); //获得地址中携带的参数
19             if(param != null) {
20                 goURL = goURL + "?" + param; //重新拼好请求地址+参数
21             }
22             //把当前客户想要访问的地址,存储到session中
23             req.getSession().setAttribute("goURL", goURL);
24
25             //非法请求,跳转到登陆页面
26             req.getSession().setAttribute("error", "非法请求,请登录!");
27             res.sendRedirect(req.getContextPath() + "/ulogin.jsp");
28         } else {
29             //如果有下一个过滤器则跳转,否则直接到目标页面
30             chain.doFilter(request, response);
31         }
32     }
33
34     @Override
35     public void init(FilterConfig config) throws ServletException {
36         // TODO Auto-generated method stub
37
38     }
39 }

从实现的代码来看,主要腹泻了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处理,代码如下:

 1 @Controller("userAction")
 2 @Scope("prototype")
 3 public class UserAction extends BaseAction<User> {
 4     public String login() {
 5         //进行登陆的判断
 6         model = userService.login(model);
 7         if(model == null) {
 8             session.put("error", "登陆失败");
 9             return "login";
10         } else {
11             //登录成功,先将用户存储到session中
12             session.put("user", model);
13             //根据session中goURL是否有值而决定页面的跳转
14             if(session.get("goURL") == null) {
15                 return "index"; //跳到首页
16             } else {
17                 return "goURL";
18             }
19         }
20     }
21 }

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

因为我们把goURL存在session中了,但是在struts.xml中我们不能像在java代码里去拿session,然后拿参数,但是我们可以从值栈中取,上面是从值栈中取数据的方法。

2.3 Service层的登陆判断
        Service层主要就是上面Action中用到的login方法,实现比较简单,如下:

 1 //userService接口
 2 public interface UserService extends BaseService<User> {
 3     //用户登陆,成功返回该User
 4     public User login(User user);
 5 }
 6
 7 //userServiceImpl实现类
 8 @Service("userService")
 9 public class UserServiceImpl extends BaseServiceImpl<User> implements
10         UserService {
11
12     @Override
13     public User login(User user) {
14         String hql = "from User u where u.login=:login and u.pass=:pass";
15         return (User) getSession().createQuery(hql) //
16             .setString("login", user.getLogin()) //
17             .setString("pass", user.getPass()) //
18             .uniqueResult();
19     }
20
21 }

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

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

【SSH网上商城项目实战18】过滤器实现购物登录功能的判断相关推荐

  1. 【SSH网上商城项目实战23】完成在线支付功能

    转自:https://blog.csdn.net/eson_15/article/details/51464415 上一节我们做好了支付页面的显示,从上一节支付页面显示的jsp代码中可以看出,当用户点 ...

  2. 【SSH网上商城项目实战】之环境搭建填坑

    此篇主要是记录我在从零开始走一遍倪升武大神的[SSH网上商城项目实战]过程中遇到的一些坑并记录解决方法.关于这个项目,大家可以去倪升武的博客学习了解,SSH网上商城项目实战请戳倪升武的项目实战专题. ...

  3. 【SSH网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示

    转自:https://blog.csdn.net/eson_15/article/details/51405911 网上商城首页都有热门商品,那么这些商品的点击率是很高的,当用户点击某个热门商品后需要 ...

  4. 【SSH网上商城项目实战21】从Demo中看易宝支付的流程

    这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后,再做实际的开发,因为是一个Demo,所以我没有考虑一些设计模式的东西,就是直接实现支付功能.实现支付功能需要易宝给我们提供的AP ...

  5. 【SSH网上商城项目实战01】整合Struts2、Hibernate4.3和Spring4.2

    转自:https://blog.csdn.net/eson_15/article/details/51277324 今天开始做一个网上商城的项目,首先从搭建环境开始,一步步整合S2SH.这篇博文主要总 ...

  6. 【SSH网上商城项目实战20】在线支付平台的介绍

    之前已经完成了首页的显示,用户添加购物车,确认订单等功能,下面就是支付功能的开发了.用户确认了订单后会直接跳转到支付页面进行在线支付,在线支付需要第三方的接口,这一节主要介绍一些关于第三方支付的内容, ...

  7. 【SSH网上商城项目实战03】使用EasyUI搭建后台页面框架

    转自:https://blog.csdn.net/eson_15/article/details/51312490 前面两节,我们整合了SSH并且抽取了service和action部分的接口,可以说基 ...

  8. 【SSH网上商城项目实战22】获取银行图标以及支付页面的显示

    目录(?)[+] 存储银行图标 1 获取图标名称 2 将图标名称存入application域 支付页面显示 测试一下效果 从上一节的小demo中我们搞清楚了如何跟易宝对接以及易宝的支付流程.这一节我们 ...

  9. 【SSH网上商城项目实战05】完成数据库的级联查询和分页

    上一节我们完成了EasyUI菜单的实现.这一节我们主要来写一下CategoryServiceImpl实现类,完成数据库的级联查询.一般项目从后往前做,先做service(我们没有抽取Dao,最后再抽取 ...

最新文章

  1. 为什么UI线程中创建Handler可以不传Looper?
  2. /* * 编程第三题(20分) 打印所有的水仙花数。所谓水仙花数是指一个三位数,其各位数字的立方和等于该数本身。(例153=1*1*1+3*3*3+5*5*5) */
  3. XSLT 2.0 in .NET
  4. 解决Visual SVN在linux下不能访问的问题
  5. linux下磁盘是硬盘吗,肿么确定linux系统上的硬盘哪个是主盘
  6. CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs
  7. (转)创建X509证书,并获取证书密钥的一点研究
  8. 全国计算机等级考试题库二级C操作题100套(第18套)
  9. python第2位的值_Python组通过匹配元组列表中的第二个元组值
  10. java excel 创建按钮_通过单击Excel按钮在Catia中设计零件
  11. react 组件名称重复_设计可重复使用的React组件
  12. Mybatis mapper代理SqlMapConfig.xml配置详解
  13. Android(java)学习笔记133:Eclipse中的控制台不停报错Can't bind to local 8700 for debugger...
  14. pic12f1823单片机入门_PIC单片机C语言入门实例
  15. java点击登录实现跳转_页面跳转的简单实现(单点登录)
  16. 计算机主机mac地址怎么查,怎么查看电脑的Mac地址
  17. Centos6下Redis学习(一)——Java客户端Lettuce的使用、Springboot整合
  18. cvte在线笔试 android,CVTE在线笔试
  19. Flutter 页面更新流程剖析
  20. A级学科计算机技术,全国学科评估结果出炉 四川高校这些学科进入全国A档

热门文章

  1. Mybatis的入门到精通这一篇文章就够了
  2. 【windows】下Anaconda详细安装过程
  3. php最复杂,php – 什么方法最好构建这个复杂的图
  4. larvel 中的api.php_laravel route api.php 与 web.php 的区别
  5. 修改联想笔记本键盘快捷键
  6. Java案例:生成指定目录下某种类型文件的列表
  7. Java案例:几种方式拷贝文件的耗时比较
  8. 英语学习笔记2019-11-29
  9. 【HDU5156】Harry and Christmas tree,两种离线的做法
  10. 【OJ8462】大盗阿福