对chain.doFilter(request,response)的理解

他的作用是将请求转发给过滤器链上下一个对象。这里的“下”指的是哪里 ?

指的是下一个filter,如果没有filter那就是你请求的资源。

一般filter都是一个链,web.xml 里面配置了几个就有几个。一个一个的连在一起

request -> filter1 -> filter2 ->filter3 -> .... -> request resource.

下面举一个例子:

input.jsp 是用来提交输入的,当提交后,过滤器检测姓名和年龄,如果整常的话会提交给output.jsp,如果不正常提交给erroroutput.jsp.在此 同时也有一个过滤器,它是用来检测一个页面是否设置了字符编码,如果没有则进行设置。(防止乱码问题存在)。

==================

encodefilter.java

===================

package servletbean;

public class encodefilter implements Filter {

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

if(request.getCharacterEncoding()==null)

{

System.out.println(encoding);

request.setCharacterEncoding(encoding);

}

chain.doFilter(request, response);//到下一个链

}

public void init(FilterConfig fConfig) throws ServletException {

this.config=fConfig;

encoding=fConfig.getInitParameter("encoding");

}

}

==============

input.jsp

==============

<form action="output.jsp" name="form" method="post">

<table>

<tr>

<td>name</td>

<td><input type="text" name="name" /></td>

</tr>

<tr>

<td>age</td>

<td><input type="text" name="age"/></td>

</tr>

<tr>

<td>

<input type="submit" name="ok" value="ok"/>

</td>

</tr>

</table>

</form>

myfilter.java

======================

package servletbean;

import javax.swing.JOptionPane;

public class myfilter implements Filter {

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

response.setContentType("text/html");

response.setCharacterEncoding("GB2312");

PrintWriter out=response.getWriter();

String name="";

String age="";

int age1;

name=request.getParameter("name");

age=request.getParameter("age");

RequestDispatcher dispatch=request.getRequestDispatcher("erroroutput.jsp");    if(name==null||name==""||name==" "||age==null)

{

JOptionPane.showMessageDialog(null,"用户名和年龄输入错误!");

dispatch.forward(request, response);

return;

}

else

{

try

{

age1=Integer.parseInt(age);

}

catch(Exception e)

{

//JOptionPane.showMessageDialog(null,"年龄必须为数字!");

dispatch.forward(request,response);

return;//如果是错误页面就到erroroutput.jsp中

}

}

chain.doFilter(request, response);//这里表示是正确的,也就是说,他回去找下一个链,但是它下面已经没有了,所以就会去跳转页面了,此时要跳转的页面就是action="output.jsp"了。

}

}

================

web.xml

===============

注意:filter是有顺序的

<filter>

<description>

</description>

<display-name>encodefilter</display-name>

<filter-name>encodefilter</filter-name>

<filter-class>servletbean.encodefilter</filter-class>

<init-param>

<param-name>encoding</param-name>

<param-value>GB2312</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>encodefilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

<filter>

<description>

</description>

<display-name>myfilter</display-name>

<filter-name>myfilter</filter-name>

<filter-class>servletbean.myfilter</filter-class>

</filter>

<filter-mapping>

<filter-name>myfilter</filter-name>

<url-pattern>/output.jsp</url-pattern>

</filter-mapping>

时间: 2024-12-16 23:23:49

对chain.doFilter(request,response)的理解的相关文章

chain.doFilter(request,response)含义

过滤器的生命周期一般都要经过下面三个阶段: 初始化 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的. 过滤 过滤器的大多数时间都消耗在这里.doFilter方法被容器调用,同时传入分别指向这个请求/响应链中的 Servlet Request.Servlet Response 和 Filter Chain 对象的引用.然后过滤器就有机

过滤器中的chain.doFilter(request,response)

先来说说过滤器filter的作用,它就相当于公路上的一个关卡,对要通过的拦截下来进行相关操作或放行. dofilter作用[request -> filter1 -> filter2 ->filter3 -> .... -> request resource.] 先写一个简单的没有filter的登录例子,当用户名和密码都是admin时,能跳转到success页面,否则到fail页面. 1.eclipse建立一个web project ,结果目录如下 其中,jsp很简单.在lo

//可以不保存在session中, 并且前面我保存在request,这里session也可以获取 chain.doFilter(request, response); //只有登录名不为空时放行,防止直接登录 成功的页面

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httprequest = (HttpServletRequest)request; HttpServletResponse httpresponse = (HttpServletResponse)res

过滤器chain.doFilter(request,response)的含义

过滤器的生命周期一般都要经过下面三个阶段: 初始化: 当容器第一次加载该过滤器时,init() 方法将被调用.该类在这个方法中包含了一个指向 Filter Config 对象的引用.我们的过滤器实际上并不需要这样做,因为其中没有使用初始化信息,这里只是出于演示的目的. 过滤: 过滤器的大多数时间都消耗在这里.doFilter方法被容器调用, 同时传入分别指向这个请求/响应链中的 Servlet Request.Servlet Response 和 Filter Chain 对象的引用.然后过滤器

Java filter中的chain.doFilter详解

转载: 一.chain.doFilter作用 1.一般filter都是一个链,web.xml 里面配置了几个就有几个.一个一个的连在一起 request -> filter1 -> filter2 ->filter3 -> -. -> request resource. 2.chain.doFilter将请求转发给过滤器链下一个filter , 如果没有filter那就是你请求的资源 二.举例 input.jsp 是用来提交输入的 : 当提交后,过滤器检测姓名和年龄 . 如果

【报文】理解HTTP协议的Request/Response(请求响应)模型

[报文]理解HTTP协议的Request/Response(请求响应)模型 系列目录 [简介]"请求/响应"模型 http://www.cnblogs.com/engraver-lxw/p/7550514.html [原理]理解HTTP协议的Request/Response(请求响应)模型 http://www.cnblogs.com/engraver-lxw/p/7550691.html [报文]理解HTTP协议的Request/Response(请求响应)模型--当前 http:/

java 过滤器Filter中chain.doFilter()之前和之后代码的执行顺序

过滤器拦截到响应url的请求后会先执行doFilter()方法中chain.doFilter()之前的代码,然后执行下一个过滤器或者servelt.紧接着执行chain.doFilter()之后的代码. 一下为两个过滤器的执行顺序: 过滤器一: package com.rskd_yswb.lib.filter; import javax.servlet.*; import java.io.IOException; public class HttpRequestAndResponseFilter

request response 区别

request:有关于客户端请求的信息,都可以由它来取得,例如请求标头.请求方法.请求参数.使用者IP等等信息.response:有关于对客户端请求之响应,可以利用它来设定一些要响应的讯息,例如标题信息.响应状态码等. response: 属于重定向请求: 其地址栏的URL会改变: 会向服务器发送两次请求: sendRedirect用法:       response.sendRedirect("跳转页面路径或需要执行的操作路径");       不保持request中设置属性,也就是

chain.doFilter(req, resp)

web中的Filiter过滤器: 当req不改变时,filiter在web中的配置和顺序没有关系: 但当在filiter中将其改变类型时,会导致其改变的request类型包装层次过多,无法获取其中的参数: 例:http://www.cnblogs.com/springlight/p/6208908.html 上例中在下面代码中改变了request类型 MultipartHttpServletRequest multiReq = multipartResolver.resolveMultipart