SpringBoot進階學習二(自定義Filter)

最近在學習SpringBoot,用的IDEA進行開發,這個算是進階學習筆記二,但願我這個新手寫的我的心得看法可以幫助到大家!css

1、自定義Filterhtml

      1.建立自定義LoginFilter,實現自Filter接口,以下(前提:建立User實體和UserDao接口就再也不詳細說明):java

      (1)@WebFilter 註解代表這是一個web的過濾器,並設置攔截器的名字和攔截的範圍,「/*」表示攔截全部的請求;web

      (2)@Order表示攔截器的執行順序,值越小越先執行;spring

      (3)loginPage已經在application.properties配置文件中配置,這裏直接使用@Value註解獲取配置文件中loginPage的值;cookie

      (4)excludePatterns表示不須要進行過濾的請求url模式,自行配置;session

      (5)excludeTypes表示不須要進行過濾的請求文件類型,自行配置;
   app

package net.oschina.aibinxiao.filter;

import net.oschina.aibinxiao.dao.UserDao;
import net.oschina.aibinxiao.entity.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @Author: AiBinXiao
 * @Description: 用戶登錄過濾器
 * @Date: 2017/10/25 14:45
 */
@Order(1)
@WebFilter(filterName = "loginFilter", urlPatterns = "/*")
public class LoginFilter implements Filter {

    public static Logger logger = LoggerFactory.getLogger(LoginFilter.class);

    @Autowired
    private UserDao userDao;
    @Value("${loginPage}")
    private String loginPage;
    private String[] excludePatterns = new String[] {"login.html","login","loginout","names"};
    private String[] excludeTypes = new String[] {"js","css","png","jpg","gif","jpeg","ico","do","txt"};

    // 取出url裏文件名的那一段
    private static String url_reg_ex = "(((.*/)(.*)\\?)(.*))|((.*/)(.*))";
    private static Pattern pattern = Pattern.compile(url_reg_ex);

    /**
     * 獲取url中的文件名
     * @param url
     * @return
     */
    private static String getPath(String url) {
        String path = "";
        Matcher matcher = pattern.matcher(url);
        if (matcher.find()) {
            path = matcher.group(4);
            if (path == null) {
                path = matcher.group(8);
            }
        }
        if (path == null) {
            path = "";
        }
        return path;
    }

    /**
     *檢查是不是不須要驗證的url
     * @param url
     * @return
     */
    private boolean inExcludePatterns(String url) {
        boolean match = false;
        String path = getPath(url);
        if (this.excludePatterns != null && this.excludePatterns.length > 0) {
            for(String excludeUrl : this.excludePatterns) {
                if (excludeUrl.equals(path)) {
                    match = true;
                    break;
                }
            }
        }
        if (!match) {
            String type = null;
            if (path.contains(".")) {
                String[] parts = path.split("\\.");
                type = parts[parts.length - 1];
            }
            if (this.excludeTypes != null && this.excludeTypes.length > 0 && type != null) {
                for (String excludeType : this.excludeTypes) {
                    if (type.equals(excludeType)) {
                        match = true;
                        break;
                    }
                }
            }
        }
        return match;
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        logger.info("loginFilter start!");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
                         FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;

        String url = request.getRequestURL().toString();
        if (this.inExcludePatterns(url)) { // 若是是不須要校驗的url
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            HttpSession session = ((HttpServletRequest)servletRequest).getSession(true);
            User user = (User)session.getAttribute("user");
            if (user == null) {
                logger.debug("session has no user");

                // 須要檢查一下cookie
                Cookie[] cookies = request.getCookies();
                if (cookies != null && cookies.length > 0) {
                    for (Cookie cookie : cookies) {
                        if ("userId".equals(cookie.getName())) {
                            String userId = cookie.getValue();
                            user = userDao.findOne(Integer.parseInt(userId));
                            if (user == null) {
                                Cookie newCookie =new Cookie("userId", userId);
                                newCookie.setMaxAge(0);
                                newCookie.setPath("/");
                                response.addCookie(cookie);
                            }
                            break;
                        }
                    }
                }

                // 若是仍是沒有用戶信息,跳去登陸頁
                if (user == null) {
                    logger.debug("no cookie found");
                    ((HttpServletResponse)servletResponse).sendRedirect(((HttpServletRequest) servletRequest).getContextPath() + loginPage);
                    return;
                } else {
                    session.setAttribute("user", user);
                    filterChain.doFilter(servletRequest, servletResponse);
                }
            } else {
                filterChain.doFilter(servletRequest, servletResponse);
            }
        }
    }

    @Override
    public void destroy() {

    }
}

      二、修改SpringBoot的啓動類,加上@ServletComponentScan註解,並添加基礎掃描的包,以下:ide

package net.oschina.aibinxiao;

import com.ailk.osfc.Utils;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.ServletComponentScan;
import org.springframework.boot.web.support.SpringBootServletInitializer;

@SpringBootApplication(scanBasePackages = "net.oschina.aibinxiao")
@ServletComponentScan
public class CmsBookingApplication extends SpringBootServletInitializer{
	public static void main(String[] args) throws Exception {
		SpringApplication.run(CmsBookingApplication.class, args);
	}
}

      到此,啓動項目再次訪問除login.html登陸頁面外,都沒法直接訪問,都會跳轉到login.html登陸頁面。學習

 

本文爲原創文章,若是對你有一點點的幫助,別忘了點贊哦!比心!如需轉載,請註明出處,謝謝!

相關文章
相關標籤/搜索