记 测试Interceptor拦截器,一直被拦截到login

问题如下,一直被拦截到此界面。在这里插入图片描述
造成这样的原因是security框架造成的

<!--引入spring安全框架-->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

解决方法
如果你不需要这个依赖可以直接删除它,就可以暴力解决一直被重定向login页面的问题。

当然也可以定一个配置类如下:
设置admin角色请求就不会被过滤拦截到login。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable();
        //首页所有人都可以访问
        http.authorizeRequests().antMatchers("/").permitAll()
                .antMatchers("/admin/**").hasRole("admin");
        http.formLogin().loginPage("/login").loginProcessingUrl("/login");
    }
}

以下继续测试拦截器
定义一个拦截类

public class UserTokenInterceptor implements HandlerInterceptor{
    /**
     * 拦截请求,在controller调用之前
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("进入到拦截器,被拦截...");
        /**
         * false:请求被拦截,被驳回,验证出现问题
         * true:请求在经过验证校验之后是ok的,可以放行的
         */
        return false;
    }

    /**
     * 请求访问controller之后,渲染视图之前
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
		System.out.println("请求接口后,渲染视图之前");
    }
    /**
     * 请求访问controller之后,渲染视图之后
     */
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    	System.out.println("请求接口后,渲染视图之后");
    }
}

在WebMvcConfigurer 实现中注册拦截器

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    /**
     * 实现静态资源的映射
     */
//     @Override
//    public void addResourceHandlers(ResourceHandlerRegistry registry) {
//        registry.addResourceHandler("/**")
//                // 映射swagger2
//                .addResourceLocations("classpath:/META-INF/resources/")
//                // 映射本地静态资
//                .addResourceLocations("file:/workspaces/images/");
//    }
//
//    @Bean
//    public RestTemplate restTemplate(RestTemplateBuilder builder) {
//        return builder.build();
//    }


    @Bean
    public UserTokenInterceptor userTokenInterceptor() {
        return new UserTokenInterceptor();
    }

    /**
     * 注册拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(userTokenInterceptor())
        		//这是拦截hello接口,也可以设置成“/**”全部拦截
                .addPathPatterns("/hello");
        WebMvcConfigurer.super.addInterceptors(registry);

    }
}

controller层中测试接口

@GetMapping("/hello")
    public Object hello() {
        logger.debug("debug: hello~");
        logger.info("info: hello~");
        logger.warn("warn: hello~");
        logger.error("error: hello~");
        return "Hello World~";
    }

测试
在这里插入图片描述
在这里插入图片描述
修改下注册配置
修改成不拦截hello接口

/**
 * 注册拦截器
 * @param registry
 */
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(userTokenInterceptor())
            .addPathPatterns("/**")
            .excludePathPatterns("/hello");
    WebMvcConfigurer.super.addInterceptors(registry);
}

测试不拦截
在这里插入图片描述在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Interceptor拦截器)是一个常用的Spring框架中的组件,用于在请求进入控制器之前或者响应返回到浏览器之前进行一些处理,比如校验用户登录状态、录请求日志等。 在Spring中使用Interceptor非常简单,主要包括以下几个步骤: 1. 创建一个Interceptor类,实现HandlerInterceptor接口,并重写其中的三个方法:preHandle、postHandle和afterCompletion。preHandle在请求进入控制器之前执行,postHandle在控制器处理完请求后执行,afterCompletion在视图渲染完毕之后执行。 2. 在Spring的配置文件中配置Interceptor,可以通过<mvc:interceptors>标签配置全局的Interceptor,也可以通过实现WebMvcConfigurer接口来进行局部的Interceptor配置。 3. 配置完成后,Interceptor会自动拦截所有符合条件的请求,并按照preHandle、postHandle和afterCompletion的顺序执行。 下面是一个简单的Interceptor示例: ```java public class LoginInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 校验用户登录状态 User user = (User) request.getSession().getAttribute("user"); if (user == null) { response.sendRedirect("/login"); return false; } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 录请求日志 System.out.println(request.getRequestURI() + " executed."); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 清理资源等操作 } } ``` 在Spring的配置文件中配置Interceptor: ```xml <mvc:interceptors> <bean class="com.example.interceptor.LoginInterceptor" /> </mvc:interceptors> ``` 这样就可以实现一个简单的Interceptor拦截器了。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值