软工周报23-10-10
这期主要学习了一些网页安全问题:路由守卫,jwt的使用。经过这一周期的学习,我可以初步做出一个信息较安全,有基础防御措施的网页
解决问题:首先
学了一些请求,与跨域相关的问题,主要研究了option请求的作用,以及如何阻止他对于token令牌获取的干扰这一问题。
首先option请求用于跨域资源共享,当发出跨域Ajax请求时,浏览器会自动发送Option请求,以检查是否允许实际请求。但是这一请求中不能附带一些额外的参数。比如token,这会使系统在进行jwt检测的时候直接报错“token已经失效”,因为没有接收到一个正常的token。当引入下面代码时,可跨过option请求,直接对getpost这类请求进行审核
@Configuration
public class corsConfig {
@Bean
public CorsFilter corsFilter(){
UrlBasedCorsConfigurationSource source=new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration=new CorsConfiguration();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOrigin("*");
source.registerCorsConfiguration("/**",corsConfiguration);
return new CorsFilter(source);
}
}
下面这段函数是添加一个阻断器,在使其每次发生请求变化时都要进行jwt检测。当然,并不是所有指令都需要这种检测,后续加上一些可以不进行检测的url
@Override
public void addInterceptors(InterceptorRegistry reg){
reg.addInterceptor(jwtInterceptor).addPathPatterns("/anqi/**")
.excludePathPatterns("/anqi/admin/login")
.excludePathPatterns("/anqi/admin/register")
.excludePathPatterns("/anqi/files/**")
.excludePathPatterns("/anqi/files/**");
}
下面这段函数是一段是jwt过程中token的验证,这次我将token放在header中,以便于提取使用
public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler){
// if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
// System.out.println("OPTIONS请求,放行");
// return true;
// }
//1.获取token
System.out.println(request.getHeader("token"));
String token=request.getHeader("token");
if(StrUtil.isBlank(token)){
//第一次没拿到 去参数里面拿 比如 /anqi/admin?token=xxx
System.out.println("token没拿到");
token=request.getParameter("token");
}
//2.开始认证
if(StrUtil.isBlank(token)){
throw new CustomException("token已经消失,请重新登录");
}
//获取token中的id
String adminID;
Admin admin;
try{
adminID= JWT.decode(token).getAudience().get(0);
admin=adminMapper.findByID(Integer.parseInt(adminID));
}catch (Exception e){
String msg="token认证失败";
log.error(msg+",token="+token,e);
throw new CustomException(msg);
}
if(admin==null){
throw new CustomException("用户不存在请重新登录");
}
try{
//用户密码加签验证token
JWTVerifier jwtVerifier=JWT.require(Algorithm.HMAC256(admin.getPassword())).build();
jwtVerifier.verify(token);
}catch (JWTVerificationException e){
throw new CustomException("token验证失败请重新登录");
}
log.info("token验证成功");
return true;
}
关于如何设置token:为了节省数据库的查询空间,在进行登录时会生成对应的token与用户信息一起存储在localstorage中,一旦信息遭到破坏,上面的阻断器就会生效阻止用户继续访问页面

浙公网安备 33010602011771号