设置虚拟路径下载服务器模板问题
微信图片_20180329183815.png
nginx代理,加了权限之后
点击下载模板功能,跳转到http://10.10.200.187/templates/企业信息管理.xls
,10.10.200.187是nginx的代理,访问的是10.10.200.18的服务器,18服务器上的后台配置文件里定义的模板地址是:resourceLocations: file:/D:/FTP_FILES/QYY/templates/
,而18服务器上的D:/FTP_FILES/QYY/templates/
这个路径下并没有模板所以会导致访问的请求404,解决的方法①就是在18服务器的这个目录下放置模板就可以了。②另一个解决办法是:修改配置文件中的模板路径地址,改为指向真实存放模板的路径,这里是放在200.6服务器上,试试改为如下
resourceLocations: file:/ftp://10.10.200.6/D:/FTP_FILES/QYY/templates/
resourceLocations: ftp://10.10.200.6/D:/FTP_FILES/QYY/templates/
而之前用本机能测试成功是因为,点击下载模板按钮会跳转到http://172.16.11.66:10002/templates/企业信息管理.xls
,正因为66服务器的D:/FTP_FILES/QYY/templates/
路径下有模板所以可以下载成功
注:在文件夹中也可以访问ftp,比如输入ftp://172.16.11.66/
,输入ftp用户名和密码即刻呈现如下
未使用代理,加了权限之后
加了权限之后,所有的请求或者url路径就要在同一个域名下访问
比如企业云:在localhost:8000
下下载模板功能,如果点击之后跳转到http://172.16.11.66:10002/templates/企业信息管理.xls
会报401错误,这是因为在不同的域名下(localhost和172.16.11.66)权限不通。所以想要下载到模板,跳转路径应该改为http://localhost:8000/templates/企业信息管理.xls
,并在本地电脑的D:/FTP_FILES/QYY/templates/
目录下建立对应的文件夹
templatePath: #抄表预警模板地址
rootPath: excelTemplate/chaobiaoyujing.xlsx
copyRootPath: D:/chaobiaoyujing1.xlsx
resourceHeader: /templates/**
resourceLocations: file:/D:/FTP_FILES/QYY/templates/
image.png
同理,如果是在http://127.0.0.1:8000/#/EnterpriseCloud/BasicDataManage
下的下载模板功能,①先登陆后有权限,再跳转http://127.0.0.1:8000/templates/企业信息管理.xls
才能下载(是否需要登录系统需看SecurityConfig类中是否设置了权限),②如果未登录点击http://127.0.0.1:8000/templates/企业信息管理.xls
路径会提示401没有权限错误。③如果跳转到http://localhost:8000/templates/企业信息管理.xls
则会报401错误,错误如下
Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.
Mon Apr 02 16:39:19 CST 2018
There was an unexpected error (type=Unauthorized, status=401).
Full authentication is required to access this resource
这里的http://127.0.0.1:8000/templates/企业信息管理.xls
并不是一个接口,而是通过MyConfiguration设置成的一个url地址,参考文章springboot访问静态资源、springboot访问本地路径获取图片url和通过接口获取图片并缓存、springboot静态资源文件映射
SecurityConfig权限设置
@Override
protected void configure(HttpSecurity http) throws Exception {
ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry
expressionInterceptUrlRegistry = http.exceptionHandling().authenticationEntryPoint
(securityException401EntryPoint())
.and()
.csrf()
.disable()
.headers()
.frameOptions()
.sameOrigin()
.and()
.logout().addLogoutHandler(new SecurityContextLogoutHandler())
.and()
.authorizeRequests()
.antMatchers("/security/loginByPwd").permitAll()
.antMatchers("/security/loginByToken").permitAll()
.antMatchers("/security/vcode").permitAll()
.antMatchers("/v1/userInfo/login").permitAll()
.antMatchers("/v1/password/revise").permitAll()
.antMatchers("/v1/password/user").permitAll()
.antMatchers("/v1/dataList").permitAll()
// .antMatchers("/templates/*.xls").permitAll() //允许所有权限
// .antMatchers("/templates/*.xlsx").permitAll() //允许所有权限
.antMatchers("/*.jpg").permitAll()
.antMatchers(HttpMethod.POST, "/v1/repair").permitAll()
.antMatchers(HttpMethod.POST, "/v1/complain").permitAll()
.antMatchers(HttpMethod.GET, "/v1/menus").permitAll()
.antMatchers(HttpMethod.GET, "/v1/articleInfo").permitAll()
.antMatchers(HttpMethod.GET, "/v1/shopInfo").permitAll()
.antMatchers(HttpMethod.GET, "/v1/rentPublic").permitAll()
.antMatchers(HttpMethod.GET, "/v1/rent/detail").permitAll()
.antMatchers(HttpMethod.GET, "/v1/goodsInfo").permitAll()
.antMatchers(HttpMethod.GET, "/v1/goodsIntroInfo").permitAll()
.antMatchers(HttpMethod.GET, "/v1/articleContentInfo").permitAll()
.antMatchers(HttpMethod.GET, "/v1/attachment/image").permitAll()
.antMatchers(HttpMethod.GET, "/v1/evaluationInfo").permitAll();
//正式环境下所有的请求都要经过验证
if (envActive.equals("prod")) {
expressionInterceptUrlRegistry.accessDecisionManager(accessDecisionManager()).anyRequest().authenticated();
} else {
expressionInterceptUrlRegistry.anyRequest().permitAll();
}
// .permitAll() //权限允许所有人
// .and()
// .sessionManagement()
// .invalidSessionUrl("/login")
// .maximumSessions(5)
}
MyConfiguration
@Configuration
public class MyConfiguration extends WebMvcConfigurerAdapter {
@Autowired
TemplateConfig templateConfig;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
/**
* @Description: 对文件的路径进行配置, 创建一个虚拟路径/rules/** ,即只要在<img src="/rules/picName.jpg" />便可以直接引用图片
*这是图片的物理路径 "file:/+本地图片的地址"
*/
// registry.addResourceHandler("/rules/**").addResourceLocations
// ("classpath:/rules/");
registry.addResourceHandler(templateConfig.getResourceHeader()).addResourceLocations
(templateConfig.getResourceLocations());
// registry.addResourceHandler("/templates/**").addResourceLocations
// ("file:\\E:\\IdeaProjects\\gaygserver\\src\\main\\resources\\static\\");
// registry.addResourceHandler("/templates/**").addResourceLocations
// ("classpath:/static/");
// registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
// registry.addResourceHandler("/**").addResourceLocations("file:\\E:\\IdeaProjects\\gaygserver\\src" +
// "\\main\\resources\\static\\");
super.addResourceHandlers(registry);
}
// @Override
// public void addResourceHandlers(ResourceHandlerRegistry registry) {
// //和页面有关的静态目录都放在项目的static目录下
// registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
// //上传的图片在D盘下的OTA目录下,访问路径如:http://localhost:8081/OTA/d3cf0281-bb7f-40e0-ab77-406db95ccf2c.jpg
// //其中OTA表示访问的前缀。"file:D:/OTA/"是文件真实的存储路径
// registry.addResourceHandler("/OTA/**").addResourceLocations("file:D:/OTA/");
// }
}