日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

160909、Filter多方式拦截、禁用IE图片缓存、Filter设置字符编码

發(fā)布時間:2024/8/24 编程问答 40 如意码农
生活随笔 收集整理的這篇文章主要介紹了 160909、Filter多方式拦截、禁用IE图片缓存、Filter设置字符编码 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。