项目是前后端分离的 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;
}
启动就可以正常获取域账户