乐知付加密服务平台

如果你有资源, 平台可以帮你实现内容变现, 无需搭建知识付费服务平台。

点击访问官方网站 https://lezhifu.cc

扫码关注公众号 乐知付加密服务平台-微信公众号
Springboot访问静态资源Html | chenzuoli's blog

Springboot访问静态资源Html

最近在写一个web页面,html方式,需要通过ajax请求后台数据,并展示在页面上。后台是Springboot写的,有登录验证,我明明写了该接口免登陆,但是还是html加载不出来,依然重定向到登录页面,下面来看看是什么问题,如何解决?

WebMvcConfigurer

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
package pet.photography.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import pet.photography.interceptor.LoginInterceptor;

/**
* Created by user chenzuoli on 2020/4/21 23:33
* description: 拦截器配置
*/
@Configuration
public class WebConfigurer implements WebMvcConfigurer {

@Autowired
private LoginInterceptor loginInterceptor;

// 这个方法是用来配置静态资源的,比如html,js,css,等等
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
// registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}

// 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns("/**") 表示拦截所有的请求,
// excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/moment");
// super.addInterceptors(registry); //较新Spring Boot的版本中这里可以直接去掉,否则会报错
}
}

Controller

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package pet.photography.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

/**
* Created by user chenzuoli on 2021/4/18 22:02
* description: 网站页面接口
*/
@Controller
public class WebsiteController {
@RequestMapping(value = "moment", method = RequestMethod.GET)
public String nextDoorComment(@RequestParam("id") String id) {
return "miniprogram/next_door_moment";
}
}

静态资源位置:
static_resource_structure

已在excludePathPatterns中添加”/moment”接口的排除接口登录验证,依然无效

1
2
3
4
5
6
7
// 20210703111103
// https://localhost:7449/photography/moment?id=1

{
"message": "登录异常,请重新登录",
"status": 1005
}

调试发现会报重定向次数过多的问题,经过一步一步的排查分析,发现是Controller层的代码有问题,当接收”/moment”的时候返回的view是”next_door_moment”,由于没有使用@ResponseBody,所以这个字符串会被解析为一个视图而不是JSON串,所以当在Interceptor中进行redirect重定向之后,再一次进行重定向的路径为
https://localhost:7449/photography/miniprogram/next_door_moment.html
此时的相对路径为”/next_door_moment.html”,不再被排除的路径内,所以又会被拦截,加上html路径就行了。

这是解决办法:在WebMvcConfigurer的实现类下,添加html excludePathPatterns

1
2
3
4
5
6
7
8
9
10

// 这个方法用来注册拦截器,我们自己写好的拦截器需要通过这里添加注册才能生效
@Override
public void addInterceptors(InterceptorRegistry registry) {
// addPathPatterns("/**") 表示拦截所有的请求,
// excludePathPatterns("/login", "/register") 表示除了登陆与注册之外,因为登陆注册不需要登陆也可以访问
registry.addInterceptor(loginInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/moment", "/miniprogram/next_door_moment.html");
}

ok,完成


书山有路勤为径,学海无涯苦作舟。

欢迎关注微信公众号:【程序员写书】
程序员写书

喜欢宠物的朋友可以关注:【电巴克宠物Pets】
电巴克宠物

一起学习,一起进步。

-------------本文结束感谢您的阅读-------------