- 说明
在做文件的时候,不想别人下载,可以添加验证码等方式,进行拦截,也可以用权限去控制,进行拦截。 - 拦截方式
我在访问路径之前,已经有一个权限的控制了(就是springsecurity的鉴权),为了阻止过度下载,多加一个验证码
这里在访问文件的时候,加了一个拦截器。(可以自定义,我通过验证码的方式:还没完善)
这个实现类主要是开放文件访问服务。
package com.mods.browser.config;
import com.mods.browser.component.BaseInterceptor;
import com.mods.common.utils.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
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;
/**
* @Author leaves
* @Date 2022/05/30 9:56
*/
@Configuration
public class StaticResourceConfig implements WebMvcConfigurer {
/**
* 告诉spring 静态文件访问地址
* 功能说明:配置静态访问资源
* 文件访问地址配置
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry
.addResourceHandler("/static/**")//访问路径带有static
.addResourceLocations("file:c:/");//本地磁盘对应路径。例如c:/
}
/**
* 拦截器
*/
@Autowired
private BaseInterceptor baseInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(baseInterceptor);
}
}
2. 拦截器 BaseInterceptor
这个拦截器中,可以写需要的逻辑,比如判断是否拥有权限,判断验证码等,(我用header传的验证码)
package com.mods.browser.component;
import com.mods.auth.costum.JwtProperties;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.util.CollectionUtils;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.List;
import java.util.stream.Collectors;
/**
* 实现HandlerInterceptor接口,自定义拦截器
* @author leaves
*/
@Component
@Slf4j
public class BaseInterceptor implements HandlerInterceptor {
private AntPathMatcher antPathMatcher = new AntPathMatcher();
@Autowired
private JwtProperties jwtProperties;
/**
* 实现前置方法
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object o) {
String requestURI = request.getRequestURI();
String[] aa = {
"/static/materials/**/**/dist/**",
"/static/materials/**/**/cover/**",
"/static/images/**"
};
List<String> permitAll = Arrays.asList(aa);//公开的访问地址
List<String> collect = permitAll.stream().filter(
x -> antPathMatcher.match(x, requestURI) //这里会匹配开放权限的文件访问路径和当前访问路径,"/**"表示,可以访问所有
).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(collect)) {
return true;
}
String verificationCode = request.getHeader("VerificationCode");//例如获取请求头里的一个参数,参数符合,才可以继续return true
return "123".equals(verificationCode);
// return true;
}
/**
@Override
public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {
//这个方法可以往request中添加一些公共的工具类给前端页面进行调用
}
@Override
public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {
//当请求处理完成调用
}
*/
}
3. 非主流的一个验证码保存(正常应该是配合redis,我这里没用redis,直接存在Map里了,用map的去重特性)
userid作为key,(如果有不同的业务需求,可以改一下key,多带一个参数,区分不同业务)
例如
String key = “userid1-type1”;
package com.mods.browser.model;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class VerificationCode {
private static Map<String, String> code = new HashMap<>();
public static void addCode(Integer userId, String value) {
String key = userId.toString();//userId
code.put(key, value);
Thread thread = new Thread(() -> {
try {
Thread.sleep(10000);
} catch (InterruptedException ignored) {
}
code.remove(key);
});
thread.start();
}
public static Boolean verification(Integer userId, String value) {
String key = userId.toString();//userId
boolean flag = value.equals(code.get(key));
code.remove(key);
return flag;
}
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)