我在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()
的正确名称。是什么原因?
答案 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();
的调用,这可能是在第一个例子中引发了错误?