Springboot 拦截器(简单版,使用session存储)

这篇博客介绍了如何在Springboot中使用拦截器来处理用户的登录、查看和退出操作,通过Session存储用户状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

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

@Configuration  //等同于spring的XML配置文件
public class WebSecurityConfig implements WebMvcConfigurer {
    /**
     * 登录session key
     */
    public final static String SESSION_KEY = "user";

    @Bean
    public SecurityInterceptor getSecurityInterceptor(){
        return  new SecurityInterceptor();
    }

	@Override
    public void addInterceptors (InterceptorRegistry registry){
        InterceptorRegistration addInterceptor = registry.addInterceptor(getSecurityInterceptor());

        /* 配置不需要拦截的路由 */
        addInterceptor.excludePathPatterns("/login");

        /* 配置需要拦截的路由 */
        addInterceptor.addPathPatterns("/**");
    }

    private class SecurityInterceptor extends HandlerInterceptorAdapter{
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception{
            /* 获取session */
            HttpSession session = request.getSession();
            
            /* 可自定义判断 */
            if(session.getAttribute(SESSION_KEY) != null){
            	/* 有session值,则继续下一步操作 */
                return  true;
            }
			
			/*如果没有session值,则返回 401 的错误信息 */
            response.setStatus(401);
            return false;
        }
    }
}

登录

UserController

@ResponseBody
@PostMapping("/login")
public Map<String, Object> loginPost(String account, String password, HttpSession session) {

    Map<String, Object> map = new HashMap<>();
	
	/* 使用JPA自定义查询,详情可见 https://blog.csdn.net/weixin_45703665/article/details/103351737 */
    User user = userDao.findByTelAndPassword(account, password);

	/* 如果用户不存在,则返回登录失败信息 */
    if (user == null) {
        map.put("success", false);
        map.put("message", "密码错误");
        return map;
    }
    
    /* 如果用户存在,则保存session */
   	session.setAttribute(WebSecurityConfig.SESSION_KEY, account);
   	
   	/* 登录成功,返回成功信息和用户数据 */
    map.put("success", true);
    map.put("message", "登录成功");
    map.put("user", user);
    return map;
}

查看

@ResponseBody /* 表示该方法的返回结果直接写入HTTP response body中,直接返回json数据 */
@GetMapping("/index")
public String index(@SessionAttribute(WebSecurityConfig.SESSION_KEY) String account, Model model) {
    model.addAttribute("name", account);
    return "index";
}

退出

@ResponseBody
@GetMapping("logout")
public String logout(HttpSession session) {
	/* 删除 session 值 */
    session.removeAttribute(WebSecurityConfig.SESSION_KEY);
    return "logout success";
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值