❶ Spring filter和攔截器的區別和執行順序
Filter的執行順序跟你配置的執行順序是一樣的,執行的話要觸發到才會執行啊
當然要是過濾/*就跟配置順序一樣了
❷ myeclipse新建Filter不自動生成webXml配置怎麼辦
你先這樣試試:
1.新建一個web工程,不要直接點finish,一直點next到如圖所示的頁面。
2.
勾選Generate web.xml.......的選框。
❸ spring mvc用註解方式配置控制器,怎麼出現亂碼
1:表單提交controller獲得中復文參數制後亂碼解決方案
注意: jsp頁面編碼設置為UTF-8
form表單提交方式為必須為post,get方式下面spring編碼過濾器不起效果
[html] view plain
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
[html] view plain
<form action="${ctx}/user/addUser" name="userForm" method="post">
❹ 使用springboot怎麼添加一個filter過濾器
最簡單的方式是自定義一類實現Filter介面,然後增加WebFilter註解,appliaction上增加@ServletComponentScan註解就搞定
@Order(2)
@WebFilter( filterName = "MSecurity", urlPatterns = {"*"})
public class RequestFilter implements Filter {
}
這里我提供一回個java學習-springboot實現自定義WebFilte
希望您可以更上一層樓,望君採納
❺ Java實現攔截HTTP請求的幾種方式
在Java的服務端開發當中,攔截器是很常見的業務場景,這里對Java開發當中幾種常見的攔截器的實現方式進行記錄和分析。案例說明基於Spring Boot環境。
一:實現javax.servlet.Filter介面(使用過濾器方式攔截請求)
import org.springframework.stereotype.Component;import javax.servlet.*;import java.io.IOException;import java.util.Date;@Componentpublic class TimeInterceptor implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {System.out.println("time filter init");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("time filter start");long start = new Date().getTime();filterChain.doFilter(servletRequest, servletResponse);System.out.println("time filter 耗時:"+(new Date().getTime()-start));System.out.println("time filter finish");}@Overridepublic void destroy() {System.out.println("time filter destroy");}}
如使用@Compent註解聲明不需要加入其它配置即可使得攔截器生效,但是默認攔截/*,會攔截所有請求。
二:使用@Bean注入自定義攔截器,依然上面的代碼,去掉@Compent註解,創建TimeWebConfig配置類:
import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import java.util.ArrayList;import java.util.List;@Configurationpublic class TimeWebConfig {@Beanpublic FilterRegistrationBean timeFilter(){FilterRegistrationBean registrationBean = new FilterRegistrationBean();TimeInterceptor interceptor = new TimeInterceptor();registrationBean.setFilter(interceptor);List<String> urls = new ArrayList<>();urls.add("/user/*");registrationBean.setUrlPatterns(urls);return registrationBean;}}
上面這兩種攔截請求的實現是基於JavaEE提供的Filter介面實現的,缺點在於,該攔截器實際上是一個過濾器,執行代碼的方法doFilter只提供了request,response等參數,當請求進入被過濾器攔截的時候,我們並不知道這個請求是由哪個控制器的哪個方法來執行的。
三:使用springMVC提供的攔截器,實現org.springframework.web.servlet.HandlerInterceptor介面:
創建自定義的攔截器:
import org.springframework.stereotype.Component;import org.springframework.web.method.HandlerMethod;import org.springframework.web.servlet.HandlerInterceptor;import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.util.Date;@Componentpublic class MyInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object handler) throws Exception {System.out.println("preHandler");System.out.println(((HandlerMethod) handler).getBean().getClass().getName());System.out.println(((HandlerMethod) handler).getMethod().getName());httpServletRequest.setAttribute("start", new Date().getTime());return true;}@Overridepublic void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {System.out.println("postHandler");Long start = (Long) httpServletRequest.getAttribute("start");System.out.println("time interceptor 耗時:"+(new Date().getTime()-start));}@Overridepublic void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {System.out.println("afterCompletion");Long start = (Long) httpServletRequest.getAttribute("start");System.out.println("time interceptor 耗時:"+(new Date().getTime()-start));System.out.println("ex is:"+e);}}
創建配置類:
import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;@Configurationpublic class WebConfig extends WebMvcConfigurerAdapter {@Autowiredprivate MyInterceptor interceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(interceptor).addPathPatterns("/user/*").excludePathPatterns("/blog/*");}}
此種方式的攔截器當中我們能夠獲取攔截的請求對應的類和方法的相關信息,缺點在於該handler對象無法獲取具體執行方法的參數信息。
四:利用Spring的切面(AOP)實現攔截器:
引入jar包:
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-aop</artifactId></dependency>
創建切片類:
import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import java.util.Date;@Aspect@Componentpublic class TimeAspect {@Around("execution(* com.qinker.controller.UserController.*(..))")public Object handlerControllerMethod(ProceedingJoinPoint point) throws Throwable {System.out.println("time aspect start");long start = new Date().getTime();Object[] args = point.getArgs();for (Object obj : args) {System.out.println("arg is:"+obj);}Object obj = point.proceed();//具體方法的返回值System.out.println("aspect 耗時:"+(new Date().getTime()-start));System.out.println("time aspect end");return obj;}}
aspectj基於AOP實現的攔截器功能十分強大,具體詳解請參考spring官網網站的文檔。
❻ JSP中用filter 過濾某個包中的所有servlet
web.xml中這樣配置:
<servlet>
<servlet-name>Login</servlet-name>
<servlet-class>com.zq.servlet.Login</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Login</servlet-name>
<url-pattern>/servlet/Login</url-pattern>
</servlet-mapping>
或者不配置web.xml在servlet中寫註解:
@WebServlet("/servlet/Login")
配置fliter可以在web.xml中這樣寫:
<filter>
<filter-name>LoginFilter</filter-name>
<filter-class>com.zy.filter.UserLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>LoginFilter</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
或者不配置web.xml在filter中寫註解:
@WebFilter(filterName="/MyFilter",urlPatterns="/servlet/*")
即在所有想過濾的servlet名字前加上「/setvlet」在過濾的時候過濾路徑就可以寫成「/servlet/*」這樣就能過濾所有的Servlet。
❼ spring mvc攔截器與spring攔截器有何區別
在struts2中用過filter過濾器,在springmvc中還有攔截器,它們都能過濾請求,但是到底有什麼區別呢?一、定義攔截器:是在面向切面編程的就是在你的service或者一個方法,前調用一個方法,或者在方法後調用一個方法比如動態代理就是攔截器的簡單實現,在你調用方法前列印出字元串(或者做其它業務邏輯的操作),也可以在你調用方法後列印出字元串,甚至在你拋出異常的時候做業務邏輯的操作。過濾器:是在javaweb中,你傳入的request、response提前過濾掉一些信息,或者提前設置一些參數,然後再傳入servlet或者struts的action進行業務邏輯,比如過濾掉非法url(不是login.do的地址請求,如果用戶沒有登陸都過濾掉),或者在傳入servlet或者struts的action前統一設置字元集,或者去除掉一些非法字元.。二、xml文件配置1.filter該過濾器的方法是創建一個類XXXFilter實現此介面,並在該類中的doFilter方法中聲明過濾規則,然後在配置文件web.xml中聲明他所過濾的路徑XXXFiltercom.web.util.XXXFilterXXXFilter*.actionXXXFiltercom.web.util.XXXFilterXXXFilter*.action2.Interceptor它也要實現HandlerInterceptor介面,這里只介紹方法註解配置三、具體區別filterInterceptor多個的執行順序根據filtermapping配置的先後順序按照配置的順序,但是可以通過order控制順序規范在Servlet規范中定義的,是Servlet容器支持的Spring容器內的,是Spring框架支持的。使用范圍只能用於Web程序中既可以用於Web程序,也可以用於Application、Swing程序中。深度Filter在只在Servlet前後起作用攔截器能夠深入到方法前後、異常拋出前後等四、總結兩者的本質區別:攔截器是基於java的反射機制的,而過濾器是基於函數回調。從靈活性上說攔截器功能更強大些,Filter能做的事情,他都能做,而且可以在請求前,請求後執行,比較靈活。Filter主要是針對URL地址做一個編碼的事情、過濾掉沒用的參數、安全校驗(比較泛的,比如登錄不登錄之類),太細的話,還是建議用interceptor。不過還是根據不同情況選擇合適的。
❽ java 過濾器必須要配置在web.xml中嗎
servlet3.0開始就可以用註解代替web.xml裡面的好多配置了
❾ 請教怎麼用Spring的註解方式把一個Bean注入到過濾器中
參考:
UsersConnectionRepository bean =
(UsersConnectionRepository)WebApplicationContextUtils.
(filterConfig.getServletContext()).
getBean("usersConnectionRepository");
下面是優化的寫法:
UsersConnectionRepository bean = WebApplicationContextUtils.
(filterConfig.getServletContext()).
getBean(UsersConnectionRepository.class);