1. 程式人生 > >springboot過濾器和攔截器使用

springboot過濾器和攔截器使用

過濾器:

過濾器依賴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