项目是前后端分离的 springboot + vue
浏览器访问 可以直接拿到对应的域账户。
放在项目里面就直接报了这个错误,说是鉴权失败。401
对应的controller里面加了注解@CrossOrigin
但是没有效果的。感觉不是跨域的问题。因为只有前端访问这个接口的时候才会提示这个错误。
Access to XMLHttpRequest at 'http://localhost:18080/app/getExUserName' from origin 'http://localhost:8002' has been blocked by CORS policy: Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
在对应的filter里面加载配置。放在不需要登录的地方,浏览器直接访问就可以获取到域账户,但是使用前端访问连接,或者工具访问都不可以。我检查了所有的filter 其实并不是冲突,也没有冲突。因为我们是用的sso做的单点,跟这个应该是有关系的。然后我就吧!这个请求的URL换成了登录时的URL然后就可以获取到域账号了(域账号放到redis),而且不影响项目正常流程。
"/sso/login", "/sys/login"
获取到的域账号,放到全局。做一个访问前询问是否有这个账号,如果没有取到就是放到redis的超时了。重新登录即可。
这里必须要做到精准定位到域账号。也就是请求时每次都要更新全局。(set其实这个可以优化)不然会出现取错账号的问题。
问题解决了 就很开心。
@Value("${jcifs.smb.client.domain}") private String domain; @Value("${jcifs.http.domainController}") private String domainController; @Value("${jcifs.smb.client.username}") private String username; @Value("${jcifs.smb.client.password}") private String password;
@Bean public FilterRegistrationBean jcifsFilterRegistration() { FilterRegistrationBean<JcifsFilter> registration = new FilterRegistrationBean<>(); registration.setFilter(new JcifsFilter(domain, domainController, username, password)); //配置需要获取域控的请求路径也可以直接配置 '/*'(代表全部都会进行域控加载) // registration.addUrlPatterns("/*");//过滤所有请求 // registration.addUrlPatterns("/app/getExUserName");//请求的URL
registration.addUrlPatterns("/sql_implement", "/sso/login", "/sys/login"); registration.setName("NtlmHttpFilter");//第一个 registration.setOrder(1);//级别 return registration; }
启动就可以正常获取域账户