SpringBoot十五:拦截器实现

登录

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

  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/**

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

猜你喜欢

转载自blog.csdn.net/qq_41055045/article/details/102557167