springboot * Interceptor的使用,你都了解吗
作者:A黄俊辉A 发布时间:2023-01-01 21:53:40
springmvc 中的 * 可以对请求进行判别, 在请求到达控制器之前, 把非法的请求给拦截掉
下面来说一说, 它在springboot中的使用
* 是可以有多个的, 对不同的 url 进行拦截
我们这个例子设想的是, 如果用户登录过, 就会用户设置一个 session , 如果session中 有user 的信息,就说明用户是登录过的
1.我们先创建一个 User 的实例对象 domain
public class User {
private Integer id;
private String name;
private Integer age;
public User() {
}
public User(Integer id, String name, Integer age) {
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
2.创建一个 * LoginInterceptor 实现 HandlerInterceptor 接口,并实现其方法, 主要是 preHandle方法,其它的可以不用管
package com.huang.interceptor;
import com.huang.domain.User;
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;
public class LoginInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//如果用户登录过才可以访问
HttpSession session = request.getSession();
User user = (User)session.getAttribute("user");
if(user == null){
response.sendRedirect(request.getContextPath()+"/user/login");
return false;
}else{
return true;
}
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
在我们的springmvc项目中, 创建好 * , 下一步就是要在 springmvc的配置文件xml 中去 写 interceptors > interceptor > bean class=“ * 的全类名”
但是在 springboot中, 我们不用这样写了, 我们可以使用 配置类的方式去完成
所以我们新建一个配置类 InterceptorConfig 去实现 WebMvcConfigurer 接口
package com.huang.configure;
import com.huang.interceptor.LoginInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/user/**").excludePathPatterns("/user/login","/user/logout","/user/setsession");
}
}
注意 我们要使用一个注解 @Configuration 表示这是一个配置类, springboot 在启动的时候会自动扫瞄这个类
上面的代码可以看出, InterceptorRegistry 是一个 interceptor的注册器类,使用 addInterceptor(new XXXInterceptor) 来把这个 * 类注册好, addPathPatterns("/user/**") 这个方法是被重构过的, 可以接受多个字符串参数, 也可以接受一个list的集合, 也就是匹配的 url , excludePathPatterns() 也是重构过的, 表示哪些 url 是排除的, 也就是不经过这个 *
上面的 * 和注册都完成了, 我们就可以在控制器中写几个方法测试了
package com.huang.controller;
import com.huang.domain.User;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
@RequestMapping(value="/user")
public class UserController {
@RequestMapping(value="/login")
@ResponseBody
public String userlogin(){
return "跳转到用户登录的页面";
}
@RequestMapping(value="/gomain")
@ResponseBody
public String goMain(){
return "这是用户进入后的页面";
}
@RequestMapping(value="/logout")
@ResponseBody
public String logout(){
return "这是用户登出界面";
}
@RequestMapping(value="/setsession")
@ResponseBody
public Object setSession(HttpServletRequest request){
HttpSession session = request.getSession();
session.setAttribute("user",new User(1,"huang",20));
return "OK";
}
}
在用户没有请求过 /user/setsession的时候,如果用户请求了 /user/gomain * 就会发挥作用, 把它跳转到/user/login的接口上去,如果用户请求过/user/setsession的话, 再去请求/user/gomain * 就会放行, 请求到相应的结果
来源:https://blog.csdn.net/hjh15827475896/article/details/118946172
猜你喜欢
- 1.创建项目修改依赖版本2.创建配置文件package com.huanmingjie.elasticsearch.config;impor
- idea2020.3.3配置Maven走过的那些坑idea2021最新激活码idea2020.3.3激活码有两种方法,小编在这推荐使用方法一
- 我们在j2ee当中,连接数据库的时候经常会用到properties配置文件,我们原来在eclipse或者myeclipse当中会在src文件
- 前言我们在 页面切换转场动画,英雄救场更有趣!介绍了 Hero 动画效果,使用 Hero 用于转场能够提供非常不错的体验。既然称之
- 前言很多时候,当你以为掌握了事实真相的时间,如果你能再深入一点,你可能会发现另外一些真相。比如面向切面编程的最佳编程实践是AOP,AOP的主
- Intellij IDEA 最突出的功能自然是调试(Debug),可以对Java代码,JavaScript,JQuery,Ajax等技术进行
- 一.概述在微服务框架中,一个由客户端发起的请求在后端系统中会经过多个不同的的服务节点调用来协同产生最后的请求结果,每一个前段请求都会形成一条
- Maven打包没有指定主类在使用IDEA开发项目的时候经常会遇到使用Maven打包项目(打成jar包或者zip包),但是之前不太清楚打包插件
- Swing组件中的事件处理专门用于响应用户的操作,例如,响应用户的鼠标单击、按下键盘等操作。在Swing事件处理的过程中,主要涉及三类对象:
- 本文实例讲述了C#从画刷创建画笔的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Coll
- 这篇文章主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋
- 在 C# 以二进制形式读取数据时使用的是 BinaryReader 类。BinaryReader 类中提供的构造方法有 3 种,具体的语法形
- java 实现MD5加密算法的简单实例实现代码:import java.security.NoSuchAlgorithmException;
- 如何检查一个数组(无序)是否包含一个特定的值?这是一个在Java中经常用到的并且非常有用的操作。同时,这个问题在Stack Overflow
- 问题:在web里面用iframe连接一个html文件 - html文件里面是超链接 -&nb
- 子类重新实现父类的方法称重写;重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改;仅当返回值为类类型时,重写的方法才可
- 一、实现流程1.注册2.登录3.登录保持【状态续签】二、实现方法项目结构1.引入依赖<!-- spring-web --><
- 读写锁:分为读锁和写锁,多个读锁不互斥,读锁与写锁互斥,这是由jvm自己控制的,你只要上好相应的锁即可。如果你的代码只读数据,可以很多人同时
- 先看看效果Like This↓一、公共WiFi 公用电脑什么的在我们日常在线上工作、玩耍时,不论开电脑、登录淘宝、玩网游统统都会用到键盘输入
- 一、JAVA常用APIjava.lang.Math提供sin, cos, tan, exp, log, log10 等类方法,PI和E等类字