效果图:
1、没有登录直接访问后台系统时,提示“请先登录系统!”。
2、输入数据库不存在的用户则提示“无此用户!”。
3、 输入密码不正确时提示“密码不正确!”。
4、role权限为普通用户user时,不允许访问后台,提示“普通用户无法登录!”。
1、数据库user表数据
2、 项目目录
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";
}
}
}
业务层接口:
接口实现类:
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);
}
}