springboot 拦截器与全局异常的连动使用 实现未登录的重定向

拦截器

需要继承WebMVCConfigurer:实现的接口某个方法就等价与web.xml中的配置

定义回调方法以自定义通过@EnableWebMvc启用的Spring MVC的基于Java的配置。
@EnableWebMvc配置类可以实现此接口,以使其被回调,并有机会自定义默认配置。

拦截器对应接口中的方法:addInterceptors(InterceptorRegistry registry)

拦截路径(那些将会被拦截)addPathPatterns

放行路径(拦截路径中放行的资源)excludePathPatterns

拦截检验器(拦截后,检验后再放行)addInterceptor

拦截检验器:实现方法,需要在视图前实现 HandlerInterceptorAdapter

解析 HandlerInterceptorAdapter

public abstract class HandlerInterceptorAdapter implements AsyncHandlerInterceptor {

   // 请求前
boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
     	throws Exception   
    
   //请求后视图前
void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
         @Nullable ModelAndView modelAndView) throws Exception
    
   // 视图后
void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
         @Nullable Exception ex) throws Exception

   //在整个请求处理完毕后进行回调,也就是说视图渲染完毕或者调用方已经拿到响应。
void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse 				response,Object handler) throws Exception 
}

显然我们在请求前拦截判断

未登录拦截转到登录界面案例

1,实现接口WebMVCConfigurer中的addInterceptors(InterceptorRegistry registry) 配置方法

2,设置拦截筛选器 抛出未登录异常

3,在全局异常中捕获未登录异常 重定向到登录界面

​ 需要定义一个未登录异常

第一步:实现接口WebMVCConfigurer
/**
 * 拦截器  拦截登录
 * Created by ppliang on 2020/11/30 22:13
 */
@Configuration  //配置类
public class AdminInterceptor implements WebMvcConfigurer {
    //实例化拦截筛选器
    @Resource
    private NoLoginInterceptor noLoginInterceptor;

    /**
     * 添加拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //拦截筛选器的对象
        registry.addInterceptor(noLoginInterceptor)
        //拦截路径
                .addPathPatterns("/**")
        //放行路径
           .excludePathPatterns("/login","/user/checkLogin","/css/**","/images/**","/js/**","/lib/**");
    }
}
第二步:设置拦截筛选器
@Component
public class NoLoginInterceptor  extends HandlerInterceptorAdapter {
    @Resource
    private UserService userService;
    /**
     * 判断用户是否是登录状态
     *  获取Cookie对象,解析用户ID的值
     *      如果用户ID不为空,且在数据库中存在对应的用户记录,表示请求合法
     *      否则,请求不合法,进行拦截,重定向到登录页面
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 获取Cookie中的用户ID
        Integer userId = LoginUserUtil.releaseUserIdFromCookie(request);
        // 判断用户ID是否不为空,且数据库中存在对应的用户记录
        if(userId == null || userService.selectByPrimaryKey(userId) == null){
            throw new NoLoginException();
        }
        return true;
    }
}
第三步:捕获未登录异常
@ResponseBody       //此处要注意 全局异常处理 返回全部数据都是json
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = NoLoginException.class)
    public void noLoginException(HttpServletResponse response) throws IOException {
        response.sendRedirect("/crm/login");//重定向到登录界面
    }
}

需要配置一个登录异常类

package com.ppl.crm.exceptions;

public class NoLoginException extends RuntimeException {
    private Integer code=300;
    private String msg="用户未登录!";


    public NoLoginException() {
        super("用户未登录!");
    }

    public NoLoginException(String msg) {
        super(msg);
        this.msg = msg;
    }

    public NoLoginException(Integer code) {
        super("用户未登录!");
        this.code = code;
    }

    public NoLoginException(Integer code, String msg) {
        super(msg);
        this.code = code;
        this.msg = msg;
    }

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值