C#同一目录不能运行多个程序,不同目录允许运行多个程序

C#同一目录不能运行多个程序,不同目录允许运行多个程序。
如:两个程序分别在C盘和D盘,如果打开C盘的程序,再打开C盘的程序则提示不允许重复打开;
如果打开C盘的程序,再打开D盘的程序,则允许。

c#

2个回答

我是想把一个程序分别放到2个不同目录下,C盘打开过了,那么C盘就不能再打开了

你想要把两个相同的程序都放在C盘打开吗?

jj254238996
jj254238996 但是如果我打开了C盘的程序,是可以打开D盘的程序;
大约 4 年之前 回复
jj254238996
jj254238996 我如果打开了C盘的程序,就不能再打开C盘的程序;
大约 4 年之前 回复
jj254238996
jj254238996 比如两个相同的程序放到C盘和D盘;
大约 4 年之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c# 怎么样才能只运行一个实例? 不允许多开
网上的方法都试过了 不行 把程序的名字改了 就又可以多开了 我的想法是打开第一个程序的时候 在进程里面创建一个隐藏的进程 在打开的时候判断下进程存在不存在 程序关闭的时候创建的进程也会立即关闭 或者有什么更好的办法
关于C#调用打印机异常问题
项目介绍:在客户那边有一个平台,是通过web浏览器去访问的,我主要做的就是在客户端提供一个服务程序,然后让他们的平台调用我的服务程序的url来完成各种相关的数据处理。我用的是C#和nancy,做的是控制台的项目,然后用nssm弄成windows服务,服务目前其他各项处理都没问题,除了这个打印的功能。打印的这一块存在问题,我在xamarin和vs里面进行运行或调试的时候打印功能一切正常,但是使用nssm装成windows服务以后就开始报异常,异常的详细信息如下:System.Drawing.Printing.InvalidPrinterException: No printers are installed. at System.Drawing.Printing.PrinterSettings.GetHdevmodeInternal() at System.Drawing.Printing.PrinterSettings.GetHdevmode(PageSettings pageSettings) at System.Drawing.Printing.PrintController.OnStartPrint(PrintDocument document, PrintEventArgs e) at System.Windows.Forms.PrintControllerWithStatusDialog.OnStartPrint(PrintDocument document, PrintEventArgs e) at System.Drawing.Printing.PrintController.Print(PrintDocument document) at System.Drawing.Printing.PrintDocument.Print() at AliAssetTagger.Services.AssetCardService.PrintUserdata(UserData userdata) in c:\Users\glgstwp\Desktop\Gloit\2015-07-28\1.1.0\ali-asset-tagger\ali-asset-tagger\ali-asset-tagger\ali-asset-tagger\Services\AssetCardService.cs:line 105 我的打印部分的代码是 public string Print (UserData userdata) { try{ userdataToPrint = userdata; PrintDocument pd = new PrintDocument (); pd.PrintPage += new PrintPageEventHandler (pd_PrintPage); pd.Print (); //异常指向的就是这一行 } catch(Exception e) { return e.ToString (); } return "打印完成!"; } public void pd_PrintPage (object sender, System.Drawing.Printing.PrintPageEventArgs e) { Console.WriteLine ("打印ing"); try { //通过GDI+绘制打印文档 e.Graphics.DrawString ("广西国税", new Font ("宋体", 8), Brushes.Black, 90, 0); e.Graphics.DrawString ("广西壮族自治区税务厅", new Font ("宋体", 4), Brushes.Black, 90, 12); e.Graphics.DrawLine (new Pen (Color.Black, (float)1.00), 90, 18, 200, 18); e.Graphics.DrawString ("XX市XX县(区)国家税务局", new Font ("宋体", 7), Brushes.Black, 90, 22); e.Graphics.DrawLine (new Pen (Color.Yellow, (float)5.00), 0, 39, 300, 39); e.Graphics.DrawString ("资产编号: " + userdataToPrint.asset_No, new Font ("宋体", 12, FontStyle.Bold), Brushes.Black, 12, 55); e.Graphics.DrawString ("资产名称: " + userdataToPrint.asset_Name, new Font ("宋体", 12, FontStyle.Bold), Brushes.Black, 12, 80); e.Graphics.DrawString ("规格型号: " + userdataToPrint.specification_Model, new Font ("宋体", 12, FontStyle.Bold), Brushes.Black, 12, 105); e.Graphics.DrawString ("使用部门: " + userdataToPrint.department, new Font ("宋体", 12, FontStyle.Bold), Brushes.Black, 12, 130); e.Graphics.DrawString ("使用人: " + userdataToPrint.responsible, new Font ("宋体", 12, FontStyle.Bold), Brushes.Black, 12, 155); e.Graphics.DrawString ("购置日期: " + userdataToPrint.purchased_On, new Font ("宋体", 12, FontStyle.Bold), Brushes.Black, 12, 180); Console.WriteLine ("打印结束"); } catch (Exception ex) { MessageBox.Show (ex.ToString ()); } } 我在网上也看到了很多No printers are installed的异常,但是并不是没有安装打印机驱动,在电脑上的打印机和传真那里可以看到很多的打印机和传真,在xamarin studio或者visual studio里面都是正常的,没有异常输出,能够正确打印,但是一装成windows服务就不行,是不是弹窗的原因?我知道nssm装服务的时候有弹窗是不成功不允许的,但是调用打印机的时候怎么做才能不闪出任何打印机相关的窗口呢?我上面的代码已经是直接使用默认的打印机打印了,但是运行的时候还是会有一个窗口在任务栏闪一下,应该是打印机的相关的。请各位帮帮忙,感激不尽!项目很急,我刚毕业,公司没人可以帮到我,万能的网友,拜托了!
不知道为什么程序没有响应
问题:猴子第一天摘了若干个桃子,吃了一半,不过瘾,又多吃了1个。第二天早上将剩余的桃子又吃掉一半,并且又多吃了1个。此后每天都是吃掉前一天剩下的一半零一个。到第n天再想吃时,发现只剩下1个桃子,问第一天它摘了多少桃子?为了加强交互性,由用户输入不同的天数n进行递推,即假设第n天的桃子数为1。同时还要增加对用户输入数据的合法性验证(如:不允许输入的天数是0和负数) ![图片说明](https://img-ask.csdn.net/upload/202002/10/1581301740_536112.jpg) 我的代码是这样的: #include <stdio.h> #include <math.h> #include <stdlib.h> int main() { int ret,day,i=1,sum=1; printf("Input days:\n"); scanf("%d",&day); do { ret=scanf("%d",&day); while((ret!=1)||(day<=0)) { printf("Input days:\n"); while(getchar()!='\n'); fflush(stdin); ret=scanf("%d",&day); } sum=(sum+1)*2; i++; }while(i<day); printf("sum=%d\n",sum); return 0; } 运行代码后,输入3敲下回车键后程序没有任何响应,但是去除第一个“ret=scanf("%d",&day);”后就有响应了,但是输入3敲回车键后依然会重复多一次“Input days”并输入3后才会出现sum=10,可以麻烦各位大神看看到底哪里出问题了吗?谢谢各位da'shen!!
跪求大神,编写算法实现并发进程的模拟
一、实验目的 1. 了解进程的原因执行顺序,以及并发进程的运行次序 2. 进一步深刻理解操作系统在多进程(线程)执行中的作用 二、实验内容 1. 实现并发进程的程序模拟 2. 可以多线程编程代替并发进程 三、实验要求 1. 实现多进程(线程)程序编码,程序须要体现出多线程的并发执行的特征:运行结果无序、不可重现 2. 在上述基础上,考虑为多线程设置同步机制,程序须要体现出同步多线程的特点,即运行结果的可再现性 四、实验提示 1. 多线程运算结果的不可重现,是因为对公共变量的访问不受控制。多线程设置同步机制,即要求多线程访问的公共变量被同步锁控制,即可达到运行结果的可再现性。 2. 同步锁常用的方法有:设置布尔变量的同步锁,当该布尔变量为true时允许访问,false时不能访问;或设置一个整型变量lock,初始值为1,有线程访问公共变量时执行lock--,访问完成后执行lock++,规定访问公共变量的条件是lock=1;或其他同步锁方法 3. 编程语言不限,VB、VC、java、C# 均可 4. 算法(源程序)
AMF3 反序列 DSK时出现的问题!!请高手指点!
![图片说明](https://img-ask.csdn.net/upload/201910/26/1572074549_538212.jpg) 程序在暂停之前运行正常,发送接收的数据也正常,只是想把接收的AMF3数据转换成 message时出错如下图: ![图片说明](https://img-ask.csdn.net/upload/201910/26/1572074646_983354.jpg) 接下来附上 发送接收的数据: ![图片说明](https://img-ask.csdn.net/upload/201910/26/1572074682_176165.jpg)![图片说明](https://img-ask.csdn.net/upload/201910/26/1572074696_85807.jpg) 经查,服务端 把 Content对象的名称由 flex.messaging.messages.AcknowledgeMessage 转换成了别名 DSK ,导致 反序列后 Readmessage不能读出数据。 下面这段是网上查到的: 收到数据后,需要根据amf-packet-structure,对包体进行解析,解析完包头后,知道type为binary的header或message,在使用Amf0Input进行解析,在Amf0Input内部会根据数据类型切换到Amf3Input进行解析。   在解析的过程中,有可能出现header-length 或者message-lenght为-1,0xffffffff,的情况,如果出现了该情况,则不能简单的间输入数据拷贝已知的长度然后,交由AMF进行处理,事实上是直接将DataInputStream传给Amf0Input即可。   在使用的过程中,由于需要让AMF支持允许的类,需要调用 void ClassDeserializationValidator.addAllowClassPattern(String classNamePattern) 进行处理。   AMF可以针对未知的数据类型,产生键值对,只需要指定 SerializationContext context = SerializationContext.getSerializationContext(); context.createASObjectForMissingType = true; 该配置生效后,即可创建第三方的数据类型。   同时,在发送response时,AMF数据,默认将flex.messaging.messages.AcknowledgeMessageExt 当作了别名DSK进行了处理。 Specifics of AMF Support Flash or Flex objects can implement the flash.utils.IExternalizable interface and fully control the way an object is serialized. LoadComplete supports only some of these objects, namely: flex.messaging.io.ArrayCollection flex.messaging.io.ObjectProxy flex.messaging.io.ArrayList DSK (shorthand version of flex.messaging.messages.AcknowledgeMessageExt) As for other objects implementing the IExternalizable interface, LoadComplete does not parse them and does not support modifying data in them. In the Parameters tab it displays these objects as objects of the [Binary data] type. 所以需要使用flex的别名机制,从而让AMF能处理DSK类 void ClassAliasRegistry.registerAlias(String alias, String className) ClassAliasRegistry.getRegistry().registerAlias("DSK", "flex.messaging.messages.AcknowledgeMessageExt");   ———————————————— 版权声明:本文为CSDN博主「chnming1987」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/chnming1987/article/details/84556493 ———————————————— 在我的C#中该如何使用别名机制? 或者直接解析接收的AMF3数据也行,恳请高手帮解决一下为盼,谢谢!!!! 我没有 C币 ,实在对不住 暂时只能用了一个笨的办法来解决,使用 JAVA库 ,通过 IKVM转换为DLL 再用C#调用处理,导致发包文件太多,容量也大,开始稍微有点慢,重复执行后就快多了。 最终的解决方案只能是直接用C#来处理,等有时间先研究一下 AMFParse 的Fiddler 的插件再重新做吧,至少现在能用了,解决了燃眉之急!
二维数组删除指定值的元素(完善代码以实现功能要求)
已知一个二维整型数组已初始化a[5][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,1,2,3,4},{6,7,8,9,0}},请删除此数组中所有等于指定值的元素,删除后,各元素依次前移。 请注意,C语言二维数组的行优先方式存储。例如:a[3][2]的数组,在内存中依次存储a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1],也就是说,先存储第“0”行的元素,再存储第“1”行的元素。 输入:一行一个整数,表示被删除的元素。 输出:若干行,每行若干个整数。(每个数占3列,每输出5个数以后换行) 运行效果如下,请完成程序中空缺代码(不允许新增变量定义和修改已有语句)。 ``` #include <stdio.h> int main(){ int i,j,count=0,num; int a[5][5]={{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,1,2,3,4},{6,7,8,9,0}}; scanf("%d",&num); for(i=0;i<5;i++) for(j=0;j<5;j++) if(a[i][j]!=num){ 【1】//请填入一行或多行代码 } for(i=0;i<5;i++){//输出 【2】//请填入一行或多行代码 printf("\n"); } return 0; } ```
最近碰到很多c的指针的问题,这个程序中的指针不知道哪里出问题了,希望大家能帮忙看下
#include "stdio.h" #include <stdlib.h> #include <iostream> struct custom { int id; int need; int allocation; int request; struct custom *next; }*L,*fir,*head;//结构体定义完毕 int input(int a,int b)//输入所有进程的所需资源数 { custom *p; head=(custom *)malloc(sizeof(custom)); int i; L=head; for(i=1;i<=a;i++)//建立单链表 { p=(custom *)malloc(sizeof(custom)); printf("请输入第%d个函数的进程标识数",i); scanf("%d",&p->id); printf("请输入第%d个进程的所需资源:",i); scanf("%d",&p->need); printf("请输入第%d个进程的初始资源:",i); scanf("%d",&p->allocation); p->need=(p->need)-(p->allocation); printf("当前进程还需资源数为%d\n",p->need); b=b-(p->allocation); printf("\n系统剩余资源数为:%d\n",b); L->next=p; L=p; p->next=NULL; } /* L=head->next; for(i=1;i<=a;i++)监测链表创立成功与否 { printf("%d",L->id); L=L->next; }*/ return b; } void find(int a,int b)//查询发出当前请求的函数 { int i; if(head==NULL)//链表头节点为空,即当前系统中无进程 { printf("当前无进程!"); } else { fir=head; L=head->next; for(i=0;i<b;i++) { if(a==(int)L->id) { break; } else { fir=L; L=L->next; } } //循环寻找匹配进程id号的进程 printf("已找到%d号进程!还需资源%d个。\n",L->id,L->need); fir->next=L->next;//将该进程的前驱与后继相连 <-这里是出问题的地方,输入三个以上就会出现问题 L->next=NULL;//断开当前进程与链表直接按的链接,拿出进行单独操作 } } int commit(int a,custom *c)//进行资源分配函数 { if(c->next==NULL)//是否为头节点的指针 { fir=c; c=c->next;//是的话,向后移一位,保留头节点位置 } else { if(a>(int)c->need)//当前系统资源是否能满足节点所含进程的需求 { a=a+(int)c->allocation; if(c->next!=NULL) { fir->next=c->next; c->next=NULL; free(c); commit(a,fir->next); } else { free(c); } } } return a; } int judge(int a,int b,int c)//判断分配后系统的安全性 { custom *v,*r,*h;//虚拟链表所需指针 int s,f=0; h=(custom *)malloc(sizeof(custom)); fir=head->next; r=h; for(int k=0;k<b;k++)//创建虚拟链表,将进程链表所有进程继承至当前虚拟链表中 { v=(custom *)malloc(sizeof(custom)); v->need=fir->need; v->allocation=fir->allocation; fir=fir->next; r->next=v; r=v; v->next=NULL; }//虚拟链表建立完成 if(a>=(int)L->need)//判断当前进程请求是否能被满足 { printf("剩余资源可供给使用。\n"); a=a+(L->allocation); s=commit(b,h);//判断虚拟链表是否能找到一条安全序列,能的话进程全部运行完成后系统资源应重新归为最大资源量 if(s==c) f=1;//虚拟链表可以保证安全运行 } return f;//返回判断值 } int main() { int i,c,g,available,all,flag; printf("系统所有剩余空闲资源数为:"); scanf("%d",&available); all=available; printf("请问共有几个进程存在:"); scanf("%d",&i); printf("请输入各进程所需资源并分配初始资源:\n"); available=input(i,available);//输入所有进程,并返回剩余资源 printf("请输入允许发出请求的进程标识数:"); scanf("%d",&g); find(g,i);//寻找请求资源的进程 i=i-1; printf("%d号进程的请求资源数为:",g); scanf("%d",&L->request); c=available-(int)L->request; printf("正在判断是否安全。。。"); flag=judge(available,i,all);//判断分配资源后系统是否安全,并返回是否安全 if(flag==1)//判断后flag=1,安全,分配资源 { printf("请求安全,可以执行。"); available=commit(c,head); if(available==all) { printf("分配资源完成!"); } else printf("未知的错误?"); } else//flag=0,不安全,拒绝请求 { printf("请求不安全,禁止执行!"); } return 0; }
求dalao看看这道山东理工acm 数据结构实验之栈:行编辑器 这道题
数据结构实验之栈:行编辑器 Time Limit: 1000MS Memory Limit: 65536KB Submit Statistic Discuss Problem Description 一个简单的行编辑程序的功能是:接受用户从终端输入的程序或数据,并存入用户的数据区。 由于用户在终端上进行输入时,不能保证不出差错,因此,若在编辑程序中,“每接受一个字符即存入用户数据区”的做法显然不是最恰当的。较好的做法是,设立一个输入缓冲区,用以接受用户输入的一行字符,然后逐行存入用户数据区。允许用户输入出差错,并在发现有误时可以及时更正。例如,当用户发现刚刚键入的一个字符是错的时,可补进一个退格符"#",以表示前一个字符无效; 如果发现当前键入的行内差错较多或难以补救,则可以键入一个退行符"@",以表示当前行中的字符均无效。 如果已经在行首继续输入'#'符号无效。 Input 输入多行字符序列,行字符总数(包含退格符和退行符)不大于250。 Output 按照上述说明得到的输出。 Example Input whli##ilr#e(s#*s) outcha@putchar(*s=#++); Example Output while(*s) putchar(*s++); ************ ************ ************ ************ 我这个运行后 有一组样例 huhu##hs hu huhs huhs ************ ************ ************ ************ 我怀疑是s2没清理干净 残留了“hs” 但是我开头又清空了栈 我很难受 #include<iostream> #include<stack> #include<vector> #include <string> using namespace std; int main() { int k = 0,n = 0,m; string c; stack<char> s1,s2; //s1 用户输入原始数据 s2 处理后的数据 while(cin >> c) { while(!s1.empty()) s1.pop(); while(!s2.empty()) s2.pop(); k = 0; //k 是纪录##的个数 n = 0; //n 是纪录s1中的char个数 m = 0; //m 是纪录s2中的char个数 for(int i = 0;i<sizeof(c);++i) { s1.push(c[i]); n++; } while (n -- ) { if(s1.top() == '#') { k++; s1.pop(); } else if(s1.top() == '@') { break; } else { if(k == 0) { s2.push(s1.top()); s1.pop(); m++; } else { s1.pop(); k--; } } } while(!s2.empty()) { cout << s2.top(); s2.pop(); } cout << endl; } }
Asp.net core identityServer4 回调跳转到signin-oidc得到404 Not Found的问题
我采用IdentityServer4[示例代码(Combined_AspId_and_EFStorage)](https://github.com/IdentityServer/IdentityServer4.Samples/tree/master/Quickstarts/Combined_AspId_and_EFStorage "") ,并参考了晓晨的博客([IdentityServer4(10)- 添加对外部认证的支持之QQ登录)](https://www.cnblogs.com/stulzq/p/7879101.html "")。 在第三方登录时开始都没问题,能够跳转到QQ授权页面并成功返回QQ用户信息,但是在跳转回MvcClient时却得到404空白页面: ## **404 Not Found** identity服务器的startup.cs代码如下: ``` public void ConfigureServices(IServiceCollection services) { Services = services; var connectionString = Configuration.GetConnectionString("qcloud-postgres-applicationdb"); var migrationsAssembly = typeof(Startup).GetTypeInfo().Assembly.GetName().Name; services.AddDbContext<ApplicationDbContext>(options => options.UseNpgsql(connectionString)); services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.AddMvc().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_2_2); services.Configure<IISOptions>(iis => { iis.AuthenticationDisplayName = "Windows"; iis.AutomaticAuthentication = false; }); var builder = services.AddIdentityServer(options => { options.Events.RaiseErrorEvents = true; options.Events.RaiseInformationEvents = true; options.Events.RaiseFailureEvents = true; options.Events.RaiseSuccessEvents = true; }) // this adds the config data from DB (clients, resources) .AddConfigurationStore(options => { options.ConfigureDbContext = b => b.UseNpgsql(Configuration.GetConnectionString("qcloud-postgres-configurationdb"), sql => sql.MigrationsAssembly(migrationsAssembly)); }) // this adds the operational data from DB (codes, tokens, consents) .AddOperationalStore(options => { options.ConfigureDbContext = b => b.UseNpgsql(Configuration.GetConnectionString("qcloud-postgres-persistedgrantdb"), sql => sql.MigrationsAssembly(migrationsAssembly)); // this enables automatic token cleanup. this is optional. options.EnableTokenCleanup = true; options.TokenCleanupInterval = 60; }) .AddAspNetIdentity<ApplicationUser>(); builder.AddDeveloperSigningCredential(); /* if (Environment.IsDevelopment()) { builder.AddDeveloperSigningCredential(); } else { throw new Exception("need to configure key material"); }*/ services.AddAuthentication( options => { options.DefaultScheme = "QQ"; }) .AddQQ(qqOptions => { qqOptions.AppId = "AppId123456"; // qqOptions.AppKey = "AppKey1234567890"; }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { if (Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); //app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseIdentityServer(); app.UseMvcWithDefaultRoute(); } ``` MvcClient端的startup.cs代码如下: ``` public void ConfigureServices(IServiceCollection services) { Services = services; Services.AddMvc(); JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); Services.AddAuthentication(options => { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies") .AddOpenIdConnect("oidc", options => { options.SignInScheme = "Cookies"; //options.Authority = "http://localhost:5000"; options.Authority = "https://identity.web123456.cn"; options.RequireHttpsMetadata = false; options.ClientId = "yingyu88"; options.ClientSecret = "secret"; options.ResponseType = "code id_token"; options.SaveTokens = true; options.GetClaimsFromUserInfoEndpoint = true; options.Scope.Add("yingyu88api"); //options.Scope.Add("offline_access"); //options.ClaimActions.MapJsonKey("website", "website"); }); } public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); //app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseAuthentication(); app.UseStaticFiles(); app.UseMvcWithDefaultRoute(); } ``` 客户端得到的log如下: ``` 2019-03-23 11:36:07.588 +08:00 [INF] User profile not available. Using 'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\ASP.NET\4.0.30319.0\AutoGenKeys\S-1-5-82-1592072215-1740167268-757123690-3585059337-856257778\DataProtection' as key repository and Windows DPAPI to encrypt keys at rest. 2019-03-23 11:36:08.070 +08:00 [INF] Request starting HTTP/1.0 GET http://www.yingyu88.cn/Home/Secure 2019-03-23 11:36:08.187 +08:00 [INF] Route matched with {action = "Secure", controller = "Home"}. Executing action MvcClient.Controllers.HomeController.Secure (Yingyu88web) 2019-03-23 11:36:08.197 +08:00 [INF] Authorization failed. 2019-03-23 11:36:08.202 +08:00 [INF] Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. 2019-03-23 11:36:08.209 +08:00 [INF] Executing ChallengeResult with authentication schemes ([]). 2019-03-23 11:36:08.713 +08:00 [INF] AuthenticationScheme: oidc was challenged. 2019-03-23 11:36:08.722 +08:00 [INF] Executed action MvcClient.Controllers.HomeController.Secure (Yingyu88web) in 531.87060000000008ms 2019-03-23 11:36:08.742 +08:00 [INF] Request finished in 673.8004ms 302 2019-03-23 11:36:15.048 +08:00 [INF] Request starting HTTP/1.0 POST http://www.yingyu88.cn/signin-oidc application/x-www-form-urlencoded 1532 2019-03-23 11:36:15.418 +08:00 [INF] AuthenticationScheme: Cookies signed in. 2019-03-23 11:36:15.419 +08:00 [INF] Request finished in 370.649ms 302 ``` 从以上Log可以看出Signin是成功的,但是callback回到signin-oidc之后请求就结束了,诡异的是应用并没有报错。 如有哪位大神熟悉IdentityServer的请多多赐教! 如果需要我这边更多的代码和log信息可以加QQ:352862120联系我私聊。多谢! 2019-03-29更新: ---- 经过试验发现,IdentityServer4的示例代码在调试状态下没有问题,能够在localhost:5000和localhost:5002之间跳转并传递相应的Cookies。但是部署到服务器后(我用的是windows 2016和iis)就不行了(代码完全一致)。最初直接想到的是跨域问题,但是加上AddCors也并没有解决。 ``` public void ConfigureServices(IServiceCollection services) { //配置跨域处理,允许所有来源: services.AddCors(options => options.AddPolicy("corspolicy", p => p.AllowAnyOrigin()) ); } public void Configure(IApplicationBuilder app) { if (Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseIdentityServer(); ** app.UseCors("corspolicy"); ** app.UseMvcWithDefaultRoute(); } ``` 以上代码加到了IdentityServer和MvcClient,但是并没有效果。 追踪部署环境和调试环境下的log可以发现,公网部署时IdentityServer运行到signin-oidc就停止了,没有任何报错。 这是公网部署时的log: ``` 2019-03-25 13:46:19.030 +08:00 [INF] Request starting HTTP/1.0 GET http://www.yingyu88.cn/Home/Secure 2019-03-25 13:46:19.031 +08:00 [INF] Route matched with {action = "Secure", controller = "Home"}. Executing action MvcClient.Controllers.HomeController.Secure (MvcClient) 2019-03-25 13:46:19.039 +08:00 [INF] Authorization failed. 2019-03-25 13:46:19.041 +08:00 [INF] Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. 2019-03-25 13:46:19.045 +08:00 [INF] Executing ChallengeResult with authentication schemes ([]). 2019-03-25 13:46:19.403 +08:00 [INF] AuthenticationScheme: oidc was challenged. 2019-03-25 13:46:19.408 +08:00 [INF] Executed action MvcClient.Controllers.HomeController.Secure (MvcClient) in 376.51370000000003ms 2019-03-25 13:46:19.413 +08:00 [INF] Request finished in 382.7936ms 302 2019-03-25 13:46:40.244 +08:00 [INF] Request starting HTTP/1.0 POST http://www.yingyu88.cn/signin-oidc application/x-www-form-urlencoded 1531 2019-03-25 13:46:40.651 +08:00 [INF] AuthenticationScheme: Cookies signed in. 2019-03-25 13:46:40.651 +08:00 [INF] Request finished in 406.993ms 302 ``` 这是调试环境下的log: ``` 2019-03-25 12:32:15.062 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5002/Home/Secure 2019-03-25 12:32:15.064 +08:00 [INF] Route matched with {action = "Secure", controller = "Home"}. Executing action MvcClient.Controllers.HomeController.Secure (MvcClient) 2019-03-25 12:32:15.070 +08:00 [INF] Authorization failed. 2019-03-25 12:32:15.072 +08:00 [INF] Authorization failed for the request at filter 'Microsoft.AspNetCore.Mvc.Authorization.AuthorizeFilter'. 2019-03-25 12:32:15.073 +08:00 [INF] Executing ChallengeResult with authentication schemes ([]). 2019-03-25 12:32:15.077 +08:00 [INF] AuthenticationScheme: oidc was challenged. 2019-03-25 12:32:15.077 +08:00 [INF] Executed action MvcClient.Controllers.HomeController.Secure (MvcClient) in 13.078700000000001ms 2019-03-25 12:32:15.077 +08:00 [INF] Request finished in 14.6766ms 302 2019-03-25 12:32:39.168 +08:00 [INF] Request starting HTTP/1.1 POST http://localhost:5002/signin-oidc application/x-www-form-urlencoded 1522 2019-03-25 12:32:39.543 +08:00 [INF] AuthenticationScheme: Cookies signed in. 2019-03-25 12:32:39.543 +08:00 [INF] Request finished in 375.4138ms 302 //以下是调试环境下继续执行跳转回/home/secure的动作。部署后这些动作就没有被执行。 2019-03-25 12:32:39.550 +08:00 [INF] Request starting HTTP/1.1 GET http://localhost:5002/Home/Secure 2019-03-25 12:32:39.551 +08:00 [INF] Route matched with {action = "Secure", controller = "Home"}. Executing action MvcClient.Controllers.HomeController.Secure (MvcClient) 2019-03-25 12:32:39.551 +08:00 [INF] Authorization was successful. 2019-03-25 12:32:39.551 +08:00 [INF] Executing action method MvcClient.Controllers.HomeController.Secure (MvcClient) - Validation state: "Valid" 2019-03-25 12:32:39.552 +08:00 [INF] Executed action method MvcClient.Controllers.HomeController.Secure (MvcClient), returned result Microsoft.AspNetCore.Mvc.ViewResult in 0.2637ms. 2019-03-25 12:32:39.556 +08:00 [INF] Executing ViewResult, running view Secure. 2019-03-25 12:32:39.562 +08:00 [INF] Executed ViewResult - view Secure executed in 10.0428ms. 2019-03-25 12:32:39.563 +08:00 [INF] Executed action MvcClient.Controllers.HomeController.Secure (MvcClient) in 11.7323ms 2019-03-25 12:32:39.565 +08:00 [INF] Request finished in 14.3843ms 200 text/html; charset=utf-8 ``` 观察对比两种环境下的cookie,发现部署后从IdentityServer跳转到MvcClient/signin-oidc后少了两个cookie: .AspNetCore.Identity.Application idsrv.session ---- 从IdentityServer4官方的示例代码来看,其示例代码可能还无法直接应用于部署环境,在startup.cs中有一段代码: ``` if (Environment.IsDevelopment()) { builder.AddDeveloperSigningCredential(); } else { throw new Exception("need to configure key material"); } ``` 由此可见sigin-oidc的404问题有可能是解密凭据引起的。但是我对ASP.net core源码了解太少,提供上述信息希望能够得到大神的指点。 2019-03-29更新:AddDeveloperSigningCredential会生成RSA加密证书,使得程序能够正常运行,虽然其安全性会比较差。详见[IdentityServer4部署到服务器,配置证书问题](https://www.jianshu.com/p/1b82f6d2644e "")。因此AddDeveloperSigningCredential并非导致本次问题的原因。 ---- 2019-03-26更新: 如果把IdentityServer4.Samples\Quickstarts\4_ImplicitFlowAuthenticationWithExternal示例部署到同样的环境,发现能够运行通过。但是如果改为Hybrid模式就会出现signin-oidc 404 Not Found的问题。 identityserver.config.cs代码: ``` // OpenID Connect hybrid flow client (MVC) new Client { ClientId = "mvc", ClientName = "MVC Client", // 能正常部署运行: AllowedGrantTypes = GrantTypes.Implicit, // 会出现404问题: AllowedGrantTypes = GrantTypes.Hybrid, ClientSecrets = { new Secret("secret".Sha256()) }, RedirectUris = { "http://www.someweb.cn/signin-oidc" }, PostLogoutRedirectUris = { "http://www.someweb.cn/signout-callback-oidc" }, AllowedScopes = { IdentityServerConstants.StandardScopes.OpenId, IdentityServerConstants.StandardScopes.Profile, "api1" }, AllowOfflineAccess = true } ``` MvcClient.startup.cs: ``` { options.DefaultScheme = "Cookies"; options.DefaultChallengeScheme = "oidc"; }) .AddCookie("Cookies") .AddOpenIdConnect("oidc", options => { options.SignInScheme = "Cookies"; options.Authority = "https://identity.someweb.cn"; options.RequireHttpsMetadata = false; options.ClientId = "mvc"; options.ClientSecret = "secret"; options.SaveTokens = true; options.GetClaimsFromUserInfoEndpoint = true; options.Scope.Add("offline_access"); options.ClaimActions.MapJsonKey("website", "website"); // 能够正常部署运行: options.ResponseType = "id_token"; // 会发生signin-oidc 404错误: options.Scope.Add("api1"); options.ResponseType = "code id_token"; // 会发生"invalid_scope" 错误: options.Scope.Add("api1"); options.ResponseType = "id_token"; }); ``` 现在虽然已经知道Hybrid模式下公网部署才会出现错误,但究竟是我对client的配置错误还是IS4的bug所引起的问题并不清楚。 我试过AddCors,但并没有解决以上问题。
c8051f020的12位AD采样
/******************************************************************************* 程序测量电压在外部ADC输入和打印   / /结果通过UART终端窗口。  / /系统时钟使用内部24.5 mhz振荡器成倍增加   / / 49 mhz的芯片上的锁相环。结果输出到UART的循环  / /设定的速度基于定时器2的延迟。这个循环定期读取  / / ADC值从一个全局变量,结果。 / / ADC使重复测量速度取决于SAMPLE_RATE使用   / /定时器3。每个ADC转换启动一个中断运行一个   / /平均函数。< INT_DEC >样品平均然后结果值更新。 / /每4的< INT_DEC >,你获得1点有效的决议。   / /例如,< INT_DEC > = 256获得你4位分辨率:4 ^ 4 = 256。 / / ADC输入多路复用器将是单端输入 ************************************************************************************/ #include <c8051f020.h> // SFR declarations #include <stdio.h> #include<intrins.h> /*******16位寄存器定义**********/ sfr16 ADC0 = 0xbe; //ADC0数据 sfr16 RCAP2 = 0xca; //定时器2自动重装 sfr16 RCAP3 = 0x92; //定时器3自动重装 sfr16 TMR2 = 0xcc; //定时器2 sfr16 TMR3 = 0x94; //定时器3 /**********全局常量***************/ #define BAUDRATE 115200 //串口通信的波特率 #define SYSCLK 22118400//外部晶振频率 #define SAMPLE_RATE 100000 //采样频率 #define INT_DEC 256 //积分抽取比采样并取平均值;由过采样并取平均值来提高ADC分辨率的相关 #define SAR_CLK 2500000 //ADC0转换时钟周期的计算 #define SAMPLE_DELAY 50 //采样之前的毫秒延时 sbit led = P1^6; //led = 1是否定 sbit sw1 = P3^7; //sw1 = 0转换开关 void PORT_INIT (void); void OSCILLATOR_INIT (void); void UART0_INIT(); void TIMER3_INIT(int counts); void ADC0_INIT(); void delay_ms(unsigned int ms); void delay4j(); /***********全局变量***********/ long result; // 减小的值 /*********主函数************/ void main() { long measurement; // 测量电压(mv) WDTCN = 0xde; //关闭看门狗 WDTCN = 0xad; OSCILLATOR_INIT(); //初始化晶振 PORT_INIT(); //交叉使能开关 UART0_INIT(); //初始化串口通信0; TIMER3_INIT(SYSCLK/SAMPLE_RATE);//初始化定时器3的溢出采样率 ADC0_INIT(); AD0EN = 1; //ADC0控制寄存器,使能ADC EA = 1; //打开所有中断(总体,但如果子中断关闭,那该中断依旧关闭) while(1) { EA = 0; //关闭中断 /*********12ADC的值是通过积分平均值的测量,数据存储在result中,为右对齐 AIN0.1的实测值为: Vref(mv) measure(mv) =----------------*result(bits) (2^12)-1(bits) ****************************/ measurement = result * 2430 / 4095; // measurement = result; EA = 1; //使能中断 printf("AIN0.1 voltage:%ld mv\n",measurement); // led = ~sw1; //LED反应状态的转换 // delay_ms(SAMPLE_DELAY);//延时50ms delay_ms(1); // delay4j(); } } /************交叉使能开关配置****************/ void PORT_INIT (void) { XBR0 = 0x04; // UART0 线路配置 XBR2 = 0x40; // 交叉使能,设置为弱上拉 P0MDOUT = 0x01; // enable TX0 as a push-pull output P1MDOUT = 0x40; // enable LED as push-pull output } /*************使用外部晶振作为系统时钟***********/ void OSCILLATOR_INIT (void) { int i; // delay counter OSCXCN = 0x67; // start external oscillator with // 22.1184MHz crystal for (i=0; i < 256; i++) ; // wait for oscillator to start while (!(OSCXCN & 0x80)) ; // Wait for crystal osc. to settle OSCICN = 0x88; // select external oscillator as SYSCLK // source and enable missing clock // detector } /************串口初始化****************/ void UART0_INIT() { SCON0 = 0x50; //UART0控制寄存器设置 TMOD = 0x20; //定时器1的方式寄存器 TH1 = -(SYSCLK/BAUDRATE/16); //定时器1波特率的重装值 CKCON = 0x10; //时钟控制寄存器设置,定时器1使用系统时钟 PCON = 0x80; //电源控制寄存器设置 TR1 = 1; //打开定时器1 TI0 = 1; //发送中断标志 } /*************定时器3的初始化*************/ void TIMER3_INIT(int counts) { TMR3CN = 0x02; //定时器3控制寄存器,停止定时器3,清除TF3,定时器3使用系统时钟 RCAP3 = -counts;//初始化定时器3重装 TMR3 = RCAP3; // 立即重新加载 EIE2 &= ~0x01; //扩展中断允许2寄存器 关闭所有中断 TMR3CN |= 0x04; //打开定时器3,且使用系统时钟 } /**************ADC0的初始化**********/ void ADC0_INIT() { ADC0CN = 0x04; //ADC0控制寄存器,禁止ADC0,一直跟踪方式, //ADC0没完成一次数据转换,当前没有进行数据转换 //定时器3溢出启动ADC0转换数据,ADC0H,ADC0L寄存器数据右对齐 REF0CN = 0x03; //关闭温度传感器,VREF输出缓冲区 AMX0CF = 0x00; //AIN为单端输入 AMX0SL = 0x03; //选择AIC0.1位模拟输入引脚 ADC0CF = (SYSCLK/SAR_CLK)<<3;//ADC转换时钟为2500000 ADC0CF |= 0x00; //设置转换时钟2500000,放大倍数为1 EIE2 |= 0x02; //允许ADC0数据转换结束产生中断请求 } /****************延时ms************/ void delay_ms(unsigned int ms) { CKCON &= ~0x20; // use SYSCLK/12 as timebase RCAP2 = -(SYSCLK/1000/12); // Timer 2 overflows at 1 kHz TMR2 = RCAP2; ET2 = 0; // Disable Timer 2 interrupts TR2 = 1; // Start Timer 2 while(ms) { TF2 = 0; // Clear flag to initialize while(!TF2); // Wait until timer overflows ms--; // Decrement ms } TR2 = 0; // Stop Timer 2 } /***************ADC0的中断*****************/ void ADC0_ISR (void) interrupt 15 { static unsigned int_dec=INT_DEC; // 集成计数器,当int_dec = 0时,置入一个新的结果 static long accumulator=0L; // 整合ADC采样,“0L”为将0转换成long型的 AD0INT = 0; // 清除AD数据转换成功标识符,重新开始下次采样 accumulator += ADC0; //读取ADC的值,并逐次累加 int_dec--; // 更新衰减计数器 if (int_dec == 0) // If zero, then post result { int_dec = INT_DEC; // Reset counter result = accumulator >> 8; accumulator = 0L; // Reset accumulator } } void delay4j() { _nop_(); _nop_(); _nop_(); _nop_(); } c8051f020的12位AD采样频率最高是100ksps,低频的时候可以,但是为什么转换频率为1kHZ的正弦波时数据会混乱呢,
springboot 配置多库之后,mybatis在控制台不打印sql语句了
springboot项目 单库下,mybatis只需要添加如下配置,就可以打印sql语句 ```xml <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> ``` 但是多库环境下,mybatis不论怎么设置,都无法打印sql语句..... ---- ---- 项目中的相关配置: mybatis配置: ```xml <!-- 设置运行参数 --> <settings> <!-- 全局映射器启用缓存 --> <setting name="cacheEnabled" value="true" /> <!-- 查询时,关闭关联对象及时加载以提高性能 --> <setting name="lazyLoadingEnabled" value="false" /> <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指定),不会加载关联表的所有字段,以提高性能 --> <setting name="aggressiveLazyLoading" value="false" /> <!-- 对于位置的SQL查询,允许返回不同的结果集以达到通用的效果 --> <setting name="multipleResultSetsEnabled" value="true" /> <!-- 允许使用列标签代替列明 --> <setting name="useColumnLabel" value="true" /> <!-- 允许使用自定义的主键值(比如由程序生成的UUID 32位编码作为键值), 数据表的pk生成策略将被覆盖 --> <setting name="useGeneratedKeys" value="true" /> <!-- 给予被嵌套的resultMap以字段-属性的映射支持 --> <setting name="autoMappingBehavior" value="PARTIAL" /> <!-- 对于批量更新操作缓存SQL以提高性能 --> <setting name="defaultExecutorType" value="REUSE" /> <!-- 数据库超过25000秒仍未响应则超时 --> <!--<setting name="defaultStatementTimeout" value="25000" />--> <!-- 打印查询语句 --> <setting name="logImpl" value="STDOUT_LOGGING" /> <!-- 开启驼峰--> <setting name="mapUnderscoreToCamelCase" value="true" /> </settings> ``` logback配置: ```xml <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true"> <!-- 属性1:每个logger都关联到logger上下文,默认上下文名称为“default”。 但可以使用设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改,可以通过%contextName来打印日志上下文名称。 --> <contextName>logback</contextName> <!--属性2:定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--> <!-- <springProfile name="dev"> <property name="LOG_PATH" value="D://care-management-statisticserver-logs"/> </springProfile> <springProfile name="test"> <property name="LOG_PATH" value="/data/tomcat_jar/taixin_care/care-management-statisticserver/logs"/> </springProfile> <springProfile name="prod"> <property name="LOG_PATH" value="/data1/logs/care-management-statisticserver"/> </springProfile> --> <property name="LOG_PATH" value="${LOG_FILE}"/> <!--appender用来格式化日志输出节点,有俩个属性name和class,class用来指定哪种输出策略,常用就是控制台输出策略和文件输出策略。--> <!-- %m输出的信息,%p日志级别,%t线程名,%d日期,%c类的全名,,,, --> <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> <filter class="ch.qos.logback.classic.filter.ThresholdFilter"> <level>info</level> </filter> <encoder> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern> </encoder> </appender> <!--<include resource="org/springframework/boot/logging/logback/base.xml"/>--> <!-- 说明: 1、日志级别及文件 日志记录采用分级记录,级别与日志文件名相对应,不同级别的日志信息记录到不同的日志文件中 例如:error级别记录到log_error_xxx.log或log_error.log(该文件为当前记录的日志文件),而log_error_xxx.log为归档日志, 日志文件按日期记录,同一天内,若日志文件大小等于或大于2M,则按0、1、2...顺序分别命名 例如log-level-2013-12-21.0.log 其它级别的日志也是如此。 2、文件路径 若开发、测试用,在Eclipse中运行项目,则到Eclipse的安装路径查找logs文件夹,以相对路径../logs。 若部署到Tomcat下,则在Tomcat下的logs文件中 3、Appender FILEERROR对应error级别,文件名以log-error-xxx.log形式命名 FILEWARN对应warn级别,文件名以log-warn-xxx.log形式命名 FILEINFO对应info级别,文件名以log-info-xxx.log形式命名 FILEDEBUG对应debug级别,文件名以log-debug-xxx.log形式命名 CONSOLE将日志信息输出到控制上,为方便开发测试使用 --> <!-- 日志记录器,日期滚动记录 --> <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${LOG_PATH}/error_statisticserver.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/error-statisticserver-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 表示只保留最近30天的日志,以防止日志填满整个磁盘空间。--> <maxHistory>30</maxHistory> <!--用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。--> <totalSizeCap>1GB</totalSizeCap> <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始, 命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录error级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>ERROR</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- 日志记录器,日期滚动记录 --> <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender"> <!-- 正在记录的日志文件的路径及文件名 --> <file>${LOG_PATH}/info_statisticserver.log</file> <!-- 日志记录器的滚动策略,按日期,按大小记录 --> <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> <!-- 归档的日志文件的路径,例如今天是2013-12-21日志,当前写的日志文件路径为file节点指定,可以将此文件与file指定文件路径设置为不同路径,从而将当前日志文件或归档日志文件置不同的目录。 而2013-12-21的日志文件在由fileNamePattern指定。%d{yyyy-MM-dd}指定日期格式,%i指定索引 --> <fileNamePattern>${LOG_PATH}/info-statisticserver-%d{yyyy-MM-dd}.%i.log</fileNamePattern> <!-- 表示只保留最近30天的日志,以防止日志填满整个磁盘空间。--> <maxHistory>30</maxHistory> <!--用来指定日志文件的上限大小,例如设置为1GB的话,那么到了这个值,就会删除旧的日志。--> <totalSizeCap>1GB</totalSizeCap> <!-- 除按日志记录之外,还配置了日志文件不能超过2M,若超过2M,日志文件会以索引0开始,命名日志文件,例如log-error-2013-12-21.0.log --> <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> <maxFileSize>100MB</maxFileSize> </timeBasedFileNamingAndTriggeringPolicy> </rollingPolicy> <!-- 追加方式记录日志 --> <append>true</append> <!-- 日志文件的格式 --> <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n</pattern> <charset>utf-8</charset> </encoder> <!-- 此日志文件只记录info级别的 --> <filter class="ch.qos.logback.classic.filter.LevelFilter"> <level>INFO</level> <onMatch>ACCEPT</onMatch> <onMismatch>DENY</onMismatch> </filter> </appender> <!-- <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。<logger>仅有一个name属性,一个可选的level和一个可选的addtivity属性。 --> <logger name="org.springframework" level="INFO"/> <logger name="org.apache" level="ERROR"/> <logger name="org.hibernate.validator" level="ERROR"/> <!--<logger name="org.thymeleaf" level="ERROR"/>--> <logger name="org.springframework.context.annotation" level="ERROR"/> <!-- springProfile多环境日志输出,据不同环境(prod:生产环境,test:测试环境,dev:开发环境)来定义不同的日志输出--> <springProfile name="dev" /> <root level="INFO"> <appender-ref ref="FILEERROR"/> <appender-ref ref="FILEINFO"/> <appender-ref ref="STDOUT"/> </root> <!-- 可以启动服务的时候指定 profile (如不指定使用默认),如指定prod 的方式为: java -jar xxx.jar –spring.profiles.active=prod--> </configuration> ``` application.properties部分配置: ```properties #配置文件 logging.level.tk.mybatis=TRACE spring.freemarker.cache=false spring.freemarker.request-context-attribute=request mybatis.type-aliases-package=com.mtpf.domain mybatis.mapper-locations=classpath:mapper/*.xml mapper.mappers=com.mtpf.util.MyMapper mapper.not-empty=false mapper.identity=MYSQL pagehelper.helperDialect=mysql #true 是超出最大页码返回数据 false超出最大页码不返回数据 pagehelper.reasonable=${PAGEHELPER_REASONABLE} pagehelper.supportMethodsArguments=true pagehelper.params=count=countSql ```
在多线程环境下使用udpclient进行异步UDP接收出现“访问已注销对象”的异常,怎么办?
最近打算使用C#写一个仿飞秋的局域网即时通信工具,但是在使用多线程异步收发UDP数据时老是出现“访问对象已注销”的异常,查了好久都没有找到原因,只能求助于网友啦。 完整代码可以在我的github上下载:[WAW](https://github.com/WorldAllWhite/WaW "") 说说具体情况吧: 1.为了进行udp数据的异步接收,我写了一个异步接收类AsyncUDPclient。 ``` public class AsyncUDPclient { private IPEndPoint recEP, sendEP; private UdpClient udpReceive, udpSend; private UdpState udpReceiveState, udpSendState; //定义消息接收事件 public event MessageReceivedEventHandle MessageReceived; // 异步状态同步 //private ManualResetEvent sendDone = new ManualResetEvent(false); //private ManualResetEvent receiveDone = new ManualResetEvent(false); public AsyncUDPclient() { recEP = new IPEndPoint(IPAddress.Any, InfoSet.IpPort.Port);//允许从任意远程主机终节点接收数据 sendEP = new IPEndPoint(IPAddress.Any, InfoSet.IpPort.Port);//允许向任意远程主机终节点发送数据,发送和接收使用同一个端口 udpReceive = new UdpClient(recEP); udpSend = new UdpClient(); udpReceiveState = new UdpState(); udpReceiveState.udpClient = udpReceive; udpReceiveState.ipEndPoint = recEP; udpSendState = new UdpState(); udpSendState.udpClient = udpSend; udpSendState.ipEndPoint = sendEP; } public void ReceiveMsg() { udpReceive.BeginReceive(new AsyncCallback(ReceiveCallback), udpReceiveState); //receiveDone.WaitOne(); } private void ReceiveCallback(IAsyncResult iar) { UdpState s = iar.AsyncState as UdpState; if(iar.IsCompleted) { IPEndPoint ep = s.ipEndPoint; UdpClient u = s.udpClient; Byte[] receiveBytes = u.EndReceive(iar, ref ep); //调用消息接收事件处理方法 MessageEventArgs args = new MessageEventArgs(); args.remoteIP = ep; args.buffer = receiveBytes; if (MessageReceived != null) { MessageReceived(this, args); } //receiveDone.Set(); u.BeginReceive(new AsyncCallback(ReceiveCallback), s);//此处需要验证s.ipEndPoint的值是否已经变化? } } public void SendMsg(byte[] datagram,int bytes,IPEndPoint sendEP) { udpSendState.ipEndPoint = sendEP; udpSend.BeginSend(datagram, bytes,sendEP, new AsyncCallback(SendCallback), udpSendState); Thread.Sleep(100); } private void SendCallback(IAsyncResult iar) { UdpState s = iar.AsyncState as UdpState; s.udpClient.EndSend(iar); //sendDone.Set(); } public void StopClient() { udpSend.Close(); udpReceive.Close(); Thread.Sleep(100); } } /// <summary> /// 消息接收事件委托 /// </summary> /// <param name="Sender"></param> /// <param name="e"></param> public delegate void MessageReceivedEventHandle(object Sender, MessageEventArgs e); public class MessageEventArgs : EventArgs { public byte[] buffer; public IPEndPoint remoteIP; public MessageEventArgs() : base() { remoteIP = new IPEndPoint(IPAddress.Any, 0); } } public class UdpState { public UdpClient udpClient; public IPEndPoint ipEndPoint; } ``` 2.当程序启动之后,在程序主窗口类frmMain.cs里开了一个新线程监听指定端口,用于接收UDP数据,然后主窗口程序广播上线消息。 ``` public partial class frmMain : Form { //用于整个程序收发数据的对象 public AsyncUDPclient AsyncUDP; private Thread udplistenthread; private DataReceive startreceive; public frmMain() { InitializeComponent(); _userstate = wawState.SignIn; Rectangle rec = Screen.GetWorkingArea(this); this.ClientSize = new Size(234, rec.Height - 100); this.Location = new Point((int)(rec.Width * 0.8), (int)(rec.Height * 0.05)); this.MaximumSize = new Size(260, rec.Height); this.MinimumSize = new Size(234, 100); this.chTag.Width = 0; this.chUser.Width = (int)(this.lvwUsers.Width * 0.3); this.chIP.Width = (int)(this.lvwUsers.Width * 0.4); this.chHostname.Width = this.lvwUsers.Width - this.chUser.Width - this.chHostname.Width; AsyncUDP = new AsyncUDPclient();//收发数据对象初始化 } private void frmMain_Load(object sender, EventArgs e) { //开启监听线程,新线程执行StartListenUdp方法 startreceive = new DataReceive(lvwUsers, lblUserCount,AsyncUDP); udplistenthread = new Thread(new ThreadStart(startreceive.StartListenUdp)); udplistenthread.IsBackground = true; udplistenthread.Start(); MsgBoardCast boardcast = new MsgBoardCast(AsyncUDP); //boardcast.BoardCast(wawCMD.WAW_BC_SIGNIN); int i = 0; foreach(IPAddress addr in Dns.GetHostEntry(Dns.GetHostName()).AddressList) { if(addr.AddressFamily==AddressFamily.InterNetwork) { cmbIpList.Items.Add(addr.ToString()); if (addr.ToString()==InfoSet.IpPort.Address.ToString()) { cmbIpList.SelectedIndex = i; } i++; } } } } ``` StartListenUdp方法如下(就是调用异步接收类AsyncUDPclient的ReceiveMsg方法开始异步接收): ``` public void StartListenUdp() { AsyncClient.MessageReceived += new MessageReceivedEventHandle(DataConfig); AsyncClient.ReceiveMsg(); } ``` 但是在运行过程中一直很出现异常,貌似是说调用udpclient对象是该对象已经注销,但我检查了很久都没有查处问题,这个问题一直卡了我整整两周时间,实在是没办法了。 以下是调试报错截图: ![图片说明](https://img-ask.csdn.net/upload/201804/13/1523621735_3137.png)
spring mvc+shiro+cas 实现cas client功能 跳转回来404
http://securitycenter.com:8080/gtsys/cas?ticket=ST-14-HEDhc1GVQt0UYdiZpi7R-cas 返回这个地址 404 ![图片说明](https://img-ask.csdn.net/upload/201510/09/1444404164_27274.png) ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:task="http://www.springframework.org/schema/task" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <!-- 定时器开关 开始 --> <task:annotation-driven /> <!-- 标注类型 的事务配置 如果使用注解事务。就放开 <tx:annotation-driven />--> <!-- 统一异常处理方式 --> <bean id="exceptionHandler" class="com.lanyuan.exception.MyExceptionHandler"/> <!-- 初始化数据 --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="driverClassName" value="${jdbc.driverClass}" /> </bean> <bean id="pagePlugin" class="com.lanyuan.plugin.PagePlugin"> <property name="properties"> <props> <prop key="dialect">mysql</prop> <prop key="pageSqlId">.*query.*</prop> </props> </property> </bean> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <!-- 自动匹配Mapper映射文件 --> <property name="mapperLocations" value="classpath:mappings/*-mapper.xml"/> <property name="typeAliasesPackage" value="com.lanyuan.entity"/> <property name="plugins"> <array> <ref bean="pagePlugin" /> </array> </property> </bean> <!-- 通过扫描的模式,扫描目录在com.lanyuan.mapper目录下,所有的mapper都继承SqlMapper接口的接口, 这样一个bean就可以了 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.lanyuan.mapper" /> </bean> <!-- 事务配置 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource" /> </bean> <!-- <aop:config> <aop:pointcut expression="execution(public * com.lanyuan.controller.*(..))" id="pointcut" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="pointcut" /> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="query*" propagation="REQUIRED" read-only="true" /> <tx:method name="find*" propagation="REQUIRED" read-only="true" /> <tx:method name="save*" propagation="REQUIRED" /> <tx:method name="delete*" propagation="REQUIRED" /> <tx:method name="add*" propagation="REQUIRED" /> <tx:method name="modify*" propagation="REQUIRED" /> <tx:method name="logicDelById" propagation="REQUIRED" /> </tx:attributes> </tx:advice> --> <!-- <aop:aspectj-autoproxy proxy-target-class="true"/> <bean id="log4jHandlerAOP" class="com.lanyuan.logAop.LogAopAction"></bean> <aop:config proxy-target-class="true"> <aop:aspect id="logAspect" ref="log4jHandlerAOP"> <aop:pointcut id="logPointCut" expression="execution(* org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(..))" /> <aop:around method="logAll" pointcut-ref="logPointCut" /> </aop:aspect> </aop:config> --> <!-- 使用Spring组件扫描的方式来实现自动注入bean --> <context:component-scan base-package="com.lanyuan.task" /> <!-- 隐式地向 Spring 容器注册 --> <context:annotation-config /> </beans> spring-application.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.1.xsd" > <tx:annotation-driven /> <context:component-scan base-package="com.lanyuan.controller" /> <context:component-scan base-package="com.lanyuan.logAop" /> <!-- 启动对@AspectJ注解的支持 --> <!--通知spring使用cglib而不是jdk的来生成代理方法 AOP可以拦截到Controller--> <aop:aspectj-autoproxy proxy-target-class="true"/> <!-- 注解支持 --> <context:annotation-config/> <!--避免IE执行AJAX时,返回JSON出现下载文件 --> <bean id="mappingJackson2HttpMessageConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> <value>text/json;charset=UTF-8</value> <value>application/json;charset=UTF-8</value> </list> </property> </bean> <!-- 采用SpringMVC自带的JSON转换工具,支持@ResponseBody注解 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"> <property name="messageConverters"> <list> <ref bean="mappingJackson2HttpMessageConverter" /> <!-- JSON转换器 --> </list> </property> </bean> <!-- 对模型视图名称的解析,即在模型视图名称添加前后缀 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/"></property> <property name="suffix" value=".jsp"></property> </bean> <mvc:annotation-driven> <!-- 处理responseBody 里面日期类型 --> <mvc:message-converters> <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <property name="objectMapper"> <bean class="com.fasterxml.jackson.databind.ObjectMapper"> <property name="dateFormat"> <bean class="java.text.SimpleDateFormat"> <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" /> </bean> </property> </bean> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 配置文件上传,如果没有使用文件上传可以不用配置,当然如果不配,那么配置文件中也不必引入上传组件包 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 默认编码 --> <property name="defaultEncoding" value="utf-8" /> <!-- 文件大小最大值 --> <property name="maxUploadSize" value="10485760000" /> <!-- 内存中的最大值 --> <property name="maxInMemorySize" value="40960" /> </bean> <import resource="spring-mvc-shiro.xml"/> </beans> spring-mvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd" > <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" > <property name ="locations"> <list> <value>classpath:jdbc.properties</value> </list> </property> <property name="ignoreUnresolvablePlaceholders" value="true" /> </bean> <bean id="credentialsMatcher" class="com.lanyuan.shiro.credentials.RetryLimitHashedCredentialsMatcher"> <!-- hashAlgorithmName必须的,没有默认值。可以有MD5或者SHA-1,如果对密码安全有更高要求可以用SHA-256或者更高。 这里使用MD5 storedCredentialsHexEncoded默认是true,此时用的是密码加密用的是Hex编码;false时用Base64编码 hashIterations迭代次数,默认值是1。 --> <constructor-arg ref="cacheManager" /> <property name="hashAlgorithmName" value="md5" /> <!--<property name="hashIterations" value="2" />--> <!--<property name="storedCredentialsHexEncoded" value="true" />--> </bean> <!-- 会话Cookie模板 --> <bean id="sessionIdCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <!-- sid如果改为JSESSIONID会导致重定向循环 --> <constructor-arg value="sid"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="-1"/> </bean> <bean id="rememberMeCookie" class="org.apache.shiro.web.servlet.SimpleCookie"> <constructor-arg value="rememberMe"/> <property name="httpOnly" value="true"/> <property name="maxAge" value="2592000"/><!-- 30天 --> </bean> <!-- rememberMe管理器 --> <bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager"> <!-- rememberMe cookie加密的密钥 建议每个项目都不一样 默认AES算法 密钥长度(128 256 512 位)--> <property name="cipherKey" value="#{T(org.apache.shiro.codec.Base64).decode('4AvVhmFLUs0KTA3Kprsdag==')}"/> <property name="cookie" ref="rememberMeCookie"/> </bean> <bean id="casSubjectFactory" class="org.apache.shiro.cas.CasSubjectFactory"/> <!-- 凭证匹配器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <property name="realm" ref="casRealm" /> <property name="sessionManager" ref="sessionManager"/> <!-- 使用下面配置的缓存管理器 --> <property name="cacheManager" ref="cacheManager" /> <property name="rememberMeManager" ref="rememberMeManager"/> <property name="subjectFactory" ref="casSubjectFactory"/> </bean> <!-- 相当于调用SecurityUtils.setSecurityManager(securityManager) --> <bean class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"> <property name="staticMethod" value="org.apache.shiro.SecurityUtils.setSecurityManager"/> <property name="arguments" ref="securityManager"/> </bean> <!--自定义Realm --> <!-- <bean id="myRealm" class="com.lanyuan.shiro.MyRealm"> <property name="credentialsMatcher" ref="credentialsMatcher" /> <property name="cachingEnabled" value="false" /> --> <!-- 如需要自定义缓存时间放开以下.修改 ehcache.xml--> <!--<property name="authenticationCachingEnabled" value="true"/>--> <!--<property name="authenticationCacheName" value="authenticationCache"/>--> <!--<property name="authorizationCachingEnabled" value="true"/>--> <!--<property name="authorizationCacheName" value="authorizationCache"/>--> <!-- </bean> --> <!-- <property name="userService" ref="userService"/> --> <bean id="casRealm" class="com.lanyuan.shiro.MyCasRealm"> <property name="cachingEnabled" value="true"/> <property name="authenticationCachingEnabled" value="true"/> <property name="authenticationCacheName" value="authenticationCache"/> <property name="authorizationCachingEnabled" value="true"/> <property name="authorizationCacheName" value="authorizationCache"/> <!--该地址为cas server地址 --> <property name="casServerUrlPrefix" value="${shiro.casServer.url}"/> <!-- 该地址为是当前应用 CAS 服务 URL,即用于接收并处理登录成功后的 Ticket 的, 必须和loginUrl中的service参数保持一致,否则服务器会判断service不匹配--> <property name="casService" value="${shiro.client.cas}"/> </bean> <bean id="sysUserFilter" class="com.lanyuan.shiro.filter.SysUserFilter"/> <bean id="kickoutSessionControlFilter" class="com.lanyuan.shiro.filter.KickoutSessionControlFilter"> <property name="cacheManager" ref="cacheManager"/> <property name="sessionManager" ref="sessionManager"/> <property name="kickoutAfter" value="false"/> <property name="maxSession" value="1"/> <property name="kickoutUrl" value="/login.shtml"/> </bean> <bean id="casFilter" class="org.apache.shiro.cas.CasFilter"> <!--配置验证错误时的失败页面(Ticket 校验不通过时展示的错误页面) --> <property name="failureUrl" value="${shiro.failureUrl}"/> </bean> <bean id="casLogoutFilter" class="io.github.howiefh.cas.session.CasLogoutFilter"> <property name="sessionManager" ref="sessionManager"/> </bean> <bean id="logoutFilter" class="org.apache.shiro.web.filter.authc.LogoutFilter"> <property name="redirectUrl" value="${shiro.logout.url}"/> </bean> <!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 --> <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"> <property name="securityManager" ref="securityManager" /> <!-- <property name="loginUrl" value="/login.shtml" /> <property name="successUrl" value="/index.shtml" /> --> <property name="loginUrl" value="${shiro.login.url}"/> <property name="successUrl" value="${shiro.login.success.url}"/> <property name="unauthorizedUrl" value="/denied.jsp" /> <!-- 自定义权限配置 --> <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource" /> <property name="filters"> <util:map> <entry key="cas" value-ref="casFilter"/> <entry key="logout" value-ref="logoutFilter" /> <entry key="casLogout" value-ref="casLogoutFilter" /> <entry key="sysUser" value-ref="sysUserFilter"/> <entry key="kickout" value-ref="kickoutSessionControlFilter"/> </util:map> </property> </bean> <!--自定义filterChainDefinitionMap --> <bean id="chainDefinitionSectionMetaSource" class="com.lanyuan.shiro.ChainDefinitionSectionMetaSource"> <property name="filterChainDefinitions"> <value> /casFailure.jsp = anon /cas = casLogout,cas /logout = logout /favicon.ico = anon /admin_files/** = anon /fonts/** = anon /404/** = anon /error.jsp = anon /js/** = anon /layer-v1.9.2/** = anon /notebook/** = anon /login.shtml = anon /denied.jsp = anon /install.shtml = anon /lanyuan.shtml = anon /** = casLogout,user </value> </property> </bean> <bean id="sessionIdGenerator" class="org.apache.shiro.session.mgt.eis.JavaUuidSessionIdGenerator"/> <!-- 会话DAO --> <bean id="sessionDAO" class="org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionDAO"> <property name="activeSessionsCacheName" value="shiro-activeSessionCache"/> <property name="sessionIdGenerator" ref="sessionIdGenerator"/> </bean> <!-- 会话验证调度器 --> <!-- 全局的会话信息检测扫描信息间隔30分钟--> <bean id="sessionValidationScheduler" class="org.apache.shiro.session.mgt.quartz.QuartzSessionValidationScheduler"> <property name="sessionValidationInterval" value="1800000"/> <property name="sessionManager" ref="sessionManager"/> </bean> <!-- 会话管理器 --> <!-- 全局的会话信息设置成30分钟,sessionValidationSchedulerEnabled参数就是是否开启扫描 --> <bean id="sessionManager" class="org.apache.shiro.web.session.mgt.DefaultWebSessionManager"> <property name="globalSessionTimeout" value="1800000"/> <property name="deleteInvalidSessions" value="true"/> <property name="sessionValidationSchedulerEnabled" value="true"/> <property name="sessionValidationScheduler" ref="sessionValidationScheduler"/> <property name="sessionDAO" ref="sessionDAO"/> <property name="sessionIdCookieEnabled" value="true"/> <property name="sessionIdCookie" ref="sessionIdCookie"/> </bean> <!--shiro缓存管理器 --> <bean id="cacheManager" class="com.lanyuan.shiro.spring.SpringCacheManagerWrapper" > <property name="cacheManager" ref="springCacheManager"/> </bean> <bean id="springCacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager"> <property name="cacheManager" ref="ehcacheManager"/> </bean> <!--ehcache--> <bean id="ehcacheManager" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"> <property name="configLocation" value="classpath:ehcache.xml"/> </bean> <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" /> </beans> spring-shiro.xml <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="false"> <display-name>gtsys</display-name> <!-- 单点登出 --> <!-- <listener> <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> </listener> <filter> <filter-name>CAS Single Sign Out Filter</filter-name> <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> </filter> <filter-mapping> <filter-name>CAS Single Sign Out Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-shiro.xml,classpath:spring-application.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> <listener> <listener-class> org.springframework.web.context.request.RequestContextListener </listener-class> </listener> <filter> <filter-name>shiroFilter</filter-name> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <async-supported>true</async-supported> <init-param> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-mvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.shtml</url-pattern> </servlet-mapping> <filter> <filter-name>encoding</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>encoding</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> --> <servlet-mapping> <servlet-name>jsp</servlet-name> <url-pattern>*.html</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.eot</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.ttf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.css</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.xml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.swf</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.zip</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.gif</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.jpg</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.png</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.js</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>default</servlet-name> <url-pattern>*.woff</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>login.shtml</welcome-file> </welcome-file-list> </web-app> web.xml ## shiro shiro.session.timeout=1800000 shiro.session.validate.timespan=1800000 # cas\u767B\u5F55URL shiro.login.url=https://localhost:8443/cas-server/login?service=http://securitycenter.com:8080/gtsys/cas # cas logout shiro.logout.url=https://localhost:8443/cas-server/logout?service=http://securitycenter.com:8080/gtsys # cas\u767B\u5F55\u6210\u529F\u8DF3\u8F6CURL shiro.login.success.url=http://securitycenter.com:8080/gtsys/index.shtml # cas\u670D\u52A1\u5668URL shiro.casServer.url=https://localhost:8443/cas-server # \u5BA2\u6237\u7AEFCAS\u767B\u5F55URL shiro.client.cas=http://securitycenter.com:8080/gtsys/cas # \u5BA2\u6237\u7AEFCAS\u9A8C\u8BC1\u5931\u8D25\u8DF3\u8F6CURL shiro.failureUrl=/casFailure.jsp ## dataSource dataSource.driver=com.mysql.jdbc.Driver dataSource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8 dataSource.username=root dataSource.password=1234 properties文件 <?xml version="1.0" encoding="UTF-8"?> <ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="true" monitoring="autodetect" dynamicConfig="true"> <diskStore path="java.io.tmpdir"/> <!-- <diskStore>==========当内存缓存中对象数量超过maxElementsInMemory时,将缓存对象写到磁盘缓存中(需对象实现序列化接口) * <diskStore path="">==用来配置磁盘缓存使用的物理路径,Ehcache磁盘缓存使用的文件后缀名是*.data和*.index * name=================缓存名称,cache的唯一标识(ehcache会把这个cache放到HashMap里) * maxElementsOnDisk====磁盘缓存中最多可以存放的元素数量,0表示无穷大 * maxElementsInMemory==内存缓存中最多可以存放的元素数量,若放入Cache中的元素超过这个数值,则有以下两种情况 * 1)若overflowToDisk=true,则会将Cache中多出的元素放入磁盘文件中 * 2)若overflowToDisk=false,则根据memoryStoreEvictionPolicy策略替换Cache中原有的元素 * eternal==============缓存中对象是否永久有效,即是否永驻内存,true时将忽略timeToIdleSeconds和timeToLiveSeconds * timeToIdleSeconds====缓存数据在失效前的允许闲置时间(单位:秒),仅当eternal=false时使用,默认值是0表示可闲置时间无穷大,此为可选属性 * 即访问这个cache中元素的最大间隔时间,若超过这个时间没有访问此Cache中的某个元素,那么此元素将被从Cache中清除 * timeToLiveSeconds====缓存数据在失效前的允许存活时间(单位:秒),仅当eternal=false时使用,默认值是0表示可存活时间无穷大 * 即Cache中的某元素从创建到清楚的生存时间,也就是说从创建开始计时,当超过这个时间时,此元素将从Cache中清除 * overflowToDisk=======内存不足时,是否启用磁盘缓存(即内存中对象数量达到maxElementsInMemory时,Ehcache会将对象写到磁盘中) * 会根据标签中path值查找对应的属性值,写入磁盘的文件会放在path文件夹下,文件的名称是cache的名称,后缀名是data * diskPersistent=======是否持久化磁盘缓存,当这个属性的值为true时,系统在初始化时会在磁盘中查找文件名为cache名称,后缀名为index的文件 * 这个文件中存放了已经持久化在磁盘中的cache的index,找到后会把cache加载到内存 * 要想把cache真正持久化到磁盘,写程序时注意执行net.sf.ehcache.Cache.put(Element element)后要调用flush()方法 * diskExpiryThreadIntervalSeconds==磁盘缓存的清理线程运行间隔,默认是120秒 * diskSpoolBufferSizeMB============设置DiskStore(磁盘缓存)的缓存区大小,默认是30MB * memoryStoreEvictionPolicy========内存存储与释放策略,即达到maxElementsInMemory限制时,Ehcache会根据指定策略清理内存 * 共有三种策略,分别为LRU(最近最少使用)、LFU(最常用的)、FIFO(先进先出) --> <!-- 注意,以下缓存是永久有效,是系统初始化数据到缓存中,如果不需要永久有效,请另写,或在 --> <cache name="cache" maxEntriesLocalHeap="10000" maxEntriesLocalDisk="1000" eternal="true" diskSpoolBufferSizeMB="20" timeToIdleSeconds="0" timeToLiveSeconds="0" memoryStoreEvictionPolicy="LFU" transactionalMode="off"> </cache> <!-- 登录记录缓存 锁定10分钟 --> <cache name="passwordRetryCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <!-- <cache name="authorizationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="authenticationCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> --> <cache name="shiro-activeSessionCache" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> <cache name="shiro-kickout-session" maxEntriesLocalHeap="2000" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="0" overflowToDisk="false" statistics="true"> </cache> </ehcache> ehcache.xml package com.lanyuan.shiro; //import com.github.zhangkaitao.shiro.chapter15.service.UserService; import java.util.List; import javax.inject.Inject; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.cas.CasRealm; import org.apache.shiro.subject.PrincipalCollection; import com.lanyuan.entity.ResFormMap; import com.lanyuan.mapper.ResourcesMapper; import com.lanyuan.mapper.UserMapper; /** * <p>User: Zhang Kaitao * <p>Date: 14-2-13 * <p>Version: 1.0 */ public class MyCasRealm extends CasRealm { // private UserService userService; // // public void setUserService(UserService userService) { // this.userService = userService; // } @Inject private ResourcesMapper resourcesMapper; @Inject private UserMapper userMapper; @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String)principals.getPrimaryPrincipal(); // PathMatchingFilterChainResolver SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); //authorizationInfo.setRoles(userService.findRoles(username)); // authorizationInfo.setStringPermissions(userService.findPermissions(username)); String userId = SecurityUtils.getSubject().getSession().getAttribute("userSessionId").toString(); List<ResFormMap> rs = resourcesMapper.findUserResourcess(userId); for (ResFormMap resources : rs) { authorizationInfo.addStringPermission(resources.get("resKey").toString()); } return authorizationInfo; } } MyCasRealm.java ``` ``` <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:util="http://www.springframework.org/schema/util" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <aop:config proxy-target-class="true"></aop:config> <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"> <property name="securityManager" ref="securityManager"/> </bean> </beans> spring-mvc-shiro.xml ``` 这个是更改 网上的蓝缘系统的 cas server 和cas client参考的 http://howiefh.github.io/2015/05/19/shiro-cas-single-sign-on/?utm_source=tuicool 不知道为什么会返回404
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
《MySQL 性能优化》之理解 MySQL 体系结构
本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
python爬取百部电影数据,我分析出了一个残酷的真相
2019年就这么匆匆过去了,就在前几天国家电影局发布了2019年中国电影市场数据,数据显示去年总票房为642.66亿元,同比增长5.4%;国产电影总票房411.75亿元,同比增长8.65%,市场占比 64.07%;城市院线观影人次17.27亿,同比增长0.64%。 看上去似乎是一片大好对不对?不过作为一名严谨求实的数据分析师,我从官方数据中看出了一点端倪:国产票房增幅都已经高达8.65%了,为什...
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
C语言荣获2019年度最佳编程语言
关注、星标公众号,不错过精彩内容作者:黄工公众号:strongerHuang近日,TIOBE官方发布了2020年1月编程语言排行榜单。我在前面给过一篇文章《2019年11月C语言接近Ja...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
一份王者荣耀的英雄数据报告
咪哥杂谈本篇阅读时间约为 6 分钟。1前言前一阵写了关于王者的一些系列文章,从数据的获取到数据清洗,数据落地,都是为了本篇的铺垫。今天来实现一下,看看不同维度得到的结论。2环境准备本次实...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
​两年前不知如何编写代码的我,现在是一名人工智能工程师
全文共3526字,预计学习时长11分钟 图源:Unsplash 经常有小伙伴私信给小芯,我没有编程基础,不会写代码,如何进入AI行业呢?还能赶上AI浪潮吗? 任何时候努力都不算晚。 下面,小芯就给大家讲一个朋友的真实故事,希望能给那些处于迷茫与徘徊中的小伙伴们一丝启发。(下文以第一人称叙述) 图源:Unsplash 正如Elsa所说,职业转换是...
强烈推荐10本程序员必读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
作为一个程序员,内存的这些硬核知识你必须懂!
我们之前讲过CPU,也说了CPU和内存的那点事儿,今天咱就再来说说有关内存,作为一个程序员,你必须要懂的哪那些硬核知识! 大白话聊一聊,很重要! 先来大白话的跟大家聊一聊,我们这里说的内存啊,其实就是说的我们电脑里面的内存条,所以嘞,内存就是内存条,数据要放在这上面才能被cpu读取从而做运算,还有硬盘,就是电脑中的C盘啥的,一个程序需要运行的话需要向内存申请一块独立的内存空间,这个程序本身是存放在...
非典逼出了淘宝和京东,新冠病毒能够逼出什么?
loonggg读完需要5分钟速读仅需 2 分钟大家好,我是你们的校长。我知道大家在家里都憋坏了,大家可能相对于封闭在家里“坐月子”,更希望能够早日上班。今天我带着大家换个思路来聊一个问题...
牛逼!一行代码居然能解决这么多曾经困扰我半天的算法题
春节假期这么长,干啥最好?当然是折腾一些算法题了,下面给大家讲几道一行代码就能解决的算法题,当然,我相信这些算法题你都做过,不过就算做过,也是可以看一看滴,毕竟,你当初大概率不是一行代码解决的。 学会了一行代码解决,以后遇到面试官问起的话,就可以装逼了。 一、2 的幂次方 问题描述:判断一个整数 n 是否为 2 的幂次方 对于这道题,常规操作是不断这把这个数除以 2,然后判断是否有余数,直到 ...
立即提问