hello,大家好,好久没发文章了,之前一段时间因为没遇到太好的内容。昨天研究了下登录时Spring拦截器实现功能,今天和大家分享下,有问题的话欢迎大家指出与批评,好,下面进入正题。
说起拦截器不得先说说过滤器,接下来我们先说说过滤器和拦截器的区别吧。
Filter是Servlet规范中规定的,只能用于web中;拦截器既可以用于web中,也可以用在Application中等等
Filter是Servlet规范中定义的,是Servlet容器支持的;拦截器是Spring容器内的,是Spring框架支持的。
拦截器是Spring的一个组件,可以使用Spring框架中的任何资源和对象,而Filter则不可以进行访问。
Filter只能在Servlet的前后起作用,而拦截器可以深入到方法的前后、异常抛出前后等更深层次的程度处理。因此在Spring框架中优先使用拦截器。
首先我们来进行配置好我们的拦截器,实现HandlerInterceptor
接口,然后重写preHandle
方法,代码如下图所示:
package com.kuang.config;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author ygl
* @description
* @date 2020/10/27 18:19
*/
@Component
public class LoginHandlerInterceptor implements HandlerInterceptor{
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//登录成功之后,应该有session
Object loginUser = request.getSession().getAttribute("loginUser");
if (loginUser == null){
//说明没有登录
request.setAttribute("msg","对不起,你没有权限,请先登录!");
request.getRequestDispatcher("/index.html").forward(request,response);
return false;
}else {
return true;
}
}
}
preHandle()
是在Controller接口中的方法执行之前进行调用,如果返回为true,则说明Controller方法可以执行,返回为False则不能执行。我这里采用的是取出session中loginUser的值,如果不为空,则说明登录了,如果为空,则说明未登录,直接进行拦截,并返回前端说没有权限且同时重定向到登录页面。
定义好拦截器后进行注册拦截器,先实现WebMvcConfigurer
接口,进行重写addInterceptors()
方法,注册拦截器代码如下图所示:
package com.kuang.config;
import org.springframework.beans.factory.annotation.Autowired;
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.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author ygl
* @description
* @date 2020/10/26 15:45
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("index");
registry.addViewController("/index.html").setViewName("index");
registry.addViewController("/main.html").setViewName("dashboard");
}
// @Autowired
// private LoginHandlerInterceptor loginHandlerInterceptor;
//自定义国际化就生效了
@Bean
public LocaleResolver localeResolver(){
return new MyLocaleResolver();
}
//注册拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
//括号内的对象是new出来的,可以交给Spring框架中的IOC容器进行管理,也就是采用注解:@Autowried进行注入
registry.addInterceptor(new LoginHandlerInterceptor())
//对所有的进行拦截,包括静态资源
.addPathPatterns("/**")
//除去/index.html / /user/login /css/** /img/** /js/**这些不进行拦截
.excludePathPatterns("/index.html","/","/user/login","/css/**","/img/**","/js/**");
}
}
.addPathPatterns()
是对那些路径进行拦截,excludePathPatterns
方法是除去那些不进行拦截。
登录类代码如下图所示:
package com.kuang.controller;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.thymeleaf.util.StringUtils;
import javax.servlet.http.HttpSession;
/**
* @author ygl
* @description
* @date 2020/10/27 17:35
*/
@Controller
public class LoginController {
/**
* @author ygl
* @date 2020-10-27 17:37
*/
@RequestMapping("/user/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password, Model model, HttpSession session){
if (!StringUtils.isEmpty(username) && "123456".equals(password)){
session.setAttribute("loginUser",username);
return "redirect:/main.html";
}else {
model.addAttribute("msg","用户名或者密码错误");
return "index";
}
}
}
这里验证用户名和密码是模拟的,在实际开发过程中要进行进数据库中实际查询和验证,当用户名和密码验证成功后进行给session设定值,记录登录成功,并且进行重定向至主页,如果验证失败,则重新返回至登录页面。
最后给大家放个类应该所存放的包:
好了,今天的分享到此结束。