sso应用通过nginx配置反向代理后,原来的跨域失效了 40C

我这边有一个 8081/sso 的服务, 其他的服务在浏览器端(跨域的)访问或者操作它的cookie都没问题,
但当我 通过nginx配置了下 sso ,, 变成了 80/sso ,
然后别的服务就访问不到 soo 的cookie了,

    location /sso{
        proxy_pass http://localhost:8081;
        proxy_set_header X-Real-IP $remote_addr;
    }

请问这个配置要怎么改呀?
我试过改成这样, 也没起作用

location /sso{
        add_header 'Access-Control-Allow-Origin' '*';
        add_header 'Access-Control-Allow-Credentials' 'true';
        add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
        add_header 'Access-Control-Allow-Headers' 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type';
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Cookie $http_cookie;
        proxy_pass http://localhost:8081;
        proxy_cookie_domain domino.server nginx.server;
        proxy_redirect off;
    }

1个回答

qq_19430115
qq_19430115 我的路径没有发生变化啊,
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
基于Spring SAML1.0.4做的SSO 怎么配置 排除拦截请求
WEB项目基于ADFS做了SSO,借助与Spring security saml 1.0.4 完成的配置,配置完成后,发现WEB项目发布的API接口,别的系统却无法调成功,分析原因应该是接口请求也被SSO拦截了,如何配置spring的拦截排除系统发布的api接口请求 即https://XXXXXX/openapi 一类的请求,实现接口调用不需要SSO认证。求大神指点 web.xml ``` <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/securityContext.xml </param-value> </context-param> <servlet> <servlet-name>saml</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>saml</servlet-name> <url-pattern>/saml/web/*</url-pattern> </servlet-mapping> <filter> <filter-name>springSecurityFilterChain</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> </filter> <filter-mapping> <filter-name>springSecurityFilterChain</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> ``` spring--delegatingFilterProxy.java protected void initFilterBean() /* */ throws ServletException /* */ { /* 224 */ synchronized (this.delegateMonitor) { /* 225 */ if (this.delegate == null) /* */ { /* 227 */ if (this.targetBeanName == null) { /* 228 */ this.targetBeanName = getFilterName(); /* */ } /* */ /* 234 */ WebApplicationContext wac = findWebApplicationContext(); /* 235 */ if (wac != null) /* 236 */ this.delegate = initDelegate(wac); /* */ } /* */ } /* */ } /* */ /* */ public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) /* */ throws ServletException, IOException /* */ { /* 246 */ Filter delegateToUse = null; /* 247 */ synchronized (this.delegateMonitor) { /* 248 */ if (this.delegate == null) { /* 249 */ WebApplicationContext wac = findWebApplicationContext(); /* 250 */ if (wac == null) { /* 251 */ throw new IllegalStateException("No WebApplicationContext found: no ContextLoaderListener registered?"); /* */ } /* 253 */ this.delegate = initDelegate(wac); /* */ } /* 255 */ delegateToUse = this.delegate; /* */ } /* */ /* 259 */ invokeDelegate(delegateToUse, request, response, filterChain); /* */ } /* */ /* */ public void destroy() /* */ { /* 264 */ Filter delegateToUse = null; /* 265 */ synchronized (this.delegateMonitor) { /* 266 */ delegateToUse = this.delegate; /* */ } /* 268 */ if (delegateToUse != null) /* 269 */ destroyDelegate(delegateToUse); /* */ } /* */ /* */ protected WebApplicationContext findWebApplicationContext() /* */ { /* 292 */ if (this.webApplicationContext != null) /* */ { /* 294 */ if (((this.webApplicationContext instanceof ConfigurableApplicationContext)) && /* 295 */ (!((ConfigurableApplicationContext)this.webApplicationContext).isActive())) /* */ { /* 297 */ ((ConfigurableApplicationContext)this.webApplicationContext).refresh(); /* */ } /* */ /* 300 */ return this.webApplicationContext; /* */ } /* 302 */ String attrName = getContextAttribute(); /* 303 */ if (attrName != null) { /* 304 */ return WebApplicationContextUtils.getWebApplicationContext(getServletContext(), attrName); /* */ } /* */ /* 307 */ return WebApplicationContextUtils.getWebApplicationContext(getServletContext()); /* */ } /* */ /* */ protected Filter initDelegate(WebApplicationContext wac) /* */ throws ServletException /* */ { /* 326 */ Filter delegate = (Filter)wac.getBean(getTargetBeanName(), Filter.class); /* 327 */ if (isTargetFilterLifecycle()) { /* 328 */ delegate.init(getFilterConfig()); /* */ } /* 330 */ return delegate; /* */ } /* */ /* */ protected void invokeDelegate(Filter delegate, ServletRequest request, ServletResponse response, FilterChain filterChain) /* */ throws ServletException, IOException /* */ { /* 346 */ delegate.doFilter(request, response, filterChain); /* */ } ``` ```
如何使用PHP语言开发一个sso系统,要求能够兼容不同编程语言的子系统
如何使用PHP语言开发一个sso系统,要求能够兼容不同编程语言的子系统 比如,我使用PHP开发一个web应用,用java也开发了一个web应用。 怎么样,使这两个子应用都能使用PHP开发的sso系统?
cas sso 配置了,登录有通过数据库,但是跳转失败
1.生成安全证书: 运行cmd 切换到tomcat的目录下: 输入命令 “ keytool -genkey -alias localhost -keyalg RSA -storepass localhost -keystore D:\sso\tomcat-cas\localhost.keystore -validity 3600 ” //此时会生成别名为abc的abc.keystore 文件。 密码是abc 123 导出证书到key文件夹: 命令“ keytool -export -trustcacerts -alias localhost -file D:\sso\tomcat-cas\localhost.cer -keystore D:\sso\tomcat-cas\localhost.keystore -storepass localhost ”//此时会生成abc.cer文件。 将证书导入到JDK证书信任库: 命令“ keytool -import -trustcacerts -alias localhost -file D:\sso\tomcat-cas\localhost.cer -keystore “%JAVA_HOME%\jre\lib\security\cacerts” -storepass changeit ” 系统询问是否信任此证书,回答"y" --------“changeit” 是JDK证书信任库默认的密钥 我用这些指令生成证书,然后也配置了sso\tomcat-cas/conf/server.xml里面的<Connector port=”8443” protocol=”org.apache.coyote.http11.Http11Protocol” SSLEnabled=”true” maxThreads=”150” scheme=”https” secure=”true” clientAuth=”false” sslProtocol=”TLS” keystoreFile="D:/sso/tomcat-cas/abc.keystore" keystorePass="abc123" /> 这整一个sso文件是从别的电脑拷贝过来的,在那台电脑使用正常,而拷贝过来这台电脑就出现了输入帐号名密码,点击登录,浏览器出现10几秒的加载状态然后直接跳出CAS is Unavailable There was an error trying to complete your request. Please notify your support desk or try again. 的信息,请问一下是怎么回事,能不能帮帮忙
springboot分布式项目用cas做sso,服务间接口调用返回登录页
用springboot写了两个微服务,目前都在本地启动测试,cas server5.3已经部署到服务器上, 两个微服务设置好cas后启动,调用第一个服务接口,跳转到cas登陆,登陆成功后,第二个服务自己的接口也能够正常访问。 然后写服务间接口的调用,用的feign,在注释到cas后可以取到其他服务的接口返回值,但是加上cas后就返回登陆的html,而且这个html不能使用。但是不涉及到服务间调用的接口还是正常可以访问。不知道还需要配置什么,求大佬指教 ![图片说明](https://img-ask.csdn.net/upload/201910/14/1571030677_792935.png)
openstack keystone结合公司sso认证流程
使用OpenStack keystone的外部认证结合公司的sso系统。 官网只有一个根据证书进行验证的例子。 求具体的流程
CAS 跨域的问题
[color=red]麻烦各位了,有以下问题:[/color] CAS 是通过 TGT(Ticket Granting Ticket) 来获取 ST(Service Ticket) ,通过 ST 来访问服务。网上说配置好后。 CAS是基于agent的。一次完整的sso过程为 1.用户第一次打开系统A的页面 2.系统A发现当前用户没有登录 3.系统将登录过程委托给本地的agent,比如CAS的java client或者web client 4.本地agent将页面转向给sso系统,并且生成一个随机的token 5.用户在sso系统上输入账号密码,登录成功 6.sso系统调用系统A上agent的一个url,将账号信息加密发送回A 7.该agent通过生成的token解密账号信息,传送到系统A内部。 8.系统A接收到该账号随后进行授权操作。 如果用户打开系统B页面,而该系统也运行同一个SSO的agent,那么过程同上面类似,只是跳过第5步。这时用户浏览器都是处于SSO系统所在域,所以可以直接将以前用户的账号信息发回。 ------------------------------ [color=red]不是很明白,用户先访问A后,再本地访问访问B的时候,系统B收到什么信息可以确认改用户访问过A!系统A与系统B的域名不一样,不会是cookie,那是什么?在网上看了看,下面一段[/color] 上图是一个最基础的 CAS 协议, CAS Client 以 Filter 方式保护 Web 应用的受保护资源,过滤从客户端过来的每一个 Web 请求,同时, CAS Client 会分析 HTTP 请求中是否包请求 Service Ticket( 上图中的 Ticket) ,如果没有,则说明该用户是没有经过认证的,于是, CAS Client 会重定向用户请求到 CAS Server ( Step 2 )。 Step 3 是用户认证过程,如果用户提供了正确的 Credentials , CAS Server 会产生一个随机的 Service Ticket ,然后,缓存该 Ticket ,并且重定向用户到 CAS Client (附带刚才产生的 Service Ticket ), Service Ticket 是不可以伪造的,最后, Step 5 和 Step6 是 CAS Client 和 CAS Server 之间完成了一个对用户的身份核实,用 Ticket 查到 Username ,因为 Ticket 是 CAS Server 产生的,因此,所以 CAS Server 的判断是毋庸置疑的。 ----------------- [color=red]CAS Client 会分析 HTTP 请求中是否包请求 Service Ticket,这个st 是怎么放到http请求中去的?网上那些例子好像直接输入一个url,不带参数的,也有单点登录效果。[/color] [b]问题补充:[/b] 7.原理剖析 Yale CAS使用了Ticket Granting Cookie (简称TGC)去作为获取Service Ticket(简称ST)的凭据,这个TGC 是保存在客户端的cookie,即当第2次被其他CAS Client重定向的时候,CAS Server实际上已经从用户的Cookie中抓取到TGC,然后知道TGC对应的用户,因此避免了再次登录,如果CAS Server抓取不到TGC,则用户需要登陆。 众所周知,cookie是不能跨域的。但是CAS能够做abc.com和xyz.com的sso,因为CAS Server缓存了所有的ticket,所以Client无需共享cookies。 ------------------ 是不是这个CAS server 也可以通过http访问的 应用场景是不是这样 :一个应用 是 domain1.com一个应用是domain2.com cas server 的 域名 是 domain.com ,所有对 domain1和domain2 的请求都会转发到domain.com,没有登录的话,在domain.com登陆,设置的cookie TGC的域是doamin.com,以后所有对domain1和domain2的请求都会转发到domain.com,也就是CAS server ,这个时候便可以获得这个cookie TGC进行验证。 是不是这样? [b]问题补充:[/b] 呵呵 谢谢 我先前不清楚的地方就是 我觉得先登录A后,再进入B时候,必须携带一个标志,才能证明这个用户先前已经登陆了,而A 与B的域不同,进入B的时候不能拿到cookie的,原来都会转发到一个统一的域拿到这个cookie,也就是标志,而这个cookie也是通过cas server进行设置的,cas server是可以通过http访问的,所以可以在浏览器下设置这个cookie。当然也可以在登录完后在A ,B各自的域设置cookie。 那这种模式,我也可以自己实现 ,不用cas了?? 好像配置cas的时候有什么key的 是用来干什么的,加密信息吗?加密什么信息?谢谢 我没有配置过,之前在做一个单点登录的时候碰到问题就百度到了 cas 呵呵
ServletRequest如何取值?
开发SSO。我在重写shiro的UserFilter的isAccessAllowed方法 ![图片说明](https://img-ask.csdn.net/upload/201911/18/1574067709_172119.jpg) debug的时候发现这个request里面有我需要的数据,但是用getAtrribute()和getParameter()都不行,请问该怎么办,这是shiro包装后的
关于SSO认证 和授权的问题
公司有4套系统,现在每个系统都有独立的用户管理模块,和用户权限模块。 这样用户使用起来就不是很方便,所以公司希望通过SSO单点登录来解决用户账户管理的复杂度。 本人想到的方案是,建立一套Standalone 的SSO server ,用户访问各子系统时,跳转至sso登录界面 去完成用户认证,解决who are you 的问题,然后个子系统根据拿到的用户信息,匹配子系统中的用户权限,然后使用子系统。但是这样的问题在于,SSO server端 和子系统端都需要设置用户表,同时需要保证两边的用户表数据的即时同步,做起来会比较复杂,所以想知道有没有其他比较合适的好方法。
关于SSO单点登陆系统,如何实现退出功能?
多系统单点登陆,目前已实现,通过验证用户名和密码返回一个GUID的令牌给用户,SSO系统把令牌信息保存到缓存里面,第二个应用通过cookie或者缓存共享的令牌直接通过SSO登陆。 退出功能目前也是通过接口实现,需要用户在应用上退出,并且在SSO上删除缓存。 但是问题来了,很多用户是直接关闭浏览器,或者遇到浏览器奔溃,直接强行关闭应用的。 类似非正常退出的情况下,如何实现判断退出?
急!求跨域获取cookie的方法
比如我们单点登录域名是www.sso.com 一个子系统域名是www.aaa.com 现在我们子系统登录,由于初次登录会跳转到www.sso.com,在这个系统里面会生成cookie,成功后会跳转回www.aaa.com 现在第二次登录,www.aaa.com如何直接获取到www.sso.com的cookie?
如何Android实现SSO(请耐心看完以下内容再回答)
最近在做公司项目,领导要求做一个单点登录SSO,我查遍整个百度,大概得到都是Android 连接新浪,人人,Oauth 2.0第三方接入,我想自己的项目实现单点登录,原理什么都大概看过,需要详细的解决方案,不需要讲web 应用那一套,我知道web有cook,可以保存,Android怎么实现,求做过的人分享一下,需要钞票,或者积分都可以商量,关键是做出来。
Application startup failed
``` 2019-11-14 10:13:09,698 ERROR 9667 --- [ main] o.springframework.boot.SpringApplication : Application startup failed org.springframework.beans.factory.BeanDefinitionStoreException: Failed to process import candidates for configuration class [com.dtdream.eta.web.EGGovUaaWebDubboApplication]; nested exception is org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'shiroAutoConfiguration' for bean class [com.dtdream.eta.web.auth.autoconfigure.ShiroAutoConfiguration] conflicts with existing, non-compatible bean definition of same name and class [com.dtdream.eta.web.uaa.autoconfigure.ShiroAutoConfiguration] at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:546) at org.springframework.context.annotation.ConfigurationClassParser.processDeferredImportSelectors(ConfigurationClassParser.java:482) at org.springframework.context.annotation.ConfigurationClassParser.parse(ConfigurationClassParser.java:191) at org.springframework.context.annotation.ConfigurationClassPostProcessor.processConfigBeanDefinitions(ConfigurationClassPostProcessor.java:321) at org.springframework.context.annotation.ConfigurationClassPostProcessor.postProcessBeanDefinitionRegistry(ConfigurationClassPostProcessor.java:243) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanDefinitionRegistryPostProcessors(PostProcessorRegistrationDelegate.java:273) at org.springframework.context.support.PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(PostProcessorRegistrationDelegate.java:98) at org.springframework.context.support.AbstractApplicationContext.invokeBeanFactoryPostProcessors(AbstractApplicationContext.java:681) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:523) at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122) at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759) at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369) at org.springframework.boot.SpringApplication.run(SpringApplication.java:313) at com.dtdream.eta.web.EGGovUaaWebDubboApplication.main(EGGovUaaWebDubboApplication.java:57) Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name 'shiroAutoConfiguration' for bean class [com.dtdream.eta.web.auth.autoconfigure.ShiroAutoConfiguration] conflicts with existing, non-compatible bean definition of same name and class [com.dtdream.eta.web.uaa.autoconfigure.ShiroAutoConfiguration] at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.checkCandidate(ClassPathBeanDefinitionScanner.java:320) at org.springframework.context.annotation.ClassPathBeanDefinitionScanner.doScan(ClassPathBeanDefinitionScanner.java:259) at org.springframework.context.annotation.ComponentScanAnnotationParser.parse(ComponentScanAnnotationParser.java:144) at org.springframework.context.annotation.ConfigurationClassParser.doProcessConfigurationClass(ConfigurationClassParser.java:275) at org.springframework.context.annotation.ConfigurationClassParser.processConfigurationClass(ConfigurationClassParser.java:237) at org.springframework.context.annotation.ConfigurationClassParser.processImports(ConfigurationClassParser.java:537) ... 13 common frames omitted Disconnected from the target VM, address: '127.0.0.1:55237', transport: 'socket' Process finished with exit code 1 ``` 附上两个配置文件配置:com.dtdream.eta.web.auth.autoconfigure.ShiroAutoConfiguration package com.dtdream.eta.web.auth.autoconfigure; import com.dtdream.eta.web.auth.cache.JedisCacheManager; import com.dtdream.eta.web.auth.mobile.AppDefaultWebSessionManager; import com.dtdream.eta.web.auth.mobile.AppSessionIdGenerator; import com.dtdream.eta.web.auth.mobile.AppTokenRealm; import com.dtdream.eta.web.auth.mobile.MobileAuthFilter; import com.dtdream.eta.web.auth.shiro.*; import com.dtdream.eta.web.auth.oauth2.OAuth2AuthenticationFilter; import com.dtdream.eta.web.auth.oauth2.OAuth2Realm; import com.dtdream.gamma.account.service.AccountPrivilegeReadService; import com.dtdream.gamma.organization.service.EmployeeReadService; import com.dtdream.gamma.uaa.service.OauthAccessTokenReadService; import com.google.common.base.Strings; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.apache.shiro.cache.CacheManager; import org.apache.shiro.codec.Base64; import org.apache.shiro.mgt.RememberMeManager; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.realm.Realm; import org.apache.shiro.session.mgt.SessionManager; import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO; import org.apache.shiro.session.mgt.eis.SessionDAO; import org.apache.shiro.session.mgt.eis.SessionIdGenerator; import org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler; import org.apache.shiro.spring.LifecycleBeanPostProcessor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.filter.authc.AuthenticationFilter; import org.apache.shiro.web.mgt.CookieRememberMeManager; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.servlet.AbstractShiroFilter; import org.apache.shiro.web.servlet.Cookie; import org.apache.shiro.web.servlet.ShiroHttpSession; import org.apache.shiro.web.servlet.SimpleCookie; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered; import org.springframework.core.annotation.Order; import org.springframework.data.redis.core.RedisTemplate; import javax.servlet.Filter; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; /** * */ @Configuration @Slf4j @Order(Ordered.LOWEST_PRECEDENCE) public class ShiroAutoConfiguration { @Bean @Autowired public CacheManager shiroCacheManager(EtaAuthProperties properties, RedisTemplate redisTemplate){ return new JedisCacheManager(redisTemplate); } @Bean @Autowired public AuthorizingRealm oAuth2Realm(EtaAuthProperties properties, EmployeeReadService employeeReadService, AccountPrivilegeReadService accountPrivilegeReadService, CacheManager cacheManager){ OAuth2Realm oAuth2Realm = new OAuth2Realm(cacheManager.getCache(JedisCacheManager.loginUserName)); oAuth2Realm.setCachingEnabled(true); oAuth2Realm.setAuthenticationCachingEnabled(true); oAuth2Realm.setAuthenticationCacheName(JedisCacheManager.authenticationName); oAuth2Realm.setAuthorizationCachingEnabled(true); oAuth2Realm.setAuthorizationCacheName(JedisCacheManager.authorizationName); oAuth2Realm.setProperties(properties); oAuth2Realm.setEmployeeReadService(employeeReadService); oAuth2Realm.setAccountPrivilegeReadService(accountPrivilegeReadService); return oAuth2Realm; } @Bean @Autowired public AppTokenRealm appTokenRealm(EtaAuthProperties properties, OauthAccessTokenReadService oauthAccessTokenReadService, EmployeeReadService employeeReadService, AccountPrivilegeReadService accountPrivilegeReadService, CacheManager cacheManager){ AppTokenRealm appTokenRealm = new AppTokenRealm(cacheManager.getCache(JedisCacheManager.loginUserName)); appTokenRealm.setCachingEnabled(true); appTokenRealm.setAuthenticationCachingEnabled(true); appTokenRealm.setAuthenticationCacheName(JedisCacheManager.authenticationName); appTokenRealm.setAuthorizationCachingEnabled(true); appTokenRealm.setAuthorizationCacheName(JedisCacheManager.authorizationName); appTokenRealm.setProperties(properties); appTokenRealm.setEmployeeReadService(employeeReadService); appTokenRealm.setAccountPrivilegeReadService(accountPrivilegeReadService); appTokenRealm.setOauthAccessTokenReadService(oauthAccessTokenReadService); return appTokenRealm; } // @Bean // @Autowired // public AppTokenRealm appTokenRealm(){ // AppTokenRealm appTokenRealm = new AppTokenRealm(); // return appTokenRealm; // } @Bean public SessionIdGenerator sessionIdGenerator(){ return new AppSessionIdGenerator(); } @Bean @Autowired public Cookie sessionIdCookie(EtaAuthProperties properties){ SimpleCookie template = properties.getCookie(); SimpleCookie cookie; if (null == template){ cookie = new SimpleCookie(); cookie.setPath("/"); cookie.setName(ShiroHttpSession.DEFAULT_SESSION_ID_NAME); return cookie; } cookie = new SimpleCookie(template); if (null == cookie.getPath()) cookie.setPath("/"); if (Strings.isNullOrEmpty(cookie.getName())) cookie.setName(ShiroHttpSession.DEFAULT_SESSION_ID_NAME); return cookie; } @Bean public Cookie rememberMeCookie(){ SimpleCookie cookie = new SimpleCookie("rememberMe"); cookie.setHttpOnly(true); cookie.setMaxAge(2592000); return cookie; } @Bean @Autowired @Qualifier("rememberMeCookie") public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) throws BeansException { CookieRememberMeManager rememberMeManager = new CookieRememberMeManager(); rememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag==")); rememberMeManager.setCookie(rememberMeCookie); return rememberMeManager; } @Bean @Autowired public SessionDAO sessionDAO(@Qualifier("sessionIdGenerator") SessionIdGenerator sessionIdGenerator, CacheManager cacheManager){ EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO(); sessionDAO.setActiveSessionsCacheName(JedisCacheManager.sessionName); sessionDAO.setSessionIdGenerator(sessionIdGenerator); sessionDAO.setCacheManager(cacheManager); return sessionDAO; } @Bean public QuartzSessionValidationScheduler sessionValidationScheduler(){ QuartzSessionValidationScheduler scheduler = new QuartzSessionValidationScheduler(); scheduler.setSessionValidationInterval(10000); //scheduler.setSessionManager((ValidatingSessionManager)applicationContext.getBean("sessionManager")); return scheduler; } @Bean @Autowired public SessionManager sessionManager(QuartzSessionValidationScheduler scheduler, SessionDAO sessionDAO, @Qualifier("sessionIdCookie") Cookie sessionIdCookie){ AppDefaultWebSessionManager sessionManager = new AppDefaultWebSessionManager(); sessionManager.setGlobalSessionTimeout(7200000); sessionManager.setDeleteInvalidSessions(true); sessionManager.setSessionValidationSchedulerEnabled(false); //关闭session检查,否则会乱扫描redis //sessionManager.setSessionValidationScheduler(scheduler); scheduler.setSessionManager(sessionManager); sessionManager.setSessionDAO(sessionDAO); sessionManager.setSessionIdCookieEnabled(true); sessionManager.setSessionIdCookie(sessionIdCookie); return sessionManager; } @Bean @Autowired public SecurityManager securityManager(List<Realm> realms, SessionManager sessionManager, CacheManager cacheManager, RememberMeManager rememberMeManager){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealms(realms); securityManager.setSessionManager(sessionManager); securityManager.setCacheManager(cacheManager); //securityManager.setRememberMeManager(rememberMeManager); SecurityUtils.setSecurityManager(securityManager); return securityManager; } @Bean @Autowired public AuthenticationFilter oAuth2AuthenticationFilter(EtaAuthProperties properties){ OAuth2AuthenticationFilter oAuth2AuthenticationFilter = new OAuth2AuthenticationFilter(); oAuth2AuthenticationFilter.setAuthcCodeParam("code"); oAuth2AuthenticationFilter.setFailureUrl("/error"); oAuth2AuthenticationFilter.setProperties(properties); return oAuth2AuthenticationFilter; } @Bean @Autowired public Filter shiroFilter(SecurityManager securityManager, @Qualifier("oAuth2AuthenticationFilter") AuthenticationFilter oath2Filter, EtaAuthProperties properties, EtaAuthFilter authFilter, MobileAuthFilter mobileAuthFilter, CurrentUserEnvFilter userEnvFilter, EtaEgFilter etaEgFilter) throws Exception{ ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); filterFactoryBean.setSecurityManager(securityManager); filterFactoryBean.setLoginUrl(null); filterFactoryBean.setSuccessUrl("/"); Map<String, Filter> filters = new HashMap<>(); filters.put("oauth2Authc", oath2Filter); filters.put("mobileAuthFilter",mobileAuthFilter); filters.put("userEnv", userEnvFilter); filters.put("etaEgFilter", etaEgFilter); filters.put("perm", authFilter); filterFactoryBean.setFilters(filters); Map<String, String> map = new HashMap<>(); String ssoPath; try { URL url = new URL(properties.getOauth2().sso.loginPath); ssoPath = url.getPath(); }catch (Exception e){ ssoPath = properties.getOauth2().sso.loginPath; } if (properties.off){ map.put("/**", "anon, userEnv"); }else{ map.put("/", "anon"); //这个地方有问题,先放着,放在这里能发现更多问题 map.put("/error", "anon"); map.put(ssoPath, "oauth2Authc"); /*map.put("/logout", "logout"); lout使用自己controller*/ /*为政务提供的需要签名认证的api*/ map.put("/openApi/**", "etaEgFilter"); map.put("/**", "mobileAuthFilter, perm, userEnv"); filterFactoryBean.setFilterChainDefinitionMap(map); } return new EtaWebAuthShiroFilterWrapper((AbstractShiroFilter) filterFactoryBean.getObject()); } @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){ return new LifecycleBeanPostProcessor(); } } ``` 另一个:com.dtdream.eta.web.uaa.autoconfigure.ShiroAutoConfiguration ``` package com.dtdream.eta.web.uaa.autoconfigure; import com.dtdream.eta.web.common.ca.realm.CABindingRealm; import com.dtdream.eta.web.common.ca.realm.CARealm; import com.dtdream.eta.web.common.shiro.ShiroFilterWrapper; import com.dtdream.eta.web.uaa.cache.JedisCacheManager; import com.dtdream.eta.web.uaa.filter.LoginFilter; import com.dtdream.eta.web.uaa.realm.*; import com.dtdream.eta.web.uaa.session.UaaWebSessionManager; import com.google.common.base.Strings; import lombok.extern.slf4j.Slf4j; import org.apache.shiro.SecurityUtils; import org.apache.shiro.cache.CacheManager; import org.apache.shiro.codec.Base64; import org.apache.shiro.mgt.RememberMeManager; import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.realm.Realm; import org.apache.shiro.session.mgt.SessionManager; import org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO; import org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator; import org.apache.shiro.session.mgt.eis.SessionDAO; import org.apache.shiro.session.mgt.eis.SessionIdGenerator; import org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler; import org.apache.shiro.spring.LifecycleBeanPostProcessor; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.CookieRememberMeManager; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.apache.shiro.web.servlet.AbstractShiroFilter; import org.apache.shiro.web.servlet.Cookie; import org.apache.shiro.web.servlet.ShiroHttpSession; import org.apache.shiro.web.servlet.SimpleCookie; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.core.RedisTemplate; import javax.servlet.Filter; import java.util.HashMap; import java.util.List; import java.util.Map; /** * */ @Configuration @Slf4j public class ShiroAutoConfiguration { @Bean @Autowired public CacheManager cacheManager(EtaUaaProperties properties, RedisTemplate redisTemplate){ return new JedisCacheManager(redisTemplate); } @Bean @Autowired public ShiroRealm shiroRealm(){ ShiroRealm shiroRealm = new ShiroRealm(); return shiroRealm; } @Bean @Autowired public ThirdPartyRealm ThirdPartyRealm(){ ThirdPartyRealm thirdPartyRealm = new ThirdPartyRealm(); return thirdPartyRealm; } @Bean @Autowired public SmsRealm smsRealm() { SmsRealm smsRealm = new SmsRealm(); return smsRealm; } @Bean @Autowired public CARealm caRealm(){ CARealm caRealm = new CARealm(); return caRealm; } @Bean @Autowired public CABindingRealm caBindingRealm(){ CABindingRealm caBindingRealm = new CABindingRealm(); return caBindingRealm; } @Bean public SessionIdGenerator sessionIdGenerator(){ return new JavaUuidSessionIdGenerator(); } @Bean @Autowired public Cookie sessionIdCookie(EtaUaaProperties properties){ SimpleCookie template = properties.getCookie(); SimpleCookie cookie; if (null == template){ cookie = new SimpleCookie(); cookie.setPath("/"); cookie.setName(ShiroHttpSession.DEFAULT_SESSION_ID_NAME); return cookie; } cookie = new SimpleCookie(template); if (null == cookie.getPath()) cookie.setPath("/"); if (Strings.isNullOrEmpty(cookie.getName())) cookie.setName(ShiroHttpSession.DEFAULT_SESSION_ID_NAME); return cookie; } @Bean public Cookie rememberMeCookie(){ SimpleCookie cookie = new SimpleCookie("rememberMe"); cookie.setHttpOnly(true); cookie.setMaxAge(2592000); return cookie; } @Bean @Autowired @Qualifier("rememberMeCookie") public CookieRememberMeManager rememberMeManager(SimpleCookie rememberMeCookie) throws BeansException { CookieRememberMeManager rememberMeManager = new CookieRememberMeManager(); rememberMeManager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag==")); rememberMeManager.setCookie(rememberMeCookie); return rememberMeManager; } @Bean @Autowired public SessionDAO sessionDAO(@Qualifier("sessionIdGenerator") SessionIdGenerator sessionIdGenerator, CacheManager cacheManager){ EnterpriseCacheSessionDAO sessionDAO = new EnterpriseCacheSessionDAO(); sessionDAO.setActiveSessionsCacheName(JedisCacheManager.sessionName); sessionDAO.setSessionIdGenerator(sessionIdGenerator); sessionDAO.setCacheManager(cacheManager); return sessionDAO; } @Bean public QuartzSessionValidationScheduler sessionValidationScheduler(){ QuartzSessionValidationScheduler scheduler = new QuartzSessionValidationScheduler(); scheduler.setSessionValidationInterval(7200000); //scheduler.setSessionManager((ValidatingSessionManager)applicationContext.getBean("sessionManager")); return scheduler; } @Bean @Autowired public SessionManager sessionManager(QuartzSessionValidationScheduler scheduler, SessionDAO sessionDAO, @Qualifier("sessionIdCookie") Cookie sessionIdCookie){ UaaWebSessionManager sessionManager = new UaaWebSessionManager(); sessionManager.setGlobalSessionTimeout(7200000); sessionManager.setDeleteInvalidSessions(true); sessionManager.setSessionValidationSchedulerEnabled(false); /*sessionManager.setSessionValidationScheduler(scheduler);*/ scheduler.setSessionManager(sessionManager); sessionManager.setSessionDAO(sessionDAO); sessionManager.setSessionIdCookieEnabled(true); sessionManager.setSessionIdCookie(sessionIdCookie); return sessionManager; } @Bean @Autowired public SecurityManager securityManager(List<Realm> realms, SessionManager sessionManager, CacheManager cacheManager, RememberMeManager rememberMeManager){ DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); securityManager.setRealms(realms); securityManager.setSessionManager(sessionManager); securityManager.setCacheManager(cacheManager); //securityManager.setRememberMeManager(rememberMeManager); SecurityUtils.setSecurityManager(securityManager); return securityManager; } @Bean @Autowired public Filter shiroFilter(SecurityManager securityManager, EtaUaaProperties properties, LoginFilter loginFilter) throws Exception { ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean(); filterFactoryBean.setSecurityManager(securityManager); filterFactoryBean.setLoginUrl(null); filterFactoryBean.setSuccessUrl("/"); Map<String, Filter> filters = new HashMap<>(); filters.put("loginFilter", loginFilter); filterFactoryBean.setFilters(filters); Map<String, String> map = new HashMap<>(); if (properties.off) { map.put("/**", "anon"); } else { map.put("/login", "loginFilter"); map.put("/iframe/login", "loginFilter"); map.put("/**", "anon"); } filterFactoryBean.setFilterChainDefinitionMap(map); return new ShiroFilterWrapper((AbstractShiroFilter) filterFactoryBean.getObject()); } @Bean public LifecycleBeanPostProcessor lifecycleBeanPostProcessor(){ return new LifecycleBeanPostProcessor(); } } ```
sso退出的原理是什么?
我是用共享cookie实现sso,cookie 里面保存了加密后的用户名 密码,子应用通过filter拦截cookie进行本地登陆,现在的问题是sso用户退出如何实现? 我的思路是: 先删除共享cookie 然后用httpclient分别调用各个子应用的logout url 如 http://a.mydomain/logout.do 这种方法比较麻烦 还有一种思路是sso logout时只删除共享cookie,然后在过滤器中判断,并删除子应用的登陆数据 sso退出应该有比较成熟的解决方案 有了解的麻烦回复一下
关于sso单点登录问题
最近要做一个sso整合子系统。 我打算做成webservice形式的sso认证服务。 请问下 1.对数据库的访问查找确认身份放在sso认证系统 还是放在子系统呢。 2.如果放在sso认证系统,那么sso系统里面应该怎么实现不同表的查询登录。 3.每个子系统的登录角色、登录权限、登录用户不一样,需要查询的表也不一样,怎么考虑。
Asp.net core下的UserManager如何扩展功能?
基于IdentityServer4示例代码部署了一套SSO并实现QQ第三方登录之后,想在IS4基础之上再扩展一下身份服务的功能。大致的想法是: 1.给IdentityUser增加一些常用的字段,比如微信昵称、QQ昵称; 2.增加几个不太常用的表,比如详细个人信息、个人认证情况等,一般对应于App上第二层子菜单里面的内容。 第一个想法比较容易实现,只要实现一个继承IdentityUser的子类,然后在用到IdentityUser泛型类的地方(比如UserManager<IdentityUser>)替换成新的子类就可以了(如UserManager<NewUser>)。 第二个想法,则有很多实现方法,我能想到的有比如写一个新的DbContext去连接新增的数据表,然后再写新的Manager和UserStore代码去实现想要的方法即可。但是,是不是有可能扩展原来的UserManager、UserStore、ApplicationDbContext这样一种做法呢? 要扩展UserManager,我看下来大致有继承方式、extension方式。不过从IS4示例代码来看,似乎注入新的manager会出现不少麻烦。 示例代码添加UserManager和UserStore是通过以下代码完成的: ``` services .AddIdentity<IdentityUser, IdentityRole>(null) .AddImadyEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); ``` 查看Asp.Net Core的源码可以看到,AddIdentity扩展方法添加了一串诸如各种Validator的服务后添加了UserManager: ``` ...... services.TryAddScoped<UserManager<IdentityUser>>(); services.TryAddScoped<SignInManager<IdentityUser>>(); ...... ``` 而UserStore则是在AddImadyEntityFrameworkStores中完成的: ``` ...... AddStores(builder.Services, builder.UserType, builder.RoleType, typeof(TContext)); ...... ``` 于是我想,是否可以自己写两个新的IServiceCollection扩展方法,替换掉AddIdentity和AddImadyEntityFrameworkStores就能为所欲为了呢? 实际操作下来发现没有这么简单,运行时各种服务解析问题的报错。主要是Asp.Net Core代码中向框架大量请求了UserManager和IUserStore,而UserManager注入是不通过接口方式的,IUserStore则是AddImadyEntityFrameworkStores扩展方法中通过反射方式添加的注入,反正我是没最终搞定。 所以把这个问题放到问答来,看看各位大牛一般在实战中是如何操作的呢?
confluence接入自己的sso
目前公司希望将wiki接入自己的sso,谁有相关的经验可以共同交流一下
系统1与SSO做了单点集成,系统2却无法单独登录了
系统1与SSO做了单点集成,经配置后,用户可接在系统1的页面打开系统2,但系统2的管理后台却无法使用单独的页面进行登录,提示验证失败,请各路大神分析下原因,谢谢.
请教大神,一个爬虫问题
``` import requests import re url = 'http://s.taobao.com/search?q=书包&s=0' def gethtmltext(url, timeout = 30): kv = {'user-agent':'Mozilla/5.0'} r = requests.get(url,headers = kv) r.raise_for_status() r.encoding = r.apparent_encoding print(r.text) return r.text gethtmltext('http://s.taobao.com/search?q=书包&s=0') ``` 用pycharm返回的的text是这样的 ``` <script> // 千牛不提示 var isQianniu = navigator.userAgent.toLowerCase().indexOf('qianniu') !== -1; var checkValue = "cookieCheck"+"="+"57041"; if(!isQianniu && document.cookie != null && document.cookie.indexOf(checkValue) < 0){ alert("您的浏览器限制了第三方Cookie,这将影响您正常登录,您可以更改浏览器的隐私设置,解除限制后重试。"); } </script> <div class="hd"> <div class="login-switch" onselectstart="return false;"> <i class="iconfont quick" id="J_Static2Quick" onclick="javascript:goldlog.record('/member.13.1','','','H46777383')">&#xe628;</i> <i class="iconfont static" id="J_Quick2Static">&#xe626;</i> </div> <div class="login-tip"> <div class="poptip"> <div class="poptip-arrow"> <em></em> <span></span> </div> <div class="poptip-content"> <i class="iconfont">&#xe625;</i>扫码登录更安全 </div> </div> </div> </div> <div class="bd"> <!--登录的错误信息结束--> <div id="J_QuickLogin" class="ww-login hidden"> <form action="" class="ww-form"> <div class="login-title"> 选择其中一个已登录的账户 </div> <div class="ww-userlist"> </div> <div class="trigger"> </div> <div class="submit"> <button type="submit" class="J_Submit" id="J_SubmitQuick">登 录</button> </div> <div class="other-login"> <a href="" class="light-link" id="J_Sso2Static">使用其他账户登录</a> </div> </form> </div> <div id="J_MiserLogin" class="ww-login hidden"> <form action="" class="ww-form"> <input type="hidden" id="x_token" value=""> <div class="login-title"> 选择其中一个已登录的账户 </div> <div class="ww-userlist"> </div> <div class="trigger"> </div> <div class="submit"> <p><input type="checkbox" id="J_Mdelete"> 不再记住密码</p> <button type="submit" tabindex="5" id="J_SubmitMiser">登 录</button> </div> <div class="other-login"> <a href="" title="使用其他账户登录" class="light-link" id="J_Miser2Static">使用其他账户登录</a> </div> </form> </div> <!--标准登录框--> <div class="static-form " id="J_StaticForm"> <div class="login-title"> 密码登录 </div> <form action="/member/login.jhtml?redirectURL=http%3A%2F%2Fs.taobao.com%2Fsearch%3Fq%3D%25E4%25B9%25A6%25E5%258C%2585%26s%3D0" method="post" id="J_Form"> <div id="J_Message" style="display:none;" class="login-msg error"> <i class="iconfont">&#xe604;</i> <p class="error"></p> </div> <!-- 手机号登录 --> <div class="field ph-hide username-field "> <label for="TPL_username_1"> <i class="iconfont" title="会员名">&#xe601;</i></label> <span class="ph-label">会员名/邮箱/手机号</span> <input type="text" name="TPL_username" id="TPL_username_1" class="login-text J_UserName" value="" maxlength="32" tabindex="1" aria-label="会员名/邮箱/手机号"/> </div> ``` 但是我自己用浏览器搜索这个url的时候,源代码是有商品信息的,请教大神如何解决呢?
sso跳转到请求页面时的问题
sso跳转到请求页面时: 1、当程序用tomcat部署的时候,能获取到传递的参数。 2、当程序用was部署的时候,不能获取到,为空。
130 个相见恨晚的超实用网站,一次性分享出来
相见恨晚的超实用网站 持续更新中。。。
字节跳动视频编解码面经
三四月份投了字节跳动的实习(图形图像岗位),然后hr打电话过来问了一下会不会opengl,c++,shador,当时只会一点c++,其他两个都不会,也就直接被拒了。 七月初内推了字节跳动的提前批,因为内推没有具体的岗位,hr又打电话问要不要考虑一下图形图像岗,我说实习投过这个岗位不合适,不会opengl和shador,然后hr就说秋招更看重基础。我当时想着能进去就不错了,管他哪个岗呢,就同意了面试...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、PDF搜索网站推荐 对于大部
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
致 Python 初学者
欢迎来到“Python进阶”专栏!来到这里的每一位同学,应该大致上学习了很多 Python 的基础知识,正在努力成长的过程中。在此期间,一定遇到了很多的困惑,对未来的学习方向感到迷茫。我非常理解你们所面临的处境。我从2007年开始接触 python 这门编程语言,从2009年开始单一使用 python 应对所有的开发工作,直至今天。回顾自己的学习过程,也曾经遇到过无数的困难,也曾经迷茫过、困惑过。开办这个专栏,正是为了帮助像我当年一样困惑的 Python 初学者走出困境、快速成长。希望我的经验能真正帮到你
加快推动区块链技术和产业创新发展,2019可信区块链峰会在京召开
      11月8日,由中国信息通信研究院、中国通信标准化协会、中国互联网协会、可信区块链推进计划联合主办,科技行者协办的2019可信区块链峰会将在北京悠唐皇冠假日酒店开幕。   区块链技术被认为是继蒸汽机、电力、互联网之后,下一代颠覆性的核心技术。如果说蒸汽机释放了人类的生产力,电力解决了人类基本的生活需求,互联网彻底改变了信息传递的方式,区块链作为构造信任的技术有重要的价值。   1
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
知乎高赞:中国有什么拿得出手的开源软件产品?(整理自本人原创回答)
知乎高赞:中国有什么拿得出手的开源软件产品? 在知乎上,有个问题问“中国有什么拿得出手的开源软件产品(在 GitHub 等社区受欢迎度较好的)?” 事实上,还不少呢~ 本人于2019.7.6进行了较为全面的 回答 - Bravo Yeung,获得该问题下回答中得最高赞(236赞和1枚专业勋章),对这些受欢迎的 Github 开源项目分类整理如下: 分布式计算、云平台相关工具类 1.SkyWalk
iOS Bug 太多,苹果终于坐不住了!
开源的 Android 和闭源的 iOS,作为用户的你,更偏向哪一个呢? 整理 | 屠敏 出品 | CSDN(ID:CSDNnews) 毋庸置疑,当前移动设备操作系统市场中,Android 和 iOS 作为两大阵营,在相互竞争的同时不断演进。不过一直以来,开源的 Android 吸引了无数的手机厂商涌入其中,为其生态带来了百花齐放的盛景,但和神秘且闭源的 iOS 系统相比,不少网友
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观...
为什么你学不过动态规划?告别动态规划,谈谈我的经验
动态规划难吗?说实话,我觉得很难,特别是对于初学者来说,我当时入门动态规划的时候,是看 0-1 背包问题,当时真的是一脸懵逼。后来,我遇到动态规划的题,看的懂答案,但就是自己不会做,不知道怎么下手。就像做递归的题,看的懂答案,但下不了手,关于递归的,我之前也写过一篇套路的文章,如果对递归不大懂的,强烈建议看一看:为什么你学不会递归,告别递归,谈谈我的经验 对于动态规划,春招秋招时好多题都会用到动态...
(经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
今年正式步入了大四,离毕业也只剩半年多的时间,回想一下大学四年,感觉自己走了不少弯路,今天就来分享一下自己大学的学习经历,也希望其他人能不要走我走错的路。 (一)初进校园 刚进入大学的时候自己完全就相信了高中老师的话:“进入大学你们就轻松了”。因此在大一的时候自己学习的激情早就被抛地一干二净,每天不是在寝室里玩游戏就是出门游玩,不过好在自己大学时买的第一台笔记本性能并不是很好,也没让我彻底沉...
使用 Angular 打造微前端架构的 ToB 企业级应用
这篇文章其实已经准备了11个月了,因为虽然我们年初就开始使用 Angular 的微前端架构,但是产品一直没有正式发布,无法通过生产环境实践验证可行性,11月16日我们的产品正式灰度发布,所以是时候分享一下我们在使用 Angular 微前端这条路上的心得(踩过的坑)了额,希望和 Angular 社区一起成长一起进步,如果你对微前端有一定的了解并且已经在项目中尝试了可以忽略前面的章节。 什么是微前...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
拿下微软、Google、Adobe,印度为何盛产科技圈 CEO?
作者 | 胡巍巍 出品 | CSDN(ID:CSDNnews) 世界500强中,30%的掌舵人,都是印度人。 是的,你没看错。这是近日《哈佛商业评论》的研究结果。 其中又以微软CEO萨提亚·纳德拉(Satya Nadella)、和谷歌CEO桑达尔·皮查伊(Sundar Pichai,以下简称劈柴)最为出名。 微软CEO萨提亚·纳德拉(Satya Nadella) 其他著名印度...
程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca...
一文带你入门Linux
文章目录1.1 Linux的概述:1.1.1 什么是Linux:1.1.1.1 学习Linux之前先了解Unix1.1.1.2 Linux的概述:1.1.1.3 Linux的历史:1.1.1.4 Linux系统的应用:1.1.1.5 Linux的版本1.1.1.6 Linux的主流版本1.2 Linux的安装:1.2.1 虚拟机安装:1.2.1.1 什么是虚拟机1.2.1.2 安装VmWare1....
普通三本毕业,我怎么一路艰辛进入阿里的
英雄不问出处? 自古以来就有这样一句话,真的英雄不问出处吗?这句话太挫了。普通三本院校的我,大四的时候居然都不知道什么是校招,所以出处太重要了。这也是没有机会参加阿里校招的原因,毕竟校招门槛比社招还是要低的,最重要的是校招进入阿里能让你的起点比别人更高。 有幸可以社招进入阿里,了解了校招的思路,赶紧介绍给学弟们,现在我们三本院校的小学弟今年居然有 3 个人通过了阿里的校招。下面我也把这份宝贵的经...
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东...
破14亿,Python分析我国存在哪些人口危机!
一、背景 二、爬取数据 三、数据分析 1、总人口 2、男女人口比例 3、人口城镇化 4、人口增长率 5、人口老化(抚养比) 6、各省人口 7、世界人口 四、遇到的问题 遇到的问题 1、数据分页,需要获取从1949-2018年数据,观察到有近20年参数:LAST20,由此推测获取近70年的参数可设置为:LAST70 2、2019年数据没有放上去,可以手动添加上去 3、将数据进行 行列转换 4、列名...
强烈推荐10本程序员在家读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
关于2020年个人项目【臻美_疫情实时大数据报告】(项目开源)
本项目开源,供大家学习交流,数据来自官方通报。 项目网址: 点这可以查看项目 项目图例: 1、国内疫情(省) 2、国内疫情(市) 3、国外疫情 4、热点消息、辟谣消息 5、防疫知识 源码奉上: 本项目后台使用node.js app.js var originRequest = require('request'); var iconv = require('iconv-lite'...
[数据结构与算法] 排序算法
终于学习到了算法部分, 在学习算法时, 我们还是应该回顾一下数据结构与算法之间的关系 数据结构是研究数据的组织方式, 是算法的基础 算法是解决编程问题的方法论, 是程序的灵魂 程序= 数据结构+算法 排序算法 排序也称排序算法(Sort algorithm). 是指 将一组数据按照指定顺序进行排列的过程 主要分为内部排序和外部排序 内部排序: 指将需要处理的数据加载到内存中进行排序 外部排序...
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o...
智力题(程序员面试经典)
NO.1  有20瓶药丸,其中19瓶装有1克/粒的药丸,余下一瓶装有1.1克/粒的药丸。给你一台称重精准的天平,怎么找出比较重的那瓶药丸?天平只能用一次。 解法 有时候,严格的限制条件有可能反倒是解题的线索。在这个问题中,限制条件是天平只能用一次。 因为天平只能用一次,我们也得以知道一个有趣的事实:一次必须同时称很多药丸,其实更准确地说,是必须从19瓶拿出药丸进行称重。否则,如果跳过两瓶或更多瓶药...
自学python网络爬虫,从小白快速成长,分别实现静态网页爬取,下载meiztu中图片;动态网页爬取,下载burberry官网所有当季新品图片。
文章目录 1.前言 2.知识储备 3.爬取静态网站 4.爬取动态网站 1.前言 近日疫情严重,手机已经玩吐了,闲着无聊逛衣服品牌官网发现,结果一时兴起,想学一学python,写一个爬虫下载官网所有最新上架的衣服图片和价格;说干就干,但身为一个只学过一些c和c++的python 0基础大二小白,csdn上的各种教程里涉及的各种发法、工具和库让我眼花缭乱;因此走了很多弯路,终于花三天时间完成了爬虫的设...
面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他
初识 MyBatis MyBatis 是第一个支持自定义 SQL、存储过程和高级映射的类持久框架。MyBatis 消除了大部分 JDBC 的样板代码、手动设置参数以及检索结果。MyBatis 能够支持简单的 XML 和注解配置规则。使 Map 接口和 POJO 类映射到数据库字段和记录。 MyBatis 的特点 那么 MyBatis 具有什么特点呢?或许我们可以从如下几个方面来描述 MyBati...
对Tomcat的简单概要小结
首先我们必须得知道Tomcat就是一个服务,一个本地服务,我们可以控制启动和停止,我们程序员通过这个服务主要是用来存放我们的java程序,当我们把Java程序放进Tomcat服务中,一旦Tomcat服务启动起来,其他电脑就可以进行网络连通,也就是说其他电脑也可以共同访问这个Java程序。 Tomcat的主要目录的概念 有上面的概念之后,我们再来知道一下tomcat根目录下都有哪些文件,以及这些文...
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问