常见问题及解决方案(后端篇)
一、Jenkins 密码遗忘?
Jenkins专有用户的数据存放在JENKINS_HOME/users目录。users目录的结构我就不扯了,你一看就懂。users/xxx(各种用户名) 如上:
1 打开忘记密码的用户文件夹,里面就一个文件config.xml。
2 打开config.xml,里面有一堆的东西,找找。。。找到<passwordHash>节点。
3 把<passwordHash>节点的内容(图中黑色的那一串)换成#jbcrypt:$2a$10$DdaWzN64JgUtLdvxWIflcuQu2fgrrMSAMabF5TSrGK5nXitqK9ZMS(注意前后有木有空格)
4 保存,重启Jenkins程序。
5 输入用户名,密码111111
二、 classpath 和 classpath* 区别:
classpath:只会到你指定的class路径中查找文件;
classpath*:不仅包含class路径,还包括jar文件中(class路径)进行查找.
三、idea maven项目 热部署(SpringBoot热部署)
1) “File” -> “Settings” -> “Build,Execution,Deplyment” -> “Compiler”,选中打勾 “Build project automatically” 。
2) 组合键:“Shift+Ctrl+Alt+/” ,选择 “Registry” ,选中打勾 “compiler.automake.allow.when.app.running” 。
四、IntelliJ Idea 常用快捷键列表
psvm 创建main方法
for 循环
sout == System.out.println();
ctrl+alt+v 创建返回值对象
alt+Enter 错误提示修正
ctrl+c 复制当前一行
Ctrl+Y:不再是对应Ctrl+Z的恢复,而是删除上一行,IDEA中恢复是Ctrl+Shit+Z
ctrl+shift+上 上移一行
ctrl+shift+下 下移一行
ctrl+shift+F 查找,类似eclipse的ctrl+h
Alt+回车 导入包,自动修正
Ctrl+N 查找类
Ctrl+Shift+N 查找文件
Ctrl+Alt+L 格式化代码
Ctrl+Alt+O 优化导入的类和包
Alt+Insert 生成代码(如get,set方法,构造函数等)
Ctrl+E或者Alt+Shift+C 最近更改的代码
Ctrl+R 替换文本
Ctrl+F 查找文本
Ctrl+Shift+Space 自动补全代码
Ctrl+空格 代码提示
Ctrl+Alt+Space 类名或接口名提示
Ctrl+P 方法参数提示
Ctrl+Shift+Alt+N 查找类中的方法或变量
Alt+Shift+C 对比最近修改的代码
Shift+F6 重构-重命名
Ctrl+Shift+先上键
Ctrl+X 删除行
Ctrl+D 复制行
Ctrl+/ 或 Ctrl+Shift+/ 注释(// 或者/*...*/ )
Ctrl+J 自动代码
Ctrl+E 最近打开的文件
Ctrl+H 显示类结构图
Ctrl+Q 显示注释文档
Alt+F1 查找代码所在位置
Alt+1 快速打开或隐藏工程面板
Ctrl+Alt+ left/right 返回至上次浏览的位置
Alt+ left/right 切换代码视图
Alt+ Up/Down 在方法间快速移动定位
Ctrl+Shift+Up/Down 代码向上/下移动。
F2 或Shift+F2 高亮错误或警告快速定位
代码标签输入完成后,按Tab,生成代码。
选中文本,按Ctrl+Shift+F7 ,高亮显示所有该文本,按Esc高亮消失。
Ctrl+W 选中代码,连续按会有其他效果
选中文本,按Alt+F3 ,逐个往下查找相同文本,并高亮显示。
Ctrl+Up/Down 光标跳转到第一行或最后一行下
Ctrl+B 快速打开光标处的类或方法
五、JSON跨域问题:
一、跨域问题的原因:
1 浏览器的检查
2 跨域
3 XMLHttpRequest请求
二、跨域问题的解决:
1 禁止浏览器检查:
使用dos命令,在启动浏览器的时候,加一个参数:
chrome --disable-web-security --user-data-dir=g:\temp3
2 JSONP:
JSONP是什么:
JSONP是一种协议
JSONP解决跨域的时候后台代码需要改变吗:
需要。
需要加一个切面:
@ControllerAdvice
并且让这个类要继承AbstractJsonpResponseBodyAdvice
并且重写构造方法:
1 JsonpAdvice(){ 2 super("callback"); 3 }
JSONP的实现原理:
JSONP的弊端:
服务器需要改动代码
只支持GET
发送的不是XHR请求
3 请求是跨域的与隐藏跨域:
被调用方解决:
服务器端实现:
配置Filter:
1 @Bean 2 public FilterRegistrationBean registerFilter(){ 3 FilterRegistrationBean bean=new FilterRegistrationBean(); 4 bean.addUrlPattern("/*"); 5 bean.setFilter(new CrosFilter()); 6 }
创建一个Filter:
public class CrosFilter implements Filter{ @Override public void init(FilterConfig filterConfig) throws ServletException{ } @Override public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain)throws IOException, ServletException{ HttpServletResponse res=(HttpServletResponse)response; res.addHeader("Access-Control-Allow-Origin","http://localhost:8081"); res.addHeader("Access-Control-Allow-Methods","GET"); res.addHeader("Access-Control-Allow-Headers","Content-Type"); filterChain.doFilter(request,response); } }
此处的res.addHeader("Access-Control-Allow-Origin","*");可以使用*来表示所有的域,方法也可以使用*来表示所有的方法。
简单请求和非简单请求:
工作中比较常见的【简单请求】:
方法为:GET HEAD POST
请求header里面:无自定义头、Content-Type为以下几种:
text/plain
multipart/form-data
application/x-www-form-urlencoded
工作中比较常见的【非简单请求】:
put,delete方法的ajax请求
发送json格式的ajax请求
带自定义头的ajax请求
OPTIONS预检命令:
OPTIONS预检命令缓存:
res.addHeader(“Access-Control-Max-Age”,”3600”);//表示在一小时内缓存这个OPTIONS信息,不用每次请求都请求两次。
带Cookie的跨域问题:
Origin必须是全匹配,不能使用*,必须指定域名;并且需要在Filter里面增加:
res.addHeader(“Access-Control-Allow-Credentials”,”true”);
带自定义头的跨域问题:
被调用方-Nginx解决方案:
1 配置虚拟文件vhost:在nginx的目录中创建一个文件夹,命名为vhost,并在nginx的配置文件中的最后一行中加入以下代码:include vhost/*.conf,将vhost中的.conf文件加载进来。
2 在vhost文件夹下新建一个文件b.com.conf,使用nginx的语法,在该文件中加入以下内容:
1 server{ 2 listen 80; //监听的端口 3 server_name b.com; 4 location /{ 5 proxy_pass http://localhost:8080/; 6 } 7 }
此时访问b.com便可以代替之前的localhost:8080进行访问。
3 继续在以上文件中添加:
1 location /{ 2 proxy_pass http://localhost:8080/; 3 add_header Access-Control-Allow-Methods *; 4 add_header Access-Control-Max-Age 3600; 5 add_header Access-Control-Allow-Credentials true; 6 7 add_header Access-Control-Allow-Origin $http_origin; 8 add_header Access-Control-Allow-Headers 9 $http_access_control_request_headers; 10 if ($request_method=OPTIONS){ 11 return 200; 12 } 13 }
Apache配置:
1 打开apache根目录下的conf文件夹下的httpd.conf文件,并搜索vhost,解开LoadModule vhost_alias_module modules/mod_vhost_alias.so
2 继续搜索vhost,解开Include conf/extra/httpd-vhosts.conf
3 打开conf文件夹下的extra文件夹下的httpd-vhosts.conf
4 增加一个虚拟主机,复制一份,并且修改为以下内容:
1 <VirtualHost *:80> 2 ServerName b.com 3 ErrorLog "logs/b.com-error.log" 4 CustomLog "logs/b.com-access.log" common 5 ProxyPass / http://localhost:8080/ 6 </VirtualHost>
5 在httpd.conf文件中解开proxy模块:LoadModule proxy_module modules/mod_proxy.so (140行)
6 在httpd.conf文件中解开proxy http模块:LoadModule proxy_http_module modules/mod_proxy_http.so
7 进入apache的bin目录,双击httpd.exe文件,启动apache。
8 在httpd-vhosts.conf文件中增加响应头:
1 <VirtualHost *:80> 2 ServerName b.com 3 ErrorLog "logs/b.com-error.log" 4 CustomLog "logs/b.com-access.log" common 5 ProxyPass / http://localhost:8080/ 6 7 #把请求头的origin值返回到Access-Control-Allow-Origin字段 8 Header always set Access-Control-Allow-Origin "expr=% 9 {req:origin}" 10 11 #把请求头的Access-Control-Request-Headers值返回到Access-Control-Allow-Headers字段 12 Header always set Access-Control-Allow-Headers "expr=% 13 {req:Access-Control-Request-Headers}" 14 15 Header always set Access-Control-Allow-Methods "*" 16 Header always set Access-Control-Max-Age "3600" 17 Header always set Access-Control-Allow-Credentials "true" 18 19 #处理预检命令OPTIONS,直接返回204 20 RewriteEngine On 21 RewriteCond %{REQUEST_METHOD} OPTIONS 22 RewriteRule ^(.*)$ "/"[R=204,L] 23 </VirtualHost>
9 在httpd.conf文件中,解开headers模块:LoadModule headers_module modules/mod_headers.so
10 在httpd.conf文件中,打开rewrite模块:LoadModule rewrite_module modules/mod_rewrite.so
Spring框架的跨域解决:
在控制器中使用@CrossOrigin注解
调用方解决-隐藏跨域:
1 在hosts文件中,增加一个虚拟域名:127.0.0.1 b.com a.com
2 在nginx的vhosts文件夹中新建一个a.com.conf,打开:
1 server{ 2 listen 80; 3 server_name a.com; 4 location /{ 5 proxy_pass http://localhost:8081/; 6 } 7 location /ajaxserver{ 8 proxy_pass http://localhost:8080/test/; 9 } 10 }
六、Jetty的安装:
前提:必须安装jdk。
1.下载Jetty安装包:http://dist.codehaus.org/jetty/jetty-6.1.22/
2.解压至任意目录
3.直接进入bin目录,双击Jetty-Service.exe。启动成功
4.地址栏直接输入http://localhost:8080
ps:
1.修改E:\jetty-6.1.22\etc\ jetty.xml文件中的如下代码,将8080改为相应的端口号即可
2.myeclipse使用Jetty跟tomcat一样,选择jetty目录便可。
七、解决windows无法创建.gitignore文件:
今天打算把本地的项目用git推送到github上去,但是有的信息我又不想把它加入到版本控制系统中去,例如.classpath文件和.class文件等等,这个时候我就想到了使用.gitignore文件把不需要做版本控制的文件排除出去,我打算在我的项目根目录下新建一个.gitignore文件,当我写好文件名并按下回车键的时候我得到了这个错误。
不知道从Windows的哪个版本开始,系统不能创建.xxx的文件了,我记得XP系统还可以创建这种文件的。谷歌了各种解决方案,最终在stackoverflow上面找到了比较好的解决方案:
1. 在项目根目录下面创建gitignore.txt文件
2. 把你需要排除的文件名保存到gitignore.txt文件
3. 在项目根目录下面按住Shift键并邮件然后选择“在此处打开命令窗口”
4. 执行命令 ren gitignore.txt .gitignore
大功告成了!
或者:创建一个文件,文件名为:“.gitignore.”,注意前后都有一个点。保存之后系统会自动重命名为“.gitignore”。
八、dubbo工作流程:
首先是容器初始化provider,provider向注册中心(Zookeeper)注册服务,
Consumer启动时,首先去Zookeeper上订阅需要消费URL,说白了就是拿到一个List<URL>即可
然后dubbo拿到这个List<URL>后,通过一种算法选择list中的一个URL,然后使用这个URL中的IP和端口,来发起一个invoke请求(你可以理解发送了一个HTTP请求)
而这请求都会被dubbo收集下来了,然后发送到远程进行保存。
dubbo工作流程图:
九、Android一些基本概念:
1 Activity
三个状态:创建、暂停、结束
七个周期:onCreate(),onStart(),onResume(),onPause(),onStop(),onRestart(),onDestroy()
打开另外一个Activity:
绑定按钮的onclick事件,实现onclick方法,创建一个Intent对象,获取当前activity的对象,绑定的activity对象,startActivity():
1 btn=(Button)findViewById(R.id.btn);//绑定某个按钮 2 btn.setOnclickListener(new View.OnClickListener(){//注册按钮监听事件 3 #Override 4 public void onClick(View v){ 5 Intent i=new Intent(MainActivity.this,Aty1.class);//创建Intent对象 6 startActivity(i);//打开另外一个Activity 7 } 8 })
Activity传值:
1 i.putExtra(String,String) -> getIntent().getExtraString("")
2 Bundle 对象传递数据:
Bundle data = new Bundle();
怎么获取第二个Activity返回的值?
//在主Activity中:
使用startActivityResult(i,requestCode);
重写:
1 @Override 2 protected void onActivityResult(int requestCode,resultCode,Intent data){ 3 String result=data.getStringExtra("result"); 4 super.onActivityResult(requestCode,resultCode,data); 5 }
//在第二个Activity中:
setResult(int resultCode,Intent data);
2 Service 后台处理信息,可以一直运行在后台
1 @Override 2 onCreate()//创建Service的方法 3 @Override 4 onDestroy()//关闭Service的方法 5 @Override 6 public IBinder onBind(Intent intent) //绑定服务 7 创建Service的方法: 8 Intent serviceIntent=new Intent(this,EchoService);//第一个参数是当前的Activity,第二个参数是Service类的名字 9 10 startService(serviceIntent);//点击按钮时,开启服务 11 stopService(serviceIntent);//点击按钮时,关闭服务 12 bindService(serviceIntent,this,Context.BIND_AUTO_CREATE);//点击按钮时, 绑定某个服务 13 unbindService(this);//点击按钮时,关闭服务。
在使用Service时,需要主Activity实现ServiceConnection,并实现未实现的方法:
1 @Override 2 public void onServiceConnected(ComponentName name,IBinder service);//当成功绑定时,做某些操作 3 @Override 4 public void onServiceDisconnected(ComponentName name);//当服务断开连接时,做某些操作
此时无法执行到onServiceConnected()方法,是因为只执行了onCreate()和onBind()方法,而onBind()方法中有一个返回对象是IBinder,需要给一个返回对象。
想要真正绑定服务成功,需要在EchoService中创建:
1 public IBinder onBind(Intent intent){ 2 3 return echoSerivceBinder; 4 } 5 6 private final EchoServiceBinder echoSerivceBinder=new EchoServiceBinder(); 7 8 public class EchoServiceBinder extends Binder{//内部类 9 10 }
十、:maven打包带main函数:
1 <build> 2 <!-- 配置文件 --> 3 <resources> 4 <resource> 5 <targetPath>${project.build.directory}/classes</targetPath> 6 <directory>src/main/resources</directory> 7 <filtering>true</filtering> 8 <includes> 9 <include>**/*.xml</include> 10 <include>**/*.properties</include> 11 </includes> 12 </resource> 13 <resource> 14 <targetPath>${project.build.directory}/classes/META-INF</targetPath> 15 <directory>src/main/resources</directory> 16 <filtering>true</filtering> 17 <includes> 18 <include>spring-context.xml</include> 19 </includes> 20 </resource> 21 </resources> --> 22 23 <pluginManagement> 24 <plugins> 25 <!-- 解决Maven插件在Eclipse内执行了一系列的生命周期引起冲突 --> 26 <plugin> 27 <groupId>org.eclipse.m2e</groupId> 28 <artifactId>lifecycle-mapping</artifactId> 29 <version>1.0.0</version> 30 <configuration> 31 <lifecycleMappingMetadata> 32 <pluginExecutions> 33 <pluginExecution> 34 <pluginExecutionFilter> 35 <groupId>org.apache.maven.plugins</groupId> 36 <artifactId>maven-dependency-plugin</artifactId> 37 <versionRange>[2.0,)</versionRange> 38 <goals> 39 <goal>copy-dependencies</goal> 40 </goals> 41 </pluginExecutionFilter> 42 <action> 43 <ignore /> 44 </action> 45 </pluginExecution> 46 </pluginExecutions> 47 </lifecycleMappingMetadata> 48 </configuration> 49 </plugin> 50 </plugins> 51 </pluginManagement> 52 <plugins> 53 <!-- 打包jar文件时,配置manifest文件,加入lib包的jar依赖 --> 54 <plugin> 55 <groupId>org.apache.maven.plugins</groupId> 56 <artifactId>maven-jar-plugin</artifactId> 57 <configuration> 58 <classesDirectory>target/classes/</classesDirectory> 59 <archive> 60 <manifest> 61 <!-- 主函数的入口 --> 62 <mainClass>tpri.mina.execute.Main</mainClass> 63 <!-- 打包时 MANIFEST.MF文件不记录的时间戳版本 --> 64 <useUniqueVersions>false</useUniqueVersions> 65 <addClasspath>true</addClasspath> 66 <classpathPrefix>lib/</classpathPrefix> 67 </manifest> 68 <manifestEntries> 69 <Class-Path>.</Class-Path> 70 </manifestEntries> 71 </archive> 72 </configuration> 73 </plugin> 74 <plugin> 75 <groupId>org.apache.maven.plugins</groupId> 76 <artifactId>maven-dependency-plugin</artifactId> 77 <executions> 78 <execution> 79 <id>copy-dependencies</id> 80 <phase>package</phase> 81 <goals> 82 <goal>copy-dependencies</goal> 83 </goals> 84 <configuration> 85 <type>jar</type> 86 <includeTypes>jar</includeTypes> 87 <useUniqueVersions>false</useUniqueVersions> 88 <outputDirectory> 89 ${project.build.directory}/lib 90 </outputDirectory> 91 </configuration> 92 </execution> 93 </executions> 94 </plugin> 95 </plugins> 96 </build>