A. @WebFilter怎麼控制多個filter的執行順序
通過實踐發現如果想要控制filer的執行順序可以
通過控制filter的文件名
來控制
比如:
UserLoginFilter.java 和 ApiLog.java 這兩個文件裡面分別是「用戶登錄檢查過濾器」和「介面日誌過濾器」,因為這兩個文件的
首字母A排U之前
,導致每次執行的時候都是先執行「介面日誌過濾器」再執行「用戶登錄檢查過濾器」,所以我們現在修改兩個文件的名稱分別為
Filter0_UserLogin.java
Filter1_ApiLog.java
這樣就能先執行「用戶登錄檢查過濾器」再執行「介面日誌過濾器」
B. 判斷用戶登錄是用springmvc 攔截器還是filter
在struts2中用過filter過濾器,在springmvc中還有攔截器,它們都能過濾請求,但是到底有什麼區別呢?
一、定義
攔截器 :是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。
過濾器:是在javaweb中,你傳入的request、response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者 struts的action前統一設置字元集,或者去除掉一些非法字元.。
二、xml文件配置
1.filter
該過濾器的方法是創建一個類XXXFilter實現此介面,並在該類中的doFilter方法中聲明過濾規則,然後在配置文件web.xml中聲明他所過濾的路徑
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
2.Interceptor
它也要實現HandlerInterceptor 介面,這里只介紹方法註解配置
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,將攔截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 多個攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 如果不配置或/*,將攔截所有的Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
三、具體區別
filter
Interceptor
多個的執行順序
根據filter mapping配置的先後順序
按照配置的順序,但是可以通過order控制順序
規范
在Servlet規范中定義的,是Servlet容器支持的
Spring容器內的,是Spring框架支持的。
使用范圍
只能用於Web程序中
既可以用於Web程序,也可以用於Application、Swing程序中。
深度
Filter在只在Servlet前後起作用
攔截器能夠深入到方法前後、異常拋出前後等
四、總結
兩者的本質區別:攔截器是基於java的反射機制的,而過濾器是基於函數回調。從靈活性上說攔截器功能更強大些,Filter能做的事情,他都能做,而且可以在請求前,請求後執行,比較靈活。Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的參數、安全校驗(比較泛的,比如登錄不登錄之類),太細的話,還是建議用interceptor。不過還是根據不同情況選擇合適的。
C. 校驗用戶是否登錄過濾器Filter
CheckLoginFilter net.cnki.tpi.cms.util.CheckLoginFilter redirectURL /login.jsp notCheckURLList /error.jsp;/login.jsp CheckLoginFilter /* 2、然後新創建一個CheckLoginFilter.java類,代碼如下:
/** * 校驗用戶是否已登錄過濾器 * @author lpz * */ public class CheckLoginFilter implements Filter { private FilterConfig filterConfig = null; private String redirectURL = null; private List notCheckURLList = new ArrayList(); public CheckLoginFilter() { } public void destroy() { notCheckURLList.clear(); } public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; HttpServletResponse response = (HttpServletResponse)servletResponse; HttpSession session = request.getSession(); Object userInfo = session.getAttribute("userInfo"); if(!(request) && userInfo==null){ //重定向到指定頁面 response.sendRedirect(request.getContextPath() + redirectURL); }else{ //繼續響應請求 chain.doFilter(servletRequest, servletResponse); } } public void init(FilterConfig fConfig) throws ServletException { this.filterConfig = fConfig; redirectURL = filterConfig.getInitParameter("redirectURL"); String notCheckURLListStr = filterConfig.getInitParameter("notCheckURLList"); if(!MyStringUtil.isNullOrEmpty(notCheckURLListStr)){ //將字元串轉化為list notCheckURLList = MyStringUtil.convStrToList(notCheckURLListStr,";"); } } /** * 校驗當前請求是否在不過濾的列表中 * @param request * @return */ private boolean (HttpServletRequest request) { String uri = request.getServletPath() + (request.getPathInfo() == null ?
D. 如何使用filter過濾器對入參進行處理(完整版)
前台把參數通過報文或者使用表單、ajax提交到後台,如果我們的請求參數是加密的,那麼我們在controller裡面的每一個方法里都需要進行解密處理。如果方法太多,那就太麻煩了。
使用過濾器,在一個Filter中將 HttpServletRequest 里的所有參數都取出來分別進行過濾然後再放回到該HttpServletRequest 中行不行呢?
通過測試後發現是不行的,因為HttpServletRequest 只提供了getParameter ,而沒有提供setParameter;所以,我們只能自己寫一個HttpServletRequest 方法繼承HttpServletRequestWrapper,然後覆蓋裡面的方法,並且增加我們自己的setParameters方法,這樣我們就可以為所欲為了,最後再在filter中調用該類的方法對參數進行處理(獲取、修改、存儲等等)。
在請求參數到達controller之前,在filter裡面進行解密;這樣,通過簡單的過濾器處理,把需要處理的請求都在過濾器里進行解密操作,這樣就等於實現了自動化處理。
這里我們針對兩種不同的請求方式進行講解:
第一步:新建一個類別
這個類繼承自HttpServletRequestWrapper
通過建立這個類我們就能完成向request對象添加我們處理之後的參數了。
第二步:通過實現filter介面建一個過濾器
第三步:過濾器的配置
方法一、在web.xml文件裡面進行簡單的配置(一般項目)
把我們的過濾器放在該文件中注冊
方法二、springboot項目的配置
新建一個配置類,加上@Configuration註解,在方法頭加上@Bean註解
controller 接收參數代碼:
請求示例代碼:
處理結果:
從結果可以看出,我們成功地通過過濾器對請求的email進行大寫轉小寫處理
第一步:新建一個類別
這個類繼承自HttpServletRequestWrapper
通過建立這個類我們就能完成向request對象添加我們處理之後的參數了。
第二步:通過實現filter介面建一個過濾器
第三步:
方法一、在web.xml文件裡面進行簡單的配置
把我們的過濾器放在該文件中注冊
方法二、springboot項目的配置
新建一個配置類,加上@Configuration註解,在方法頭加上@Bean註解
controller 接收參數代碼:
請求報文示例:
我這里使用的是postman工具進行json參數請求
返回結果:
通過該過濾器,把email轉換從小寫成功。
通過以上操作,我們就成功的創建了一個過濾器。
E. java jsp 中過濾器 filter 有什麼功能
過濾器來,聽名字就自是過濾作用了!!!
就是在瀏覽器發送請求道伺服器,可以先經過過濾器,然後再到我們寫的邏輯部分。
這些過濾器可以實現 表單驗證,用戶許可權等功能。比如一些不合法的表單輸入,就可以再過濾
器中處理不讓他運行我們的後面的邏輯。比如許可權低的用戶不能進入某些頁面或者實現某些功能
F. Spring filter和攔截器的區別和執行順序
Filter的執行順序跟你配置的執行順序是一樣的,執行的話要觸發到才會執行啊
當然要是過濾/*就跟配置順序一樣了
G. filter的使用 java 過濾器的幾種使用方法
過濾器來
過濾器是處於客戶端自與伺服器資源文件之間的一道過濾網,在訪問資源文件之前,通過一系列的過濾器對請求進行修改、判斷等,把不符合規則的請求在中途攔截或修改。也可以對響應進行過濾,攔截或修改響應。
過濾器一般用於登錄許可權驗證、資源訪問許可權控制、敏感詞彙過濾、字元編碼轉換等等操作,便於代碼重用,不必每個servlet中還要進行相應的操作。
H. 判斷用戶登錄是用springmvc 攔截器還是filter
struts2用filter濾器springmvc攔截器都能濾請求底區別呢
、定義
攔截器 :面向切面編程service或者前調用或者調用比態代理攔截器簡單實現調用前列印字元串(或者做其業務邏輯操作)調用列印字元串甚至拋異候做業務邏輯操作
濾器:javaweb傳入request、response提前濾掉些信息或者提前設置些參數再傳入servlet或者strutsaction進行業務邏輯比濾掉非url(login.do址請求用戶沒登陸都濾掉)或者傳入servlet或者 strutsaction前統設置字元集或者除掉些非字元.
二、xml文件配置
1.filter
該濾器創建類XXXFilter實現介面並該類doFilter聲明濾規則配置文件web.xml聲明所濾路徑
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
<filter>
<filter-name>XXXFilter</filter-name>
<filter-class>
com.web.util.XXXFilter
</filter-class>
</filter>
<filter-mapping>
<filter-name>XXXFilter</filter-name>
<url-pattern>*.action</url-pattern>
</filter-mapping>
2.Interceptor
要實現HandlerInterceptor 介面介紹註解配置
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 配置或/*,攔截所Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
<!-- 攔截器 -->
<mvc:interceptors>
<!-- 攔截器,順序執行 -->
<mvc:interceptor>
<mvc:mapping path="/entryOrJsonController/*" /><!-- 配置或/*,攔截所Controller -->
<bean class="com.wy.interceptor.CommonInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
三、具體區別
filter
Interceptor
執行順序
根據filter mapping配置先順序
按照配置順序通order控制順序
規范
Servlet規范定義Servlet容器支持
Spring容器內Spring框架支持
使用范圍
能用於Web程序
既用於Web程序用於Application、Swing程序
深度
FilterServlet前起作用
攔截器能夠深入前、異拋前等
四、總結
兩者本質區別:攔截器基於java反射機制濾器基於函數調靈性說攔截器功能更強些Filter能做事情都能做且請求前請求執行比較靈Filter主要針URL址做編碼事情、濾掉沒用參數、安全校驗(比較泛比登錄登錄類)太細建議用interceptor根據同情況選擇合適
I. 怎麼使用filter實現未登錄用戶自動跳轉到登錄頁面
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
if(req.getSession().getAttribute("user")==null){
req.setAttribute("error", "請你先登錄");
//非法請求才會進到這裡面,在這里保存請求的url地址,在成功登錄後再進行跳轉
req.getSession().setAttribute("goUrl", req.getRequestURL()+"?"+ req.getQueryString());
request.getRequestDispatcher("/ulogin.jsp").forward(request, response);
}
else{
chain.doFilter(request, response);
}
}
上面的代碼是過濾器中的代碼
下面的是servlet中的代碼
if(request.getSession().getAttribute("goUrl")!=null){
String url = (String)request.getSession().getAttribute("goUrl");
response.sendRedirect(url);
}
else{
response.sendRedirect("/webshopping/index.jsp");
}