判断用户登录是用springmvc 拦截器还是filter

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断用户登录是用springmvc 拦截器还是filter相关的知识,希望对你有一定的参考价值。

最好使用spring拦截器。
1、web.xml设置session有效时间 默认好像20min
2、登录成功后把登录信息放入session
3、定义拦截器 拦截请求 ,从session中获取登录信息 无则做响应跳转 如登录
123456public class XxxInterceptor extends HandlerInterceptorAdapter @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception //TODO
4、springxml中配置拦截器 的拦截url,如
12345678910 <mvc:interceptors> <mvc:interceptor> <mvc:mapping path="/**" /> <mvc:exclude-mapping path="/ajax/**"/> <mvc:exclude-mapping path="/login"/> <mvc:exclude-mapping path="/logout"/> <bean class="com.xx.xxx.XxxInterceptor" /> </mvc:interceptor> </mvc:interceptors>
差不多了
参考技术A 一般来说filter是比较合理的,一般的权限控制工具应该是filter 参考技术B 两者都可以

简单使用拦截器

拦截器

参考b站狂神视频

Spring MVC中的拦截器(Interceptor)类似于Servlet中的过滤器(Filter),它主要用于拦截用户请求并作相应的处理。例如通过拦截器可以进行权限验证、记录请求信息的日志、判断用户是否登录等。

拦截器(Interceptor):它依赖于web框架,在SpringMVC中就是依赖于SpringMVC框架。在实现上,基于Java的反射机制,属于面向切面编程(AOP)的一种运用,就是在service或者一个方法前,调用一个方法,或者在方法后,调用一个方法,比如动态代理就是拦截器的简单实现,在调用方法前打印出字符串(或者做其它业务逻辑的操作),也可以在调用方法后打印出字符串,甚至在抛出异常的时候做业务逻辑的操作。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个controller生命周期之内可以多次调用。但是缺点是只能对controller请求进行拦截,对其他的一些比如直接访问静态资源的请求则没办法进行拦截处理。

拦截器重写三个方法,详见参考,其与过滤器的区别参考 https://blog.csdn.net/zxd1435513775/article/details/80556034

为了解决 用户可以不登陆便可进入主页,这是不安全的,为了解决这个问题,便可使用拦截器。

一、新建登录拦截器

LoginHandlerIntercepter.java

package com.example.employee_management.config;
?
import org.springframework.web.servlet.HandlerInterceptor;
?
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
?
/**
* @className: LoginHandlerIntercepter
* @description: 登录拦截器
*/
public class LoginHandlerIntercepter implements HandlerInterceptor {
?
   @Override
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
?
       //获取登录用户的session
       Object loginUser=request.getSession().getAttribute("loginUser");
?
       //session不存在,即用户尚未登录
       if(loginUser==null){
           request.setAttribute("msg","请先登录");
           //返回首页
           request.getRequestDispatcher("/index.html").forward(request,response);
?
           return false;
?
      }else {
           return true;
      }
?
  }
}
?

二、在MVC配置类中添加登录拦截器

MyMvcConfig.java

package com.example.employee_management.config;
?
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.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
?
/**
* @className: MyMvcConfig
* @description: MVC 控制器 借助注解完成控制器而不用手动编写
*/
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
?
   /**
    * MVC 添加首页控制器
    *
    * @param registry
    */
   @Override
   public void addViewControllers(ViewControllerRegistry registry) {
       //这里 “/”和“/index.html”效果一样,因为web项目默认页是index.html
       registry.addViewController("/").setViewName("index");
       registry.addViewController("/index.html").setViewName("index");
?
       //添加用户主页
       registry.addViewController("/main.html").setViewName("dashboard");
  }
?
?
   /**
    * 将国际化组件放入ioc容器中
    *
    * @return
    */
   @Bean
   public LocaleResolver localeResolver() {
       return new MyLocaleResolver();
  }
?
?
   /**
    * 添加登录拦截器
    * @param registry
    */
   @Override
   public void addInterceptors(InterceptorRegistry registry) {
       registry.addInterceptor(new LoginHandlerIntercepter()).addPathPatterns("/**")//对所有请求进行拦截
              .excludePathPatterns("/index.html","/","/user/login","/css/**","/js/**","/img/**");此路径下请求的进行放行,可以是一些静态资源
  }
}

三、修改登录控制器:添加session来保证拦截器正常运行

LoginController.java

package com.example.employee_management.controller;
?
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
?
import javax.servlet.http.HttpSession;
?
@Controller
public class LoginController {
?
   @RequestMapping("/user/login")
   public String login(@RequestParam("username")String username,
                       @RequestParam("password")String password, Model model,
                       HttpSession session){
?
       //用户名不为空且密码正确 注意这里的数据是默认密码为123456,便于调试
       if(!StringUtils.isEmpty(username) && "123456".equals(password)){
           session.setAttribute("loginUser",username);
           return "redirect:/main.html";
      }else {
           //用户名或密码错误
           model.addAttribute("msg","用户名或密码错误");
           return "index";
      }
  }
}
?

启动项目后,在浏览器中输入

localhost:8080/main.html

便会转入到首页(index.html),并且提示用户尚未登录。 技术图片 登录拦截器的功能便已完成。

 

以上是关于判断用户登录是用springmvc 拦截器还是filter的主要内容,如果未能解决你的问题,请参考以下文章

springmvc验证登录用过滤器还是拦截器

flask 每次检测啥判断用户登录

简单使用拦截器

SpringMVC拦截器在用户登录权限中的应用

SpringMVC拦截器应用案例

SpringMVC拦截器的实现(也就是登录是一定要通过登录的页面)