【问题标题】:Java Servlet mapping when using a filter使用过滤器时的 Java Servlet 映射
【发布时间】:2015-04-27 01:31:51
【问题描述】:

我对使用 Servlet 和 JSP 很陌生,但我想知道是否有人可以帮助我解决以下问题。

我的问题源于我的 Servlet 没有被调用,我似乎无法弄清楚原因。

目前我的 steup 是我有一个名为 VisitShopFilter 的过滤器类,它检查客户是否在他们访问商店之前登录,如果他们登录,它只是将请求转发到 shop.jsp 页面,如果他们没有然后它将它们转发到 login.jsp 页面。

这是 VisitShopFilter:

   @Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    HttpSession sess = ((HttpServletRequest)servletRequest).getSession();
    if(sess.getAttribute("loggedIn") == null){
            servletRequest.getRequestDispatcher("login.jsp").forward(servletRequest,servletResponse);
            return;
        }
    if(sess.getAttribute("cart") == null){
        sess.setAttribute("cart",new ShoppingCart());
    }
    servletRequest.getRequestDispatcher("shop.jsp").forward(servletRequest,servletResponse);
}

过滤器映射到 URL 模式 /Shop

在 shop.jsp 页面上,我有以下表单:<form onaction="Shop" method = "POST"> <input type = "hidden" name = "itemname" value = "testItem"/> <input type = "hidden" name = "itemprice" value = "10.00"/> <input type = "hidden" name = "itemquantity" value = "1"/> <button type="submit" class="btn btn-default btn-submit">Add to cart</button> </form>

我还有一个名为“Shop”的 Servlet:

    @Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    System.out.println("responding to post");
    if(req.getSession().getAttribute("cart") == null || req.getSession().getAttribute("loggedIn") == null){
        req.getRequestDispatcher("login.jsp").forward(req,resp);
    }

    ShoppingCart cart = (ShoppingCart) req.getSession().getAttribute("cart");
    try{
        cart.addItem(
                req.getParameter("itemname"),
                Double.valueOf(req.getParameter("itemprice")),
                Integer.valueOf(req.getParameter("itemquantity"))
        );
    }catch (NumberFormatException e){
        e.printStackTrace();
    }

    req.getSession().setAttribute("itemNamesInCart",cart.getItemNames());
    req.getSession().setAttribute("itemPricesInCart",cart.getItemPrices());
    req.getSession().setAttribute("itemQuantitiesInCart",cart.getItemQuantities());
    req.getSession().setAttribute("totalItemsInCart",cart.getTotalCartSize());
    req.getSession().setAttribute("totalPurchasePrice",cart.getTotal());

    req.getRequestDispatcher("shop.jsp").forward(req, resp);
}

我的问题是,单击表单的提交按钮时甚至没有打印出“回复帖子”。在我的 web.xml 文件中,我尝试将 servlet 映射到 /Shop、/shop.jsp 和其他一些东西,包括在 GET 和 POST 方法之间切换,但我似乎无法弄清楚我做错了什么。

感谢您的帮助!

【问题讨论】:

  • 请也发布您的 web.xml。
  • 该 POST 请求的 URL 路径是什么?尝试在表单上设置它(也许你想用onaction='Shop' 来做,应该是action='Shop')。
  • 你应该有行 chain.doFilter(request, response);在你的 doFilter 方法中的某个地方。

标签: java jsp servlets


【解决方案1】:

目前我的 steup 是我有一个名为 VisitShopFilter 的过滤器类,它检查客户是否在他们访问商店之前登录,如果他们登录,它只是将请求转发到 shop.jsp 页面,如果他们没有然后它将它们转发到 login.jsp 页面。

坏主意。

过滤器应该是为一组资源提供通用功能的拦截器(例如您如何检查会话)。您应该将实际资源(Servlets/jsps)映射到您的端点。当一个过滤器完成它的工作时,它应该调用chain.doFilter(...) 让请求处理到达它的映射端点。

过滤器应仅针对异常(逻辑、业务或技术)更改请求处理过程(通过调用其他资源)。正如您在代码中已经拥有它一样,它通过调用请求调度程序来实现。

【讨论】:

  • 真的吗?检查会话的身份验证过滤器是一种很常见的模式。
  • 你是对的。但是我在帖子中的哪些地方提出了其他建议?
  • 也许我看错了。似乎“坏主意”仅指即使在非错误情况下(当已经存在会话时)也完成转发的部分。我同意让请求处理恢复(而不是明确转发任何地方)更好(并且可能解决手头未到达 Servlet 的问题)。
  • 谢谢。这正是我的意思。
【解决方案2】:

感谢大家的快速回复。

我已经考虑到你们每个人所说的并设法从那里改进。这两个问题最终是我不小心在 HTML 文件中有 onaction 而不是 action,而且我没有调用 chain.doFilter(req,resp) 方法。

【讨论】:

    猜你喜欢
    • 2011-04-10
    • 2023-03-17
    • 2013-10-05
    • 2012-02-19
    • 2011-06-29
    • 2012-04-24
    • 2019-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多