1

我有在 JBOSS 中运行的服务器。有一个监听所有请求,即所有请求都到达过滤器并从这里Filter传递给其他请求。Servlets我注意到了这一点:

当我使用以下代码时,仅调用了过滤器,但控制权没有传递给相应的 Servlet(当我使用 打印时,过滤器打印正确的 servlet request.getRequestURI()。它还打印请求标头的正确值usernamepassword)

 HttpURLConnection connection=gs.getconnection("send_user_detail");
          connection.setRequestProperty("user", gs.get_login_id());
          connection.setRequestProperty("password", gs.get_pass());
        connection.setRequestProperty("timezone", TimeZone.getDefault().getDisplayName());
            connection.connect();

但是当我使用下面的代码时,控件会传递给相应的Servlet并且工作正常。

 HttpURLConnection connection=gs.getconnection("send_user_detail");
          connection.setRequestProperty("user", gs.get_login_id());
          connection.setRequestProperty("password", gs.get_pass());
        connection.setRequestProperty("timezone", TimeZone.getDefault().getDisplayName());
            //connection.connect();
 ObjectOutputStream out=new ObjectOutputStream(connection.getOutputStream());
          out.writeObject("string"); //some random string not used in the servlet


因此,只有当我在 OutputStream 上写一些东西时,控制才会传递给 servlet。但是connection.connect(),它仍然上升到过滤器,甚至打印出请求的正确名称Servlet。是什么原因?

4

2 回答 2

3

写入请求正文URLConnection意味着一个 HTTP POST 请求。

您的 servlet 显然是在做这项工作doPost(),而不是在doGet().

doGet()如果您希望您的 servlet 对 HTTP GET 请求采取行动,您需要执行该工作。

这与过滤器完全无关。卸下过滤器时,您会遇到完全相同的问题。


与具体问题无关connection.setRequestProperty(),这些行设置请求标头,而不是请求参数。确保您没有滥用标头作为参数(糟糕的设计)。在 POST 的情况下,请求参数应写为请求正文中的 URL 编码查询字符串。

也可以看看:

于 2012-11-12T12:49:58.467 回答
0

过滤器在一个链中工作。过滤器合约是;

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException

通常,过滤器会做一些工作并调用

chain.doFilter(request, response);

请注意,过滤器可以在过滤器链调用之前或之后完成其工作。调用之前的代码在进入的途中被调用,在 servlet 之前。调用之后的代码在 servlet 之后的出路中被调用。

注意链中可以有很多过滤器,并且链是有序的。链中的任何过滤器都可能错过过滤器链调用,这会阻止请求进一步向上传播并最终到达 servlet。

我怀疑在你的情况下这可能是正在发生的事情。

编辑:
刚刚注意到,在您的第二个示例中,您已经注释掉了对connection.connect();可能这在第一个示例中引发错误的调用?

于 2012-11-12T12:37:11.503 回答