springboot2.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) {

    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。