Tmall_Fore_loginFilter_and_Cart

在查看购物车的时候,会判断一下用户是否登录,登录了才能查看购物车的内容

所以在查看购物车之前,应该进行登录操作,但是又不能确保用户一定会记得登录,那么怎么办呢? 
准备一个过滤器,当访问那些需要登录才能做的页面的时候,进行是否登录的判断,如果不通过,那么就跳转到login.jsp页面去,提示用户登录。

哪些页面需要登录?哪些页面不需要呢?
a. 不需要登录也可以访问的
如:注册,登录,产品,首页,分类,查询等等
b. 需要登录才能够访问的
如:购买行为,加入购物车行为,查看购物车,查看我的订单等等

不需要登录也可以访问的已经确定了,但是需要登录才能够访问,截止目前为止还不能确定,所以这个过滤器就判断如果不是注册,登录,产品这些,就进行登录校验
1. 准备字符串数组 noNeedAuthPage,存放哪些不需要登录也能访问的路径
2. 获取uri
3. 去掉前缀/tmall
4. 如果访问的地址是/fore开头,又不是/foreServlet
4.1 取出fore后面的字符串,比如是forecart,那么就取出cart
4.2 判断cart是否是在noNeedAuthPage 
4.2 如果不在,那么就需要进行是否登录验证
4.3 从session中取出"user"对象
4.4 如果对象不存在,就客户端跳转到login.jsp
4.5 否则就正常执行

package tmall.filter;
 
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
 
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
 
import org.apache.commons.lang.StringUtils;
 
import tmall.bean.OrderItem;
import tmall.bean.User;
import tmall.dao.OrderItemDAO;
 
public class ForeAuthFilter implements Filter{
     
    @Override
    public void destroy() {
         
    }
 
    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) res;
        String contextPath=request.getServletContext().getContextPath();
 
        String[] noNeedAuthPage = new String[]{
                "homepage",
                "checkLogin",
                "register",
                "loginAjax",
                "login",
                "product",
                "category",
                "search"};
         
        String uri = request.getRequestURI();
        uri =StringUtils.remove(uri, contextPath);
        if(uri.startsWith("/fore")&&!uri.startsWith("/foreServlet")){
            String method = StringUtils.substringAfterLast(uri,"/fore" );
            if(!Arrays.asList(noNeedAuthPage).contains(method)){
                User user =(User) request.getSession().getAttribute("user");
                if(null==user){
                    response.sendRedirect("login.jsp");
                    return;
                }
            }
        }
         
        chain.doFilter(request, response);
    }
 
    @Override
    public void init(FilterConfig arg0) throws ServletException {
         
    }
     
}

在web.xml增加对ForeAuthFilter的配置
注:必须加在ForeServletFilter之前

 

购物车页面操作

购物车页面和服务端的交互主要是三个
1. 增加、减少某种产品的数量
2. 删除某种产品
3. 选中产品后,提交到结算页面

一、调整订单数量

点击增加或者减少按钮后,根据 cartPage.jsp中的js代码,会通过Ajax访问/forechangeOrderItem路径,导致ForeServlet.changeOrderItem()方法被调用
1. 判断用户是否登录
2. 获取pid和number
3. 遍历出用户当前所有的未生成订单的OrderItem
4. 根据pid找到匹配的OrderItem,并修改数量后更新到数据库
5. 返回字符串"success"

var page = "forechangeOrderItem";
    $.post(
            page,
            {"pid":pid,"number":num},
            function(result){
                if("success"!=result){
                    location.href="login.jsp";
                }
            }
        );

changeOrderItem方法

public String changeOrderItem(HttpServletRequest request, HttpServletResponse response, Page page) {
    User user =(User) request.getSession().getAttribute("user");
    if(null==user)
        return "%fail";
 
    int pid = Integer.parseInt(request.getParameter("pid"));
    int number = Integer.parseInt(request.getParameter("number"));
    List<OrderItem> ois = orderItemDAO.listByUser(user.getId());
    for (OrderItem oi : ois) {
        if(oi.getProduct().getId()==pid){
            oi.setNumber(number);
            orderItemDAO.update(oi);
            break;
        }
         
    }      
    return "%success";
}

 

二、删除订单项

点击删除按钮后,根据 cartPage.jsp中的js代码,会通过Ajax访问/foredeleteOrderItem路径,导致ForeServlet.deleteOrderItem方法被调用
1. 判断用户是否登录
2. 获取oiid
3. 删除oiid对应的OrderItem数据
4. 返回字符串"success"

var page="foredeleteOrderItem";
$.post(
        page,
        {"oiid":deleteOrderItemid},
        function(result){
            if("success"==result){
                $("tr.cartProductItemTR[oiid="+deleteOrderItemid+"]").hide();
            }
            else{
                location.href="login.jsp";
            }
        }
    );
public String deleteOrderItem(HttpServletRequest request, HttpServletResponse response, Page page){
    User user =(User) request.getSession().getAttribute("user");
    if(null==user)
        return "%fail";
    int oiid = Integer.parseInt(request.getParameter("oiid"));
    orderItemDAO.delete(oiid);
    return "%success";
}

三、提交到结算页面

在选中了购物车中的任意商品之后,结算按钮呈现可点击状态。
点击之后,提交到结算页面,并带上(多个)被选中的OrderItem对象的id

$("button.createOrderButton").click(function(){
        var params = "";
        $(".cartProductItemIfSelected").each(function(){
            if("selectit"==$(this).attr("selectit")){
                var oiid = $(this).attr("oiid");
                params += "&oiid="+oiid;
            }
        });
        params = params.substring(1);
        location.href="forebuy?"+params;
    });

 

 

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值