美文网首页
springboot2.0+静态资源访问被拦截问题及登录拦截简单

springboot2.0+静态资源访问被拦截问题及登录拦截简单

作者: SmileMylife | 来源:发表于2019-09-29 11:04 被阅读0次

    一、springboot2.0+访问静态资源总是被拦截,而且项目本身并没有自定义拦截器

    springboot1.0访问项目静态资源时,可以默认取static目录下边寻找静态资源,但是升级到springboot2.0后,已经无法利用这种方式正常访问到静态资源了。

    解决方式一:

    在application.properties中添加路径及静态资源配置,但这种方法亲测不行,还是贴上配置方式。

    静态文件路径配置
    spring.resources.static-locations= classpath:/static        //此配置为静态资源的真实路径
    spring.mvc.static-path-pattern=/resources/static/**        //此配置为访问静态资源的url配置
    

    解决方式二:

    使用静态资源映射器,此种方式,需要继承WebMvcConfigurationSupport类。

    package com.example.springboot;
    
    import com.alibaba.druid.support.http.StatViewServlet;
    import org.mybatis.spring.annotation.MapperScan;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.transaction.annotation.EnableTransactionManagement;
    import org.springframework.web.method.support.HandlerMethodArgumentResolver;
    import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
    
    import java.util.List;
    
    @SpringBootApplication
    @MapperScan(value = "com.example.springboot.dao")
    @EnableTransactionManagement
    public class SpringbootApplication extends WebMvcConfigurationSupport {
    
        @Autowired
        HandlerMethodArgumentResolver handlerMethodArgumentResolver;
    
        public static void main(String[] args) {
            SpringApplication.run(SpringbootApplication.class, args);
        }
    
        //druid连接池页面配置
        @Bean
        public ServletRegistrationBean<StatViewServlet> druidStatViewServlet() {
            ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
            registrationBean.addInitParameter("allow", "127.0.0.1");// IP白名单 (没有配置或者为空,则允许所有访问)
            registrationBean.addInitParameter("deny", "");// IP黑名单 (存在共同时,deny优先于allow)
            registrationBean.addInitParameter("loginUsername", "root");
            registrationBean.addInitParameter("loginPassword", "1234");
            registrationBean.addInitParameter("resetEnable", "false");
            return registrationBean;
        }
    
        /**
         * 原先的参数映射器是加在xml中进行配置的,使用springboot的时候需要用这种方式进行配置
         * 此处使用webmvcConfigurerAdapter可以正常使用
         *
         * @param argumentResolvers
         */
        @Override
        public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
            argumentResolvers.add(handlerMethodArgumentResolver);
        }
    
        /**
         * 静态资源映射器,需要注意的是:这种方式为在全局的基础上配置,如果要自定义
         * 类去继承该类,别忘了要打上@configuration注解
         * @param registry
         */
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
        }
    }
    

    二、登录拦截的简单实现。

    1.基于上述代码,依旧重写SpringbootApplication类的addInterceptors方法,此方法为应用程序添加请求拦截器。

    /**
         * 服务请求拦截器,通过excludePathPatterns过滤掉不需要拦截的请求,或者通过addPathPatterns添加需要拦截的请求,设置为/*则拦截所有请求,如果只配置/则是精确匹配
         * @param registry
         */
        @Override
        protected void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new LoginInterceptor()).excludePathPatterns("/loginPage");     //请求登录页面不做拦截
        }
    

    以上内容针对请求进行了拦截,当用户直接请求登录页面时,不做拦截,否则会出现用户未登录而无限拦截请求情况。

    2.拦截器实现

    package com.example.springboot.common.interceptor;
    
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.ServletException;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    import java.io.IOException;
    
    /**
     * Created by ZhangPei on 2019/9/29.
     */
    public class LoginInterceptor implements HandlerInterceptor {
        /**
         * 在请求被处理之前做的事情
         * @param request
         * @param response
         * @param handler
         * @return
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException, ServletException {
            StringBuffer requestURL = request.getRequestURL();
            System.out.println("本次请求url为:" + requestURL);
    
            HttpSession session = request.getSession();
            boolean isLogin = false;
            if (session != null) {
                //如果用户登录成功,则会把用户的sessionID和塞进session中
                Object loginFlag = session.getAttribute(session.getId());
                if (loginFlag instanceof Boolean) {
                    isLogin = (boolean) loginFlag;
                }
            }
            if (!isLogin) {
                response.sendRedirect("/loginPage");
            }
            return isLogin;
        }
    
        /**
         * 在服务器受理请求后,但在渲染视图层之前做的事情
         * @param request
         * @param response
         * @param handler
         * @param modelAndView
         */
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws ServletException, IOException {
    
        }
    
        /**
         * 在视图层渲染之后做的事情
         * @param request
         * @param response
         * @param handler
         * @param ex
         */
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) {
    
        }
    }
    

    相关文章

      网友评论

          本文标题:springboot2.0+静态资源访问被拦截问题及登录拦截简单

          本文链接:https://www.haomeiwen.com/subject/ejcfpctx.html