SpringBoot十五:拦截器实现-解决静态资源无法访问 SpringBoot2.0以上

登录

开发期间模板引擎页面修改以后,要实时生效

  1. 禁用模板引擎的缓存 spring.thymeleaf.cache=false
  2. 页面修改完成以后,ctrl+f9:重新编译
  3. 登录错误消息显示 th:text="${msg}" th:if="${not #string.isEmpty(msg)}"
  4. 登录成功,表单防止重复提交,重定向到组件,然后用组件转发

 

拦截器

注意:拦截器说明,在SpringBoot1.5x时,静态资源在static目录下,访问路径不需要带/static,而且拦截器不会对静态资源拦截;但是SpringBoot2.0x以上时,静态资源会被拦截,并且访问路径需要带上/static,当然拦截器也要放行静态资源;

1、编写拦截器类LoginHandlerInterceptor实现HandlerInterceptor

package com.xue.springbootweb.component;

import org.aopalliance.intercept.Interceptor;
import org.apache.commons.lang.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @Description
 * 登录拦截
 * @Author xuexue
 * @Date 2019/10/14 20:29
 */
public class LoginHandlerInterceptor implements HandlerInterceptor {

    //登录之前进行拦截
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //获得session
        Object status = request.getSession().getAttribute("status");
        if (status == null) {
            //向页面添加错误信息
            request.setAttribute("msg", "没有权限访问");
            //转发到登录页面
            request.getRequestDispatcher("/login").forward(request, response);
            return false;
        }

        //放行
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
}

 

2、注册拦截器(放行登录页面与登录处理页面)

  • MyMvcConfig实现WebMvcConfigurer
  • 重写addInterceptors方法注册

代码如下:

package com.xue.springbootweb.config;

import com.xue.springbootweb.component.LoginHandlerInterceptor;
import com.xue.springbootweb.component.MyLocaleResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.LocaleResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;

/**
 * @Description
 * 扩展SpringMVC功能
 * @Author xuexue
 * @Date 2019/10/14 9:16
 */
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {

    /**
     * 页面控制
     * @param registry
     */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        //跳转至登录页面
        registry.addViewController("/login").setViewName("login");
        registry.addViewController("/login.html").setViewName("login");

        //做重定向到登录处理
        registry.addViewController("/main").setViewName("index.html");
    }

    /**
     * 注册拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //登录页面、登录处理页面不能拦截
        registry.addInterceptor(new LoginHandlerInterceptor()).
                addPathPatterns("/**").
                excludePathPatterns("/login", "/login.html", "/user/login");
    }
}

 

注意:如果SpringBoot在2.0x版本以上则需要放行/static/xx/**(xx根据项目目录而适配,后面图片有讲),并且配上静态资源文件,外部可以直接访问

    /**
     * 登录拦截器
     *
     * @param registry
     */
    public void addInterceptors(InterceptorRegistry registry) {
        String[] excludes = new String[]{"/login", "/login.html", "/user/login", "/static/xx/**"};
        registry.addInterceptor(new MyInterceptor()).
                addPathPatterns("/**").
                excludePathPatterns(excludes);
    }

    /**
     * 添加静态资源文件,外部可以直接访问地址
     *
     * @param registry
     */
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //需要配置1:----------- 需要告知系统,这是要被当成静态文件的!
        //第一个方法设置访问路径前缀,第二个方法设置资源路径
        registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
    }

最后,在html文件还要加上/static/xx/xxx.js这样格式的资源,如:

下面目录项目

html需要如下这么做:

		<link href="/static/asserts/css/bootstrap.min.css" rel="stylesheet">

这样,2.0以上的SpringBoot静态资源就可以访问了。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值