spring boot 项目在拦截器Interceptor中 注入RedisUtil,RedisUtil无法使用的问题(RedisUtil报null错误)

spring boot 项目在拦截器Interceptor中 注入RedisUtil,RedisUtil无法使用的问题(RedisUtil报null错误)

这是最初的代码。提示RedisUtil为null

public class LoginHandlerInterceptor implements HandlerInterceptor {

    @Resource
    RedisUtil redisUtil;


    @Override  //ctrl+o重写方法快捷键
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //ctrl+alt+v生成对应类型
        Object sessionId = request.getHeader("sessionId");

        String sessionIdRedis = redisUtil.getString("sessionId");
        if (sessionId != null && sessionId.toString().equals(sessionIdRedis)) {
            System.out.println("验证sessId的值");
            return true;
        }

        throw new BadException(BaseResultCode.INTERNAL_SERVER_ERROR, "请重新登录");
    }
}

原因:拦截器在SpringContext初始化之前就执行了,Bean初始化之前它就执行了,所以它肯定是无法获取SpringIOC容器中的内容的。

修改之后的代码:

package com.wxf.controller;

import com.wxf.enums.BaseResultCode;
import com.wxf.exception.BadException;
import com.wxf.utils.RedisUtil;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class LoginHandlerInterceptor implements HandlerInterceptor {

    @Resource
    RedisUtil redisUtil;


    @Override  //ctrl+o重写方法快捷键
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //ctrl+alt+v生成对应类型
        Object sessionId = request.getHeader("sessionId");

        if (redisUtil == null) {
            WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getServletContext());
            redisUtil = wac.getBean(RedisUtil.class);
        }


        String sessionIdRedis = redisUtil.getString("sessionId");
        if (sessionId != null && sessionId.toString().equals(sessionIdRedis)) {
            System.out.println("验证sessId的值");
            return true;
        }

        throw new BadException(BaseResultCode.INTERNAL_SERVER_ERROR, "请重新登录");
    }
}

扩展:
Interceptor是什么?
拦截器(Interceptor)同 Filter 过滤器一样,它俩都是面向切面编程——AOP 的具体实现(AOP切面编程只是一种编程思想而已)。

Interceptor可以做什么?
日志记录:记录请求信息的日志,以便进行信息监控、信息统计、计算 PV(Page View)等
权限检查:如登录检测,进入处理器检测是否登录
性能监控:通过拦截器在进入处理器之前记录开始时间,在处理完后记录结束时间,从而得到该请求的处理时间。(反向代理,如 Apache 也可以自动记录)
通用行为:读取 Cookie 得到用户信息并将用户对象放入请求,从而方便后续流程使用,还有如提取 Locale、Theme 信息等,只要是多个处理器都需要的即可使用拦截器实现。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在使用JSP整合Spring Boot项目配置拦截实现登录,您可以按照以下步骤操作: 1. 创建一个拦截类,实现HandlerInterceptor接口,并实现其preHandle、postHandle和afterCompletion方法,用于在请求处理前、处理后和完成后执行相应的操作,比如验证登录信息、记录日志等。 2. 修改Spring Boot的配置文件application.properties,添加配置项,使Spring Boot能够扫描到拦截类。例如: ``` # 拦截配置 # 拦截类所在的包名 spring.mvc.interceptor.exclude=*.css,*.js,/login spring.mvc.interceptor.include=/admin/** ``` 在上面的配置,exclude表示不需要拦截的请求,include表示需要拦截的请求。这里我们设置只拦截/admin/下的请求。 3. 创建一个Controller类,用于处理用户登录请求。在该类,可以使用@SessionAttribute注解将用户登录信息存储到Session,以便在其他页面进行验证。例如: ``` @Controller public class LoginController { @Autowired private UserService userService; @RequestMapping("/login") public String login(String username, String password, Model model, HttpSession session) { User user = userService.checkLogin(username, password); if (user != null) { session.setAttribute("user", user); return "redirect:/admin/index"; } else { model.addAttribute("msg", "用户名或密码错误!"); return "login"; } } } ``` 4. 在JSP页面使用JSTL标签库或EL表达式获取Session的用户信息,以便进行权限验证。例如: ``` <c:if test="${not empty sessionScope.user}"> <a href="/logout">退出</a> </c:if> ``` 在上面的代码,如果Session存在user对象,则显示退出链接,否则不显示。 以上就是使用JSP整合Spring Boot配置拦截实现登录的基本步骤,您可以根据实际需求进行相应的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值