160909、Filter多方式拦截、禁用IE图片缓存、Filter设置字符编码
dispatcher多方式攔截
我們來看一個例子
我們定義一個index.jsp,里面有一個鏈接跳轉(zhuǎn)到dispatcher.jsp頁面
<body>
<a href="dispatcher.jsp">To Test Page</a>
</body>
我們來看下dispatcher.jsp頁面,轉(zhuǎn)發(fā)到test.jsp頁面
<body>
<jsp:forward page="/test.jsp"></jsp:forward>
</body>
我們來看下test.jsp頁面,僅僅輸入一行文字而已
<body>
Test Page
</body>
當(dāng)dispatcher.jsp頁面,轉(zhuǎn)發(fā)到test.jsp頁面,我們是做2個攔截filter,我們看下web.xml中的配置吧
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>com.safly.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>com.safly.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
Filter過濾器對應(yīng)的實例代碼如下:
HelloFilter
package com.safly;
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 HelloFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("before helloFilter'chain");
chain.doFilter(request, response);
System.out.println("after hellofilter'chain");
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
SecondFilter
package com.safly;
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 SecondFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("before secondFilter'chain");
chain.doFilter(request, response);
System.out.println("after secondFilter'chain");
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
我們點擊上面的連接地址
咦為啥?為什么沒有起到攔截作用呢?
原來默認(rèn)的是Request方式,點擊鏈接是轉(zhuǎn)發(fā)的方式,那么我們怎么實現(xiàn)轉(zhuǎn)發(fā)的方式,也通過過濾器攔截呢?我們只需要在web.xml文件中,進(jìn)行修改,對SecondFilter和HelloFilter均做處理
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>com.safly.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>com.safly.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
before helloFilter'chain
before secondFilter'chain
after secondFilter'chain
after hellofilter'chain
我們在進(jìn)行修改,只對SecondFilter做處理
<filter>
<filter-name>HelloFilter</filter-name>
<filter-class>com.safly.HelloFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>HelloFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
</filter-mapping>
<filter>
<filter-name>SecondFilter</filter-name>
<filter-class>com.safly.SecondFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecondFilter</filter-name>
<url-pattern>/test.jsp</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>REQUEST</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>ERROR</dispatcher>
</filter-mapping>
before secondFilter'chain
after secondFilter'chain
解決ie瀏覽器圖片緩存的問題
ie模式是圖片緩存的,那么我們怎么設(shè)置無緩存呢?
我們定義一個b.jsp,里面有一個超鏈接,跳轉(zhuǎn)到a.jsp
<body>
<a href="a.html">TO AAA PAGE</a>
</body>
我們再來看下a.jsp
<body>
<a href="b.html">TO BBB PAGE</a>
<img alt="" src="Desert.jpg">
</body>
默認(rèn)ie是自帶緩存的,我們需要定義Filter過濾器進(jìn)行設(shè)置,那我們先看下web.xml中的過濾器設(shè)置吧
<filter>
<display-name>NoCacheFilter</display-name>
<filter-name>NoCacheFilter</filter-name>
<filter-class>com.safly.NoCacheFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>NoCacheFilter</filter-name>
<url-pattern>/cache/*</url-pattern>
</filter-mapping>
/cache/*代表對cache目錄下的所有頁面進(jìn)行設(shè)置操作
HttpFilter
package com.safly;
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;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 自定義的 HttpFilter, 實現(xiàn)自 Filter 接口
*/
public abstract class HttpFilter implements Filter {
/**
* 用于保存 FilterConfig 對象.
*/
private FilterConfig filterConfig;
/**
* 不建議子類直接覆蓋. 若直接覆蓋, 將可能會導(dǎo)致 filterConfig 成員變量初始化失敗
*/
@Override
public void init(FilterConfig filterConfig) throws ServletException {
this.filterConfig = filterConfig;
init();
}
/**
* 供子類繼承的初始化方法. 可以通過 getFilterConfig() 獲取 FilterConfig 對象.
*/
protected void init() {}
/**
* 直接返回 init(ServletConfig) 的 FilterConfig 對象
*/
public FilterConfig getFilterConfig() {
return filterConfig;
}
/**
* 原生的 doFilter 方法, 在方法內(nèi)部把 ServletRequest 和 ServletResponse
* 轉(zhuǎn)為了 HttpServletRequest 和 HttpServletResponse, 并調(diào)用了
* doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
*
* 若編寫 Filter 的過濾方法不建議直接繼承該方法. 而建議繼承
* doFilter(HttpServletRequest request, HttpServletResponse response,
* FilterChain filterChain) 方法
*/
@Override
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
doFilter(request, response, chain);
}
public abstract void doFilter(HttpServletRequest request, HttpServletResponse response,
FilterChain filterChain) throws IOException, ServletException;
@Override
public void destroy() {}
}
NoCacheFilter
package com.safly;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class NoCacheFilter extends HttpFilter {
@Override
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
System.out.println("cacheFilter's doFilter..");
response.setDateHeader("Expires",-1);
response.setHeader("Cache-Control","no-cache");
response.setHeader("Pragma","no-cache");
filterChain.doFilter(request, response);
}
}
這樣就實現(xiàn)了ie瀏覽器的非緩存設(shè)置
過濾器-字符編碼
a.jsp輸入name提交到b.jsp
<body>
<form action="b.jsp" method="post">
name: <input type="text" name="name"/>
<input type="submit" value="Submit"/>
</form>
</body>
b.jsp顯示輸入的用戶名
<body>
Hello: ${param.name }
</body>
如果輸入中文字符可能出現(xiàn)亂碼,如下的情況
我們需要進(jìn)行過濾器設(shè)置
<context-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</context-param>
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.safly.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>/encoding/*</url-pattern>
</filter-mapping>
EncodingFilter
package com.safly;
import java.io.IOException;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class EncodingFilter extends HttpFilter{
private String encoding;
@Override
protected void init() {
encoding = getFilterConfig().getServletContext().getInitParameter("encoding");
}
@Override
public void doFilter(HttpServletRequest request,
HttpServletResponse response, FilterChain filterChain)
throws IOException, ServletException {
System.out.println(encoding);
request.setCharacterEncoding(encoding);
filterChain.doFilter(request, response);
}
}
依然用上例進(jìn)制瀏覽器圖片緩存的HttpFilter基類
瀏覽器輸出
總結(jié)
以上是生活随笔為你收集整理的160909、Filter多方式拦截、禁用IE图片缓存、Filter设置字符编码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2017年信和大金融春节口令红包使用规则
- 下一篇: Docker部署Jenkins 2.28