基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)

效果图:

1、没有登录直接访问后台系统时,提示“请先登录系统!”。

基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)_第1张图片

2、输入数据库不存在的用户则提示“无此用户!”。

基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)_第2张图片

3、 输入密码不正确时提示“密码不正确!”。

基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)_第3张图片

 4、role权限为普通用户user时,不允许访问后台,提示“普通用户无法登录!”基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)_第4张图片

正文开始

1、数据库user表数据

基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)_第5张图片

2、 项目目录 

 基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)_第6张图片

3、配置登陆了控制器,调用findUser函数,把查询到的数据库的数据拿到。

package cn.gxks.web.leasemall.controller;

import cn.gxks.web.leasemall.entity.Users;
import cn.gxks.web.leasemall.service.UsersService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpSession;


@Slf4j
@Controller
//登录控制器
public class LoginController {

    @Autowired
    private UsersService usersService;
    //指定的所有路径都可跳转到登录页
    @GetMapping(value = {"/index", "/admin/login", "/"}) 
    public String toLoginPage() {
        return "login";
    }

    //登录认证方法
    //连接数据库users表登录后台系统
    @RequestMapping("/admin/login")
    public String login(
                      Model model,
                      HttpSession session,
                        Users users) {
        Users users1 = usersService.findUser(users.getUsername());


        if (users1 != null) { //如果用户名存在
            //判断 从前端输入的 users1 密码与数据库查询到的密码是否相符
            if (users1.getPassword().equals(users.getPassword())) {
//把查询到的数据库信息打印在控制台
                System.out.println(users1.toString()); 
                session.setAttribute("username",users1.getUsername());//通过session把用户名传到登录拦截器进行判断
                session.setAttribute("role",users1.getRole().getUserContest());
                return "redirect:/admin/main";
            } else {
                model.addAttribute("error", "密码不正确!");
                //如果输入的 username、password 不正确,则返回登录页
               return "login";
            }

        } else {
            model.addAttribute("error", "无此用户!");
                //如果输入的 username、password 不正确,则返回登录页
                return "login";

        }
    }

    }




 userDao层 :基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)_第7张图片

 业务层接口:

基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)_第8张图片

 

 接口实现类:

基于Spring Boot的maven项目——登录拦截器(用户名密码校验、管理员权限认证)_第9张图片

 

 mapper层:数据库查询语句

    

4、在 项目包下新建一个自定义TestSeervlet拦截器,对后台主页/admin/main路径进行拦截。

package cn.gxks.web.leasemall.servlet;

import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@Slf4j
public class TestSeervlet extends HttpServlet {

    @Override
    public void service(HttpServletRequest req,
                        HttpServletResponse resp) throws IOException {
        log.info("TestServlet 正在工作,处理 / test/testServlet 请求");
        resp.sendRedirect(req.getServletContext().getContextPath() + "/admin/main");

    }

}

5、 配置拦截器,告诉自定义的拦截器哪些请求需要拦,哪些请求放行。

package cn.gxks.web.leasemall.config;

import cn.gxks.web.leasemall.interceptor.LoginInterceptor;
import cn.gxks.web.leasemall.servlet.TestSeervlet;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

//拦截器配置类
//@Configuration注解,能让SpringBoot服务发现这个配置
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    //给容器中添加一个原生 Servlet
    @Bean
    public TestSeervlet testSeervlet(){
        return new TestSeervlet();
    }

    //注册 servlet 让其生效
    @Bean
    public ServletRegistrationBean
            seervletServletRegistrationBean(TestSeervlet testSeervlet){
        return new ServletRegistrationBean<>(testSeervlet,"/test/testSeervlet");
    }

    //配置登录拦截器
    @Override
    public void addInterceptors(InterceptorRegistry registry){
        registry.addInterceptor(new LoginInterceptor())// LoginInterceptor自定义拦截器  。 将拦截器添加到拦截器注册中心,让其生效
                //配置拦截器拦截路径,所有的路径都拦截
                .addPathPatterns("/*","/admin/*")
                //配置排除路径,告诉拦截器那些请求不拦截直接放行
                .excludePathPatterns("/","/index","/admin/login","*.css","*.js","*.jpeg","*.png");//不拦截的路径及内容

    }
}

6、自定义拦截器,在该类中实现对HandlerInterceptor接口的功能,调用servlet的拦截方法,实现拦截。

package cn.gxks.web.leasemall.interceptor;

import cn.gxks.web.leasemall.entity.Users;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.server.Session;
import org.springframework.lang.Nullable;
import org.springframework.ui.Model;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

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


@Slf4j
//实现对HandlerInterceptor接口的功能
public class LoginInterceptor implements HandlerInterceptor {

    //登录拦截器
    /* 拦截请求, 访问controller 之前
    * 进入handler之前执行
    * preHandle  请求处理前置拦截(目标方法执行之前触发拦截)
     用于身份认证和身份授权
    认证不通过,则拦截不向下执行
    * */

    @Override
    public boolean preHandle(HttpServletRequest request,
                             HttpServletResponse response,
                             Object handler) throws Exception {
        //判断session
        HttpSession httpSession = request.getSession();
        //从session中取出用户身份信息
        Object username = httpSession.getAttribute("username");
        Object role = httpSession.getAttribute("role");

/*        Object role = httpSession.getAttribute("role");
        if (username != null) {     //用户存在

            if (role != "user") {//判断用户角色
                log.info("当前登录用户角色为:{}", handler);
                return true;
            } else {
                request.setAttribute("error", "您没有权限!");
                request.getRequestDispatcher("/index").forward(request, response);
            }
        }

        request.setAttribute("error", "请先登录系统!");
        request.getRequestDispatcher("/index").forward(request, response);//没有登录,重定向回登录页
        return false;
    }*/

        if (username != null) {
            /* 判断登录用户是否是管理员*/
            if (!role.equals("manager") & !role.equals("rootmanager")) {
                request.setAttribute("error", "普通用户无法登录!");
                request.getRequestDispatcher("/index").forward(request, response);//登录不成功,重定向回登录页
                return false;
            } else {
                log.info("当前登录拦截器正在拦截请求,请求的处理目标方法是:{}", handler);
                return true;
            }
        }
        request.setAttribute("error", "请先登录系统!");
        request.getRequestDispatcher("/index").forward(request, response);//登录不成功,重定向回登录页
        return false;

    }


    //postHandle  请求处理后置拦截(目标方法执行完成后触发拦截)
    @Override
    public void postHandle(HttpServletRequest request,
                           HttpServletResponse response,
                           Object handler,
                           @Nullable ModelAndView modelAndView) throws Exception {
        log.info("目标方法已经处理完成,准备进行视图渲染,请求中携带的数据是:{} , 请求将转发到 {} 页面。",
                modelAndView.getModel(), modelAndView.getViewName());
    }

    // afterCompletion  请求处理完成拦截(页面渲染完成后出发拦截)
    @Override
    public void afterCompletion(HttpServletRequest request,
                                HttpServletResponse response,
                                Object handler,
                                Exception exception) throws Exception {
        log.info("请求已经处理完成,准备响应给客户端,此次请求中是否有异常? {}",
                exception == null ? true : false);
    }
}

 

你可能感兴趣的:(SpringBoot,maven,spring,boot,java)