自定义登录拦截器 HandlerInterceptor


一、在项目根目录 建立 config 包,该包中主要存放 springboot配置 等java文件。

1.新建一个LoginHandlerInterceptor  检查登录的拦截器,该类要实现 HandlerInterceptor 接口  代码如下:

package com.example.springboot01.config;

import org.springframework.web.servlet.HandlerInterceptor;

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

public class LoginHandlerInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("拦截器生效"+ request.getContextPath() + "被拦截!!");

        if(request.getSession().getAttribute("username")==null)  //检查用户是否登录
         {
             request.setAttribute("msg","未登录,不能使用系统!!");
             request.getRequestDispatcher("/").forward(request,response);//未登录直接将请求发送到 登录页面
             return false;
         }
         else
         {
             return true;
         }

    }
}

 2.在该包下 新建 myMvcConfig.java  实现 WebMvcConfigurer 接口   具体代码如下:

package com.example.springboot01.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration  //必须加此注解
public class myMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(  ViewControllerRegistry registry)
    {
        registry.addViewController("/").setViewName("login");// 将首页映射到 login 视图
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry)   //必须覆盖该方法
{
//将刚才新建的拦截器 在此处注册 registry.addInterceptor(
new LoginHandlerInterceptor()) .addPathPatterns("/**").excludePathPatterns("/","/login.html","/hello.html","/login"); // .addPathPatterns("/**") 表示匹配所有文件 。 excludePathPatterns("/","/login.html","/hello.html","/login"); 排除 首页 登录页面 } }

 目录结构如下图所示

3.在 template 文件夹中新建 login.html 代码如下:

 1 DOCTYPE html>
 2 <html lang="en"
 3       xmlns="http://www.w3.org/1999/xhtml"
 4       xmlns:th="http://www.thymeleaf.org">
 5 <head>
 6     <meta charset="UTF-8">
 7     <title>Titletitle>
 8 head>
 9 <body>
10 <form th:action="@{/login}"  method="post"  >
11      <div th:text="${msg}"  th:if="${not #strings.isEmpty(msg)}"> div>
12     <div> 用户名:<input type="text" name="username" />div>
13     <div> 密  码: <input type="password" name="password" />   div>
14 
15     <input type="submit" value="登录.."  />
16 form>
17 body>
18 html>

 4.在项目根目录新建 controller 包 ,目录结构如下图:

 5. 在controller 中新建 HomeController  代码如下:

 1 package com.example.springboot01.controller;
 2 
 3 import com.example.springboot01.pojo.User;
 4 import org.springframework.beans.factory.annotation.Autowired;
 5 import org.springframework.stereotype.Controller;
 6 import org.springframework.ui.Model;
 7 import org.springframework.util.StringUtils;
 8 import org.springframework.web.bind.annotation.RequestMapping;
 9 import org.springframework.web.bind.annotation.RequestParam;
10 import javax.servlet.http.HttpServletRequest;
11 import javax.servlet.http.HttpServletRequest;
12 import javax.servlet.http.HttpSession;
13 import java.util.*;
14 
15 @Controller
16 public class HomeController {
17    @Autowired   //自动注入 request
18            HttpServletRequest request;
19 @Autowired //自动注入 session
20   HttpSession   session=null;
21 @RequestMapping("/hello")
22     public  String  hello()
23     {
24          request.setAttribute("hello"," !!!");
25          List lists=new ArrayList<>() ;
26         User u=new User(1001,"葛洪");
27         User u1=new User(1002,"李四");
28         User u2=new User(1003,"张三");
29         lists.add(u);
30         lists.add(u1);
31         lists.add(u2);
32         request.setAttribute("lists",lists);
33         request.setAttribute("curUser", new User());
34         return "hello";
35     }
36 
37     @RequestMapping("/login")
38     public String login(@RequestParam("username") String username,@RequestParam("password") String password , Model model)
39     {
40          if( StringUtils.isEmpty(username) ) {
41              model.addAttribute("msg","用户名不能为空!!"); return "login";
42          }
43         if(StringUtils.isEmpty(password))
44         {
45             model.addAttribute("msg","密码不能为空!!"); return "login";
46         }
47         if(username.equals("szk") && password.equals("123")) //用户名和密码都符合条件 将用户名放入 session中存储
48         {
49 
50             session.setAttribute("username",username);
51             return "redirect:/main";
52         }else
53         {
54             model.addAttribute("msg","用户名或密码错误!!");
55 
56             return "/login";
57         }
58     }
59 
60     @RequestMapping("/main")
61     public String main(   Model model)
62     {
63         
64         ArrayList   list=new ArrayList ();
65 
66         list.add(new User(1,"刘志明") );
67         list.add(new User(2,"李雪") );
68         list.add(new User(3,"曹凯宏") );
69         list.add(new User(4,"李俊友") );
70         model.addAttribute("list",list);
71 
72         return "main";
73     }
74     @RequestMapping("/logout")
75 
76     public  String logout(  )
77     {
78 
79         request.getSession().removeAttribute("username");
80         return "/login";
81     }
82 }

 注意上述 代码  login方法 主要处理  login.html 提交的请求  ,用户名、密码正确后 程序进入 主页 即 main 页面 。

6. main.html代码如下:

 1 DOCTYPE html>
 2 <html lang="en"
 3  xmlns:th="www.thymeleaf.org"
 4 >
 5 <head>
 6     <meta charset="UTF-8">
 7     <title>主页title>
 8 head>
 9 <body>
10 这是主页
11 
12   <p th:each="item: ${list} "   >
13       [[${item.getUid() }]] -- [[${item.getName() }]]
14 
15 
16   p>
17 
18 <a href="/logout"> 注销登录a>
19 body>
20 html>

 main 方法代码 如下:

        @RequestMapping("/main")
61     public String main(   Model model)
62     {
63         
64         ArrayList   list=new ArrayList ();
65 
66         list.add(new User(1,"刘志明") );
67         list.add(new User(2,"李雪") );
68         list.add(new User(3,"曹凯宏") );
69         list.add(new User(4,"李俊友") );
70         model.addAttribute("list",list);
71 
72         return "main";
73     }
用户访问首页 (login.html)登录后即可进入主页,用户未登录进入主页后 程序直接跳转的login页面 提示用户登录后 再访问。


 按照以上操作即可完成 用户登录认证。