當(dāng)一個(gè)web項(xiàng)目中有多個(gè)連接器,且這些過(guò)慮器對(duì)同個(gè)url進(jìn)行過(guò)慮。這時(shí)就形成了過(guò)慮器鏈/。

在filter的配置當(dāng)中,有兩個(gè)配置:filter,filter-mapping.
Filter-mapping在前,則先執(zhí)行,在后則后執(zhí)行。
<filter>
<filter-name>first</filter-name>
<filter-class>cn.itcast.filter.FirstFilter</filter-class>
</filter>
<filter>
<filter-name>second</filter-name>
<filter-class>cn.itcast.filter.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>second</filter-name>
<url-pattern>/four</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>first</filter-name>
<url-pattern>/four</url-pattern>
</filter-mapping>
過(guò)慮器應(yīng)用之1-設(shè)置request編碼寫一個(gè)過(guò)慮器,對(duì)所有url全部過(guò)慮,/*.在doFilter方法中,設(shè)置request的編碼為utf-8。
一般情況下,這個(gè)過(guò)慮器永遠(yuǎn)是第一個(gè)要執(zhí)行的過(guò)慮器。
最好是通過(guò)配置設(shè)置編碼。<filter><init-param>…
第一步:實(shí)現(xiàn)Filter接口,在doFIlter中接收初始化參數(shù),設(shè)置編碼
package cn.hongxin.filter;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class CharFilter implements Filter {
//聲明編碼的成員變量
PRivate String encoding;
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter("bm");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
//放行,必須要放行。
chain.doFilter(request, response);
}
public void destroy() {
}
}
第二步:將上面的類配置到web.xml
<filter>
<filter-name>char</filter-name>
<filter-class>cn.itcast.filter.CharFilter</filter-class>
<init-param>
<!-- 為了便于配置,在配置文件中設(shè)置編碼 -->
<param-name>bm</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>char</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
對(duì)get可以處理中文
在CharFilter中對(duì)reuqest進(jìn)行包裝。
目的:修改增強(qiáng)getParameter方法,如果是get轉(zhuǎn)碼。
第一步:聲明包裝類:
//聲明包裝類
class MyRequest extends HttpServletRequestWrapper{
public MyRequest(HttpServletRequest request) {
super(request);
}
//增強(qiáng)getParamter
@Override
public String getParameter(String name) {
String val = super.getParameter(name);
if(super.getMethod().equals("GET")){
try {
val = new String(val.getBytes("ISO-8859-1"),super.getCharacterEncoding());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
return val;
}
}
第二步:在doFilter方法中,聲明包裝類的實(shí)例
package cn.hongxin.filter;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class CharFilter implements Filter {
// 聲明編碼的成員變量
private String encoding;
public void init(FilterConfig config) throws ServletException {
encoding = config.getInitParameter("bm");
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
request.setCharacterEncoding(encoding);
response.setContentType("text/html;charset=" + encoding);
// 判斷是否需要包裝
HttpServletRequest req = (HttpServletRequest) request;
if (req.getMethod().equals("GET")) {
request = new MyRequest(req);
}
// 聲明包裝類的實(shí)例
// 放行
chain.doFilter(request, response);
}
public void destroy() {
}
}
// 聲明包裝類
class MyRequest extends HttpServletRequestWrapper {
public MyRequest(HttpServletRequest request) {
super(request);
}
// 增強(qiáng)getParamter
@Override
public String getParameter(String name) {
String val = super.getParameter(name);
try {
val = new String(val.getBytes("ISO-8859-1"),
super.getCharacterEncoding());
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return val;
}
}
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注