欧美三级国产三级日韩三级_亚洲熟妇丰满大屁股熟妇_欧美亚洲成人一区二区三区_国产精品久久久久久模特

Java Web開發(fā)中,自定義過(guò)濾器被執(zhí)行兩次的原因分析及解決辦法 - 新聞資訊 - 云南小程序開發(fā)|云南軟件開發(fā)|云南網(wǎng)站建設(shè)-昆明葵宇信息科技有限公司

159-8711-8523

云南網(wǎng)建設(shè)/小程序開發(fā)/軟件開發(fā)

知識(shí)

不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!

您當(dāng)前位置>首頁(yè) » 新聞資訊 » 網(wǎng)站建設(shè) >

Java Web開發(fā)中,自定義過(guò)濾器被執(zhí)行兩次的原因分析及解決辦法

發(fā)表時(shí)間:2012-6-8

發(fā)布人:葵宇科技

瀏覽次數(shù):61

本文出處:http://blog.csdn.net/chaijunkun/article/details/7646338,轉(zhuǎn)載請(qǐng)注明。由于本人不定期會(huì)整理相關(guān)博文,會(huì)對(duì)相應(yīng)內(nèi)容作出完善。因此強(qiáng)烈建議在原始出處查看此文。
在Java Web開發(fā)過(guò)程中,我們可以使用過(guò)濾器和Spring框架提供的攔截器來(lái)對(duì)請(qǐng)求進(jìn)行處理,從而實(shí)現(xiàn)對(duì)整個(gè)Web應(yīng)用的權(quán)限控制。在這里我簡(jiǎn)單介紹一下我在使用過(guò)濾器實(shí)現(xiàn)權(quán)限驗(yàn)證方面的經(jīng)驗(yàn)。
過(guò)濾器作為傳統(tǒng)的Web開發(fā)技術(shù),不受使用了第三方框架的束縛,所有符合標(biāo)準(zhǔn)的Servlet容器都支持這項(xiàng)技術(shù)。URL字符編碼過(guò)濾器是我們經(jīng)常使用的,而權(quán)限控制過(guò)濾器則是過(guò)濾器輕量級(jí)應(yīng)用的常見場(chǎng)景。目前我所開發(fā)的一個(gè)項(xiàng)目中就使用了這項(xiàng)技術(shù),然而在開發(fā)時(shí)遇到了過(guò)濾器被調(diào)用了兩次的問(wèn)題,下面說(shuō)一下我的配置:

在web.xml中我指定了過(guò)濾器:

<!--權(quán)限過(guò)濾器 -->
	<filter>
		<filter-name>permissionFilter</filter-name>
		<filter-class>blog.csdn.net.chaijunkun.PermissionFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>permissionFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

下面是過(guò)濾器的實(shí)現(xiàn)代碼:

package blog.csdn.net.chaijunkun;

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 org.apache.log4j.Logger;

public class PermissionFilter implements Filter {

	private Logger logger= Logger.getLogger(PermissionFilter.class);

	@Override
	public void destroy() {
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain filterChain) throws IOException, ServletException {
		HttpServletRequest request= (HttpServletRequest) req;
		    logger.info("過(guò)濾器被調(diào)用");
		    filterChain.doFilter(request, resp);
		}
		
	}

	@Override
	public void init(FilterConfig config) throws ServletException {
	}

}

結(jié)果當(dāng)我訪問(wèn)了一個(gè)接口后,在控制臺(tái)顯示了兩條“過(guò)濾器被調(diào)用”的提示。后來(lái)在網(wǎng)上尋找原因,偶然看到了有人問(wèn)同樣的問(wèn)題:http://topic.csdn.net/u/20110930/22/d8741022-53eb-4df1-ace0-357f6edabee1.html
按照“xiaobluesky”說(shuō)的方法,打印了一下請(qǐng)求的URL地址:System.out.println(request.getRequestedURI());
發(fā)現(xiàn)兩次打印的內(nèi)容不一樣:
第一次打印的是我請(qǐng)求的Servlet,第二次打印的是/favicon.ico,此時(shí)才恍然大悟,很多瀏覽器都支持“站點(diǎn)圖標(biāo)”的功能。例如我當(dāng)前正在編輯這篇文章,使用的是Chrome瀏覽器,標(biāo)簽頁(yè)上就顯示了一個(gè)這樣的CSDN的圖標(biāo):

CSDN圖標(biāo)

根據(jù)規(guī)范,這個(gè)圖標(biāo)的位置就是在站點(diǎn)根目錄下,命名也必須為favicon.ico。
過(guò)濾器被執(zhí)行兩次的情況僅限于使用Servlet容器既提供靜態(tài)訪問(wèn)支持、又提供動(dòng)態(tài)訪問(wèn)支持的情況,當(dāng)采用動(dòng)靜態(tài)分離的場(chǎng)合(例如apache+tomcat,apache將靜態(tài)請(qǐng)求攔截自己處理,tomcat只處理動(dòng)態(tài)內(nèi)容),這種問(wèn)題自然而然就消失了,因?yàn)樵撜?qǐng)求不會(huì)到達(dá)Servlet容器。


既然知道了原理,解決起來(lái)就好辦了,寫幾個(gè)正則表達(dá)式,按照requestURI的規(guī)劃進(jìn)行合理的分配,不同的訪問(wèn)URL采用不同的權(quán)限過(guò)濾機(jī)制即可。但是這種方法并不能阻止doFilter方法被調(diào)用兩次,只是代碼在按照我們指定的請(qǐng)求邏輯上運(yùn)行。也許,這就是過(guò)濾器的不足之處。


也許寫到這里你會(huì)問(wèn),為什么在web.xml配置文件中url-pattern一定要寫成"/*"這種形式呢?寫成“/*.do”這種形式不是更好么?我又何嘗不想這樣呢,查了資料并實(shí)踐后才知道,這樣寫是不符合JSR-315規(guī)范的。有興趣的朋友可以參閱帖子:
http://topic.csdn.net/u/20100525/12/41569c26-350b-45f9-abc0-2019cbb4641b.html
讀一下JSR 315 12.2 節(jié)的原文

相關(guān)案例查看更多