springboot過濾器和攔截器使用
阿新 • • 發佈:2019-02-20
過濾器:
過濾器依賴servlet容器,在spring boot中新增自己的Servlet有兩種方法,程式碼註冊Servlet和註解自動註冊(Filter和Listener也是如此)。
一、程式碼註冊通過ServletRegistrationBean、 FilterRegistrationBean 和 ServletListenerRegistrationBean 獲得控制。
也可以通過實現 ServletContextInitializer 介面直接註冊。
二、在 SpringBootApplication 上使用@ServletComponentScan 註解後,Servlet、Filter、Listener 可以直接通過 @WebServlet、@WebFilter、@WebListener 註解自動註冊,無需其他程式碼。
基於註解註冊:(編寫自定義過濾器然後在springboot主類加上@ServletComponentScan)
package com.yc.filter; import com.yc.util.SessionAttributeKey; import javax.servlet.*; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @WebFilter(filterName = "LoginFilter", urlPatterns = {"/*"}) public class LoginFilter implements Filter { private static String mainPage = "/"; /** * 封裝,不需要過濾的list列表 */ protected static List<Pattern> patterns = new ArrayList<Pattern>(); @Override public void init(FilterConfig filterConfig) throws ServletException { patterns.add(Pattern.compile("/")); patterns.add(Pattern.compile("/swagger-ui.html")); patterns.add(Pattern.compile("/login")); patterns.add(Pattern.compile("/toyc.action")); patterns.add(Pattern.compile("back/user/login.action")); patterns.add(Pattern.compile("front/index.action")); patterns.add(Pattern.compile("front/content.action")); patterns.add(Pattern.compile("front/login.action")); patterns.add(Pattern.compile("front/reg.action")); patterns.add(Pattern.compile("front/fatie.action")); patterns.add(Pattern.compile("front/bankuai.action")); patterns.add(Pattern.compile("back/huifu/findAllHuifu.action")); patterns.add(Pattern.compile("back/huifu/addHuifu.action")); patterns.add(Pattern.compile("back/bankuai/findAllBankuai.action")); patterns.add(Pattern.compile("back/tiezi/findAllTiezi.action")); patterns.add(Pattern.compile("ueditor/third-party/zeroclipboard/ZeroClipboard.swf")); patterns.add(Pattern.compile("ueditor/dialogs/emotion/emotion.html")); patterns.add(Pattern.compile("ueditor/dialogs/image/image.html")); patterns.add(Pattern.compile("back/user/sendEmail.action")); patterns.add(Pattern.compile("back/user/regUser.action")); patterns.add(Pattern.compile("back/user/logins.action")); patterns.add(Pattern.compile(".*\\.[(js)||(css)||(png)||(ico)||(jpg)||(gif)||(xls)||(pdf)||(doc)]+")); } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length()); if (url.startsWith("/") && url.length() > 1) { url = url.substring(1); } if (isInclude(url)) { chain.doFilter(httpRequest, httpResponse); return; } else { HttpSession session = httpRequest.getSession(); if (session.getAttribute(SessionAttributeKey.LOGIN_ADMIN) != null) { // session存在 chain.doFilter(httpRequest, httpResponse); return; } else { // session不存在 準備跳轉失敗 String path = httpRequest.getScheme() + "://" + httpRequest.getServerName() + ":" + httpRequest.getServerPort() + httpRequest.getContextPath(); httpResponse.getWriter().print("<script>location.href='" + path + mainPage + "'</script>"); return; } } } @Override public void destroy() { } /** * 是否需要過濾 * * @param url * @return */ private boolean isInclude(String url) { for (Pattern pattern : patterns) { Matcher matcher = pattern.matcher(url); if (matcher.matches()) { return true; } } return false; } }
基於程式碼註冊:
import org.slf4j.LoggerFactory; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Created by mazhenhua on 2016/12/27. * * 過濾器 */ public class SessionFilter implements Filter { private static final org.slf4j.Logger logger = LoggerFactory.getLogger(SessionFilter.class); /** * 封裝,不需要過濾的list列表 */ protected static List<Pattern> patterns = new ArrayList<Pattern>(); @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) servletRequest; HttpServletResponse httpResponse = (HttpServletResponse) servletResponse; logger.info("aaaaaaaaaa"); String url = httpRequest.getRequestURI().substring(httpRequest.getContextPath().length()); if (url.startsWith("/") && url.length() > 1) { url = url.substring(1); } if (isInclude(url)){ chain.doFilter(httpRequest, httpResponse); return; } else { HttpSession session = httpRequest.getSession(); if (session.getAttribute("") != null){ // session存在 chain.doFilter(httpRequest, httpResponse); return; } else { // session不存在 準備跳轉失敗 /* RequestDispatcher dispatcher = request.getRequestDispatcher(path); dispatcher.forward(request, response);*/ chain.doFilter(httpRequest, httpResponse); return; } } } @Override public void destroy() { } /** * 是否需要過濾 * @param url * @return */ private boolean isInclude(String url) { for (Pattern pattern : patterns) { Matcher matcher = pattern.matcher(url); if (matcher.matches()) { return true; } } return false; } }
/**
* 配置過濾器 如果有多個可以通過order屬性,來設定執行順序
* @return
*/
@Bean
public FilterRegistrationBean someFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(sessionFilter());
registration.addUrlPatterns("/*");
registration.addInitParameter("paramName", "paramValue");
registration.setName("sessionFilter");
return registration;
}
/**
* 建立一個bean
* @return
*/
@Bean(name = "sessionFilter")
public Filter sessionFilter() {
return new SessionFilter();
}
攔截器:
spring攔截器分兩種一種是HandlerInterceptor,一種MethodInterceptor,這裡介紹前一種:
@Component
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
return false;
}
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
}
}
@Configuration
public class LoginConfigurtion extends WebMvcConfigurerAdapter{
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/*")
.excludePathPatterns("/user/login");
}
}
不過springboot2.0和spring5.0就廢棄了WebMvcConfigurerAdapter,目前解決方法有兩種:
1. 直接實現WebMvcConfigurer(官方推薦)
2. 繼承WebMvcConfiguractionSupport