最近在學習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登陸頁面。學習
本文爲原創文章,若是對你有一點點的幫助,別忘了點贊哦!比心!如需轉載,請註明出處,謝謝!