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登陆页面。学习

 

本文为原创文章,若是对你有一点点的帮助,别忘了点赞哦!比心!如需转载,请注明出处,谢谢!

相关文章
相关标签/搜索