SpringBoot拦截器实现登录拦截的方法示例

源码

创新互联是一家集网站建设,封丘企业网站建设,封丘品牌网站建设,网站定制,封丘网站建设报价,网络营销,网络优化,封丘网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

GitHub:https://github.com/291685399/springboot-learning/tree/master/springboot-interceptor01

SpringBoot拦截器可以做什么

可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等

SpringBoot拦截器实现登录拦截

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

  4.0.0
  
    org.springframework.boot
    spring-boot-starter-parent
    2.0.0.RELEASE
    
  
  com.wyj
  springboot-interceptor01
  0.0.1-SNAPSHOT
  springboot-interceptor01
  springboot拦截器

  
    1.8
  

  
    
    
      org.springframework.boot
      spring-boot-starter-web
    
    
      org.springframework.boot
      spring-boot-starter-test
      test
    
    
      org.springframework.boot
      spring-boot-devtools
      runtime
      true
    

    
    
      org.projectlombok
      lombok
      true
    

    
    
      org.springframework.boot
      spring-boot-starter-thymeleaf
    
  

  
    springboot-interceptor01
    
      
        org.springframework.boot
        spring-boot-maven-plugin
      
    
  

WebMvcConfigurer:继承WebMvcConfigurationSupport类,重写addInterceptors方法

/**
 * 在springboot2.0.0之后,WebMvcConfigurerAdapter已经过时了
 * 会使用WebMvcConfigurer或者WebMvcConfigurationSupport替代
 *
 * @author wyj
 * @create 2019-06-01 21:48
 */
@Configuration
public class WebMvcConfigurer extends WebMvcConfigurationSupport {

  /**
   * 在springboot2.0.0之前继承WebMvcConfigurerAdapter类,重写addInterceptors方法
   *
   * @param registry
   */
//  @Override
//  public void addInterceptors(InterceptorRegistry registry) {
//    /**
//     * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行
//     */
//    registry.addInterceptor(new AuthorityInterceptor())
//        .addPathPatterns("/user/**");
//    super.addInterceptors(registry);
//  }

  /**
   * 在springboot2.0.0之后实现WebMvcConfigurer接口,重写addInterceptors方法
   *
   * @param registry
   */
//  @Override
//  public void addInterceptors(InterceptorRegistry registry) {
//    /**
//     * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行
//     */
//    registry.addInterceptor(new AuthorityInterceptor())
//        .addPathPatterns("/user/**");
//  }

  /**
   * 在springboot2.0.0之后继承WebMvcConfigurationSupport类,重写addInterceptors方法
   *
   * @param registry
   */
  @Override
  protected void addInterceptors(InterceptorRegistry registry) {
    /**
     * 拦截器按照顺序执行,如果不同拦截器拦截存在相同的URL,前面的拦截器会执行,后面的拦截器将不执行
     */
    registry.addInterceptor(new AuthorityInterceptor())
        .addPathPatterns("/user/**");
    super.addInterceptors(registry);
  }
}

AuthorityInterceptor:实现HandlerInterceptor接口,重写preHandle、postHandle、afterCompletion方法

  • preHandle:在请求处理之前进行调用(Controller方法调用之前)
  • postHandle:请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
  • afterCompletion:在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
@Slf4j
public class AuthorityInterceptor implements HandlerInterceptor {

  private static final Set NOT_INTERCEPT_URI = new HashSet<>();//不拦截的URI

  static {
    NOT_INTERCEPT_URI.add("/user/login.html");
    NOT_INTERCEPT_URI.add("/user/login");
  }

  /**
   * 在请求处理之前进行调用(Controller方法调用之前)
   */
  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
               Object object) throws Exception {
    String uri = request.getRequestURI();
    if (NOT_INTERCEPT_URI.contains(uri)) {
      log.info("不拦截" + uri);
      return true;
    }
    log.info("拦截" + uri);
    HttpSession session = request.getSession();
    UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session");
    if (userInfo == null) {
      throw new RuntimeException("用户未登陆");
    }
    return true;
  }

  /**
   * 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
   */
  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object object, ModelAndView mv) throws Exception {
  }

  /**
   * 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行
   * (主要是用于进行资源清理工作)
   */
  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object object, Exception ex) throws Exception {
  }
}

UserController:

@Controller
@RequestMapping(value = "/user")
public class UserController {

  @RequestMapping(value = "/login.html")
  public String index() {
    return "login";
  }

  @RequestMapping(value = "/login")
  public String login(User user) {
    //查询数据库,我这里直接写死
    User dbUser = new User(1, "zhangsan", "123456", "admin");
    if (dbUser.getPassword().equals(user.getPassword())) {
      UserInfo userInfo = new UserInfo(dbUser.getId(), dbUser.getUsername(), dbUser.getRole());
      HttpSession session = getRequest().getSession();
      session.setAttribute("user_info_in_the_session", userInfo);
      return "admin";
    }
    return "login";
  }

  @RequestMapping(value = "/userInfo")
  @ResponseBody
  public String userInfo() {
    HttpSession session = getRequest().getSession();
    UserInfo userInfo = (UserInfo) session.getAttribute("user_info_in_the_session");
    return userInfo.toString();
  }

  private HttpServletRequest getRequest() {
    return ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
  }
}

User:

@Data
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {

  private int id;
  private String username;
  private String password;
  private String role;

}

UserInfo: 用于存在用户信息储存在session中

@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserInfo implements Serializable {

  private int id;
  private String username; 
  private String role;

}

login.html:只是一个很简单的登录表单




  
  登陆页面


登陆:
用户名:
密   码:

admin.html:




  
  首页


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持创新互联。


名称栏目:SpringBoot拦截器实现登录拦截的方法示例
本文链接:http://cdiso.cn/article/iieihp.html

其他资讯