在什么条件下控件从java中的Filter传递到Servlet?

时间:2012-11-12 12:28:43

标签: java servlets servlet-filters

我在JBOSS中运行服务器。有一个Filter可以满足所有请求,即所有请求都会进入过滤器并从此处传递给其他Servlets。我注意到了这一点:

当我使用下面的代码时,只调用过滤器但控件没有传递给相应的Servlet(当我使用{{1打印时,过滤器打印出正确的servlet它还会打印请求标题request.getRequestURI()username)的正确值

password

但是当我使用以下代码时,控件会传递到相应的 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


所以当我在OutputStream上写东西时,控件只传递给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 ,它仍然会转到过滤器,甚至会打印所请求的connection.connect()的正确名称。是什么原因?

2 个答案:

答案 0 :(得分:3)

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

您的servlet显然正在doPost()中完成工作,而不是doGet()

如果希望servlet对HTTP GET请求起作用,则需要在doGet()中执行作业。

这与过滤器完全无关。删除过滤器时会遇到完全相同的问题。


对具体问题

无关connection.setRequestProperty()行设置请求标头,而不是请求参数。确保您没有滥用标题作为参数(糟糕的设计)。如果POST的请求参数应该在请求体中写为URL编码的查询字符串。

另见:

答案 1 :(得分:0)

过滤器在链中工作。过滤合同是;

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

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

chain.doFilter(request, response);

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

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

我怀疑你的情况可能就是这件事。

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