转自: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网上商城项目实战16】Hibernate的二级缓存处理首页的热门显示

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

  3. 【SSH网上商城项目实战27】域名空间的申请和项目的部署及发布

     转自:https://blog.csdn.net/wwww_com/article/details/54405355 前面陆陆续续的完成了网上商城的一些基本功能,虽然还有很多地方有待完善,但是不影响 ...

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

         转自: https://blog.csdn.net/eson_15/article/details/51447492 这一节我们先写一个简单点的Demo来测试易宝支付的流程,熟悉这个流程后, ...

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

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

  6. 【SSH网上商城项目实战30】项目总结

      转自:https://blog.csdn.net/eson_15/article/details/51479994 0. 写在前面 项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了 ...

  7. 【SSH网上商城项目实战30】项目总结(附源码下载地址)

    项目基本完成了,加上这个总结,与这个项目相关的博客也写了30篇了,积少成多,写博客的过程是固化思路的一个过程,对自己很有用,同时也能帮助别人.顺便说个题外话,在学习的过程中肯定会遇到很多异常出现,我们 ...

  8. 【SSH网上商城项目实战15】线程、定时器同步首页数据(类似于博客定期更新排名)

    转自:https://blog.csdn.net/eson_15/article/details/51387378 上一节我们做完了首页UI界面,但是有个问题:如果我在后台添加了一个商品,那么我必须重 ...

  9. 【SSH网上商城项目实战25】使用java email给用户发送邮件

       转自: https://blog.csdn.net/eson_15/article/details/51475046 当用户购买完商品后,我们应该向用户发送一封邮件,告诉他订单已生成之类的信息, ...

随机推荐

  1. LOJ#162. 快速幂 2(分块)

    题面 传送门 题解 orzljz 我们分块,设\(s=\sqrt{p}+1\),那么\(x^a\)可以拆成\((x^s)^{a/s}\)和\(x^{a\bmod s}\),\(O(s)\)预处理,\( ...

  2. 微信小程序ofo小黄车+thinkphp5.0打造全栈应用

    原文地址:https://www.imooc.com/article/20310 ofo至今还没有微信小程序(很费解),每次用ofo都得去支付宝,很不方便,我用微信用的比较多,无意间在简书上面看到某人 ...

  3. leetcode-733-Flood Fill

    题目描述: An image is represented by a 2-D array of integers, each integer representing the pixel value ...

  4. Python pip离线部署

    因为生产环境不能联网,必须使用离线部署pip包,倒也不用部署Pypi镜像那么大工作量,其实蛮简单的,贴出了备忘 pip download -r requirements.txt -d packages ...

  5. Mac下运行git报错"xcrun: error: invalid active developer path .."

    错误:xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun ...

  6. SQL Server性能监控常用语句

    .查找目前SQL Server所执行的SQL语法,并展示资源情况: SELECT s2.dbid , DB_NAME(s2.dbid) AS [数据库名] , --s1.sql_handle , ( ...

  7. [大数据入门] Cloudera-Hadoop 理论

    Hadoop 发明者Doug Cutting Cloudera Hadoop 是基于Java 开发的集群环境,所以每个节点都需要安装Java 运行环境(即JDK),通过Cloudera Manager ...

  8. (转)zabbix3.4使用percona-monitoring-plugins监控mysql

    原文:https://blog.csdn.net/yanggd1987/article/details/79656771 简介 之前主要使用nagios监控mysql,本文主要介绍使用percona- ...

  9. Android进程管理

    1.进程按照优先级分为不同的等级FVSBE Foreground process前台进程:用户可看到进程里某个activity界面(可以获得焦点的) Visible process可见进程:用户仍可见 ...

  10. VMware里Ubuntu-14.04-desktop的VMware Tools安装图文详解

    不多说,直接上干货!    前期步骤,请见如下 VMware里Ubuntukylin-14.04-desktop的VMware Tools安装图文详解 我这里,直接,是来说明,Ubuntu-14.04 ...