最近在学习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登陆页面。学习
本文为原创文章,若是对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!