知識(shí)
不管是網(wǎng)站,軟件還是小程序,都要直接或間接能為您產(chǎn)生價(jià)值,我們?cè)谧非笃湟曈X(jué)表現(xiàn)的同時(shí),更側(cè)重于功能的便捷,營(yíng)銷(xiāo)的便利,運(yùn)營(yíng)的高效,讓網(wǎng)站成為營(yíng)銷(xiāo)工具,讓軟件能切實(shí)提升企業(yè)內(nèi)部管理水平和效率。優(yōu)秀的程序?yàn)楹笃谏?jí)提供便捷的支持!
您當(dāng)前位置>首頁(yè) » 新聞資訊 » 網(wǎng)站建設(shè) >
Java Web開(kāi)發(fā)中,自定義過(guò)濾器被執(zhí)行兩次的原因分析及解決辦法
發(fā)表時(shí)間:2012-6-8
發(fā)布人:葵宇科技
瀏覽次數(shù):61
在Java Web開(kāi)發(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開(kāi)發(fā)技術(shù),不受使用了第三方框架的束縛,所有符合標(biāo)準(zhǔn)的Servlet容器都支持這項(xiàng)技術(shù)。URL字符編碼過(guò)濾器是我們經(jīng)常使用的,而權(quán)限控制過(guò)濾器則是過(guò)濾器輕量級(jí)應(yīng)用的常見(jiàn)場(chǎng)景。目前我所開(kāi)發(fā)的一個(gè)項(xiàng)目中就使用了這項(xiàng)技術(shù),然而在開(kāi)發(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):
根據(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)就好辦了,寫(xiě)幾個(gè)正則表達(dá)式,按照requestURI的規(guī)劃進(jìn)行合理的分配,不同的訪問(wèn)URL采用不同的權(quán)限過(guò)濾機(jī)制即可。但是這種方法并不能阻止doFilter方法被調(diào)用兩次,只是代碼在按照我們指定的請(qǐng)求邏輯上運(yùn)行。也許,這就是過(guò)濾器的不足之處。
也許寫(xiě)到這里你會(huì)問(wèn),為什么在web.xml配置文件中url-pattern一定要寫(xiě)成"/*"這種形式呢?寫(xiě)成“/*.do”這種形式不是更好么?我又何嘗不想這樣呢,查了資料并實(shí)踐后才知道,這樣寫(xiě)是不符合JSR-315規(guī)范的。有興趣的朋友可以參閱帖子:
http://topic.csdn.net/u/20100525/12/41569c26-350b-45f9-abc0-2019cbb4641b.html
讀一下JSR 315 12.2 節(jié)的原文
相關(guān)案例查看更多
相關(guān)閱讀
- 云南小程序商城
- 網(wǎng)絡(luò)公司報(bào)價(jià)
- 云南旅游網(wǎng)站建設(shè)
- 昆明小程序哪家好
- 楚雄網(wǎng)站建設(shè)公司
- 前端技術(shù)
- 云南百度小程序
- 百度小程序
- 全國(guó)前十名小程序開(kāi)發(fā)公司
- 網(wǎng)站建設(shè)案例
- 云南小程序開(kāi)發(fā)制作
- 網(wǎng)站建設(shè)開(kāi)發(fā)
- 搜索排名
- 云南手機(jī)網(wǎng)站建設(shè)
- 云南小程序設(shè)計(jì)
- 開(kāi)發(fā)框架
- 網(wǎng)站維護(hù)
- 網(wǎng)站建設(shè)招商
- 網(wǎng)站開(kāi)發(fā)哪家好
- 小程序定制
- 買(mǎi)小程序被騙
- 云南網(wǎng)站建設(shè)方案 doc
- 云南建設(shè)廳官方網(wǎng)站
- 云南小程序開(kāi)發(fā)報(bào)價(jià)
- 出入小程序
- 汽車(chē)拆解系統(tǒng)
- 企業(yè)網(wǎng)站
- 昆明小程序開(kāi)發(fā)聯(lián)系方式
- 大理網(wǎng)站建設(shè)公司
- 國(guó)內(nèi)知名網(wǎng)站建設(shè)公司排名