免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開APP
userphoto
未登錄

開通VIP,暢享免費(fèi)電子書等14項(xiàng)超值服

開通VIP
如何在自定義Filter中優(yōu)雅的實(shí)現(xiàn)靜態(tài)資源放行
        在javaweb開發(fā)中,過濾器Filter比較常用于類似登錄的攔截等場景。但是,當(dāng)過濾器的配置不當(dāng)時(shí)就會(huì)把所有的請求都攔截,靜態(tài)資源也會(huì)被攔截掉,導(dǎo)致靜態(tài)頁面加載不出來。
一般的解決方案是在過濾器代碼中對所有的靜態(tài)資源放行,但這樣硬編碼的方式特別不靈活,代碼復(fù)用性也不高。下面說個(gè)更優(yōu)雅點(diǎn)的方案。

一、解決方案

        如果將靜態(tài)資源放行的功能做成在web.xml中可以直接配置的話,就比較方便了。因此我們可以采用配置Filter的init-param的方式來配置那些資源不需要過濾器攔截,然后在過濾器Filter中的init方法去取這個(gè)配置的init-param。 具體的還是直接上代碼吧。

二、代碼

(1)web.xml中Filter的配置代碼片段如下
        這里的重點(diǎn)是配置了一個(gè)init-param
x
14
1
  <!--身份驗(yàn)證、登錄、權(quán)限-->
2
  <filter>
3
    <filter-name>authorityFilter</filter-name>
4
    <filter-class>com.hk.uc.client.filter.RestAuthorizeFilter</filter-class>
5
    <init-param>
6
        <!-- 配置不需要被登錄過濾器攔截的鏈接,只支持配后綴、前綴 及全路徑,多個(gè)配置用逗號分隔 -->
7
        <param-name>excludedPaths</param-name>
8
        <param-value>/pages/*,*.html,*.js,*.ico</param-value>
9
    </init-param>
10
  </filter>
11
  <filter-mapping>
12
    <filter-name>authorityFilter</filter-name>
13
    <url-pattern>/*</url-pattern>
14
  </filter-mapping>
(2)自定義Filter的代碼如下
        代碼解釋如下:
  • 首先我聲明了excludedPaths用來接收web.xml中配置的init-param
  • init()方法中把init-param的值賦值給excludedPaths
  • 寫一個(gè)方法用來判斷是否是直接放行的請求,這里寫了isFilterExcludeRequest()這個(gè)方法
  • doFilter()這個(gè)方法中,先調(diào)用isFilterExcludeRequest()這個(gè)方法,判斷是否應(yīng)該直接放行。如果不是直接放行才走我們的邏輯代碼
94
1
import java.io.IOException;
2
import javax.servlet.Filter;
3
import javax.servlet.FilterChain;
4
import javax.servlet.FilterConfig;
5
import javax.servlet.ServletException;
6
import javax.servlet.ServletRequest;
7
import javax.servlet.ServletResponse;
8
import javax.servlet.http.HttpServletRequest;
9
import javax.servlet.http.HttpServletResponse;
10
import com.kangxiinfo.framework.common.util.StringUtils;
11
12
/**
13
 * 身份認(rèn)證過濾器
14
 * @author ZENG.XIAO.YAN
15
 * @time   2018-10-19 14:07:44
16
 * @version  v1.0
17
 */
18
public class RestAuthorizeFilter implements Filter {
19
    /**
20
     * 不需要被過濾器攔截的頁面 ,主要用于靜態(tài)資源的放行
21
     * 在web.xml中配置filter的init-param
22
     */    
23
    private String excludedPaths; 
24
    private String [] excludedPathArray;
25
26
    @Override
27
    public void init(FilterConfig filterConfig) throws ServletException {
28
        // 初始化時(shí)讀取web.xml中配置的init-param
29
        excludedPaths = filterConfig.getInitParameter("excludedPaths");
30
        if(!StringUtils.isNullOrBlank(excludedPaths)){
31
            excludedPathArray = excludedPaths.split(",");
32
        }
33
    }
34
    
35
    @Override
36
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
37
                         FilterChain filterChain) throws IOException, ServletException {
38
        HttpServletRequest request = (HttpServletRequest) servletRequest;
39
        HttpServletResponse response = (HttpServletResponse) servletResponse;
40
        // 判斷是否是直接放行的請求
41
        if (!isFilterExcludeRequest(request)) {
42
            // TODO 這里寫你的過濾器處理邏輯
43
        }
44
        filterChain.doFilter(servletRequest, servletResponse);
45
    }
46
47
    
48
    @Override
49
    public void destroy() {
50
        // TODO Auto-generated method stub
51
    }
52
53
    /**
54
     * 判斷是否是 過濾器直接放行的請求
55
     * <br/>主要用于靜態(tài)資源的放行
56
     * @param url
57
     * @return
58
     */
59
    private boolean isFilterExcludeRequest(HttpServletRequest request) {
60
        if(null != excludedPathArray && excludedPathArray.length > 0) {
61
            String url = request.getRequestURI();
62
            for (String ecludedUrl : excludedPathArray) {
63
                if (ecludedUrl.startsWith("*.")) {
64
                    // 如果配置的是后綴匹配, 則把前面的*號干掉,然后用endWith來判斷
65
                    if(url.endsWith(ecludedUrl.substring(1))){
66
                        return true;
67
                    }
68
                } else if (ecludedUrl.endsWith("/*")) {
69
                    if(!ecludedUrl.startsWith("/")) {
70
                        // 前綴匹配,必須要是/開頭
71
                        ecludedUrl = "/" + ecludedUrl;
72
                    }
73
                    // 如果配置是前綴匹配, 則把最后的*號干掉,然后startWith來判斷
74
                    String prffixStr = request.getContextPath() + ecludedUrl.substring(0, ecludedUrl.length() - 1);
75
                    if(url.startsWith(prffixStr)) {
76
                        return true;
77
                    }
78
                } else {
79
                    // 如果不是前綴匹配也不是后綴匹配,那就是全路徑匹配
80
                    if(!ecludedUrl.startsWith("/")) {
81
                        // 全路徑匹配,也必須要是/開頭
82
                        ecludedUrl = "/" + ecludedUrl;
83
                    }
84
                    String targetUrl = request.getContextPath() + ecludedUrl;
85
                    if(url.equals(targetUrl)) {
86
                        return true;
87
                    }
88
                }
89
            }
90
        }
91
        return false;
92
    }
93
}
94

三、小結(jié)

(1)通過解決這個(gè)問題,學(xué)會(huì)了filter的init-param該怎么玩
(2)后續(xù)可以直接復(fù)用這個(gè)代碼了,靜態(tài)資源的放行直接在web.xml中配置。
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊舉報(bào)。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Servlet中的過濾器(攔截器)Filter與監(jiān)聽器Listener的作用和區(qū)別
Servlet過濾器和監(jiān)聽器知識總結(jié)
J2EE設(shè)計(jì)模式淺談(2)
java SSH中防止非法登錄 過濾器的使用
Filter技術(shù)的應(yīng)用(轉(zhuǎn))
一個(gè)servlet登陸過濾器
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服