在项目微服务的升级过程中,我们通常会设置一个网关,作为一个洪流的出入口,在Spring Cloud 中提供了对应的功能,也就是Spring Cloud Gateway。对于旧的项目springMVC,实际也就是将spring-webmvc升级为spring-webflux,但你会发现fromdata 形式的数据,在webmvc可以被封装成参数,而在webflux中却不能,是不支持吗?
View DetailsList>();
一、简介
二、并发编程的3个基本概念
1.原子性
2.可见性
3.有序性
三、锁的互斥和可见性
四、Java的内存模型JMM以及共享变量的可见性
五、volatile变量的特性
1.保证可见性,不保证原子性
2.禁止指令重排
六、volatile不适用的场景
七、volatile原理
八、单例模式的双重锁为什么要加volatile
1)找到项目下的.idea/workspace.xml
2)打开文件,找到标签:PropertiesComponent
3)添加一行属性:
其它属性代码不要修改,只添加下面一行属性代码
用的Apache PDFBox库 读:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
import java.io.File; import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.text.PDFTextStripper; public class PDFReader { public static void main(String[] args) { try { // 加载PDF文件 File file = new File("example.pdf"); PDDocument document = PDDocument.load(file); // 创建PDFTextStripper对象 PDFTextStripper pdfStripper = new PDFTextStripper(); // 从第一页到最后一页提取文本内容 for (int i = 1; i <= document.getNumberOfPages(); i++) { pdfStripper.setStartPage(i); pdfStripper.setEndPage(i); String text = pdfStripper.getText(document); System.out.println("Page " + i + ":"); System.out.println(text); } // 关闭PDF文档 document.close(); } catch (IOException e) { e.printStackTrace(); } } } |
写:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
import java.io.IOException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.pdmodel.font.PDType1Font; public class PDFGenerator { public static void main(String[] args) { try { // 创建文档对象 PDDocument document = new PDDocument(); // 创建页面 PDPage page = new PDPage(); // 将页面添加到文档 document.addPage(page); // 创建内容流以便向页面添加内容 PDPageContentStream contentStream = new PDPageContentStream(document, page); // 设置字体和字体大小 contentStream.setFont(PDType1Font.HELVETICA, 12); // 在页面上写入文本 contentStream.beginText(); contentStream.newLineAtOffset(100, 700); contentStream.showText("Hello, World!"); contentStream.endText(); // 关闭内容流 contentStream.close(); // 保存文档 document.save("GeneratedPDF.pdf"); // 关闭文档 document.close(); System.out.println("PDF文件已生成成功!"); } catch (IOException e) { e.printStackTrace(); } } } |
View Details
记录一下今天工作的时候升级一个认证服务遇到的小问题,虽然最后解决只有一行代码,却花了差不多3个小时。
初始版本为
springboot 1.5.9.RELEASE
springcloud Dalston.SR1
升级为
springboot 2.0.3.RELEASE
springcloude finchley.RELEASE
升级改造完成之后,服务运行正常,但是请求认证的时候报错:
http://localhost:9000/oauth/token?grant_type=password&scope=app&client_id=client_2&client_secret=123456&username=user&password=123456
回复
{
“error”: “invalid_client”,
“error_description”: “Bad client credentials”
}
客户端通过客户端的id和secret申请授权,这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。
View Details首先我们得了解什么是Oauth2.0,简单来说Oauth2.0它是一个授权协议。我们可能会听说过,使用Oauth2.0来实现单点登录SSO,以及第三方登录。那个什么是授权?
举个通俗易懂的例子,就是第三方人员A要想进入B公司的大厦进行业务交流的时候,因为A并不是B公司的员工,出于安全的缘故,所以他不能够自由的出入B公司的大厦。那个A到了B公司前台的时候,A得去前台和B公司前台工作人员说明来意,并且出示邀请(访问)证明,此时B公司前台工作人员就会给你一张临时工牌让你进入大厦。
在这个例子当中,A没有工牌所以是无法进入B公司大厦里进行业务交流,B公司前台给A一张临时工牌,这个操作就相当于授权。
总的来说,OAuth 2.0 这种授权协议,就是保证第三方(软件)只有在获得授权之后,才可以进一步访问授权者的数据。
View Details开发中使用RestTemplate来进行访问,设置请求头的方法: 方法一:单独设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class TestRestTemplate { @Autowired private RestTemplate restTemplate; public void postObject(String id){ String url="http://www.baidu.com"; MultiValueMap<String, String> map = new LinkedMultiValueMap<>(); map.add("id",id); HttpHeaders header = new HttpHeaders(); // 需求需要传参为form-data格式 header.setContentType(MediaType.MULTIPART_FORM_DATA); HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(map, header); JSONObject response = restTemplate.postForObject(url, httpEntity, JSONObject.class); } } |
方法二:公共设置,使用interceptor拦截器设置 1.添加拦截器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor { private final String headerName; private final String headerValue; public HeaderRequestInterceptor(String headerName, String headerValue) { this.headerName = headerName; this.headerValue = headerValue; } @Override public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { request.getHeaders().set(headerName, headerValue); return execution.execute(request, body); } |
2.配置RestTemplate Bean
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
@Configuration public class RestTemplateConfig { @Bean public RestTemplate restTemplate() { List<ClientHttpRequestInterceptor> interceptors = new ArrayList<>(); interceptors.add(new HeaderRequestInterceptor("token", "123")); RestTemplate restTemplate = new RestTemplate(); restTemplate.setInterceptors(interceptors); return restTemplate; } } |
3.使用RestTemplate Bean
1 2 |
@Autowired private RestTemplate restTemplate; |
from:https://www.cnblogs.com/z-Z-/p/15932021.html
View DetailsOCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程;
现在有很多软件都支持这个功能,比如钉钉就支持扫描图片后直接转成文字。
在OCR识别领域,有一个开源的项目——Tesseract,Tesseract是一個光学字符识别引擎。Tesseract是基于Apache许可证的自由软件,自2006 年起由Google赞助开发。2006年,Tesseract被认为是最精准的开源光学字符识别引擎之一。
View Details