ARTS打卡第十一周

Algorithm:21. 合并两个有序链表

将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例:
输入:1->2->4, 1->3->4
输出:1->1->2->3->4->4

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/merge-two-sorted-lists

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        return mergeRecursive(l1, l2);
    }
    // 解法二:递归,时间复杂度O(m + n),空间复杂度O(m+n)
    private ListNode mergeRecursive(ListNode l1, ListNode l2) {
        if(l1 == null) {
            return l2;
        } else if (l2 == null) {
            return l1;
        } else {
            if(l1.val <= l2.val) {
                l1.next = mergeRecursive(l1.next, l2);
                return l1;
            } else {
                l2.next = mergeRecursive(l1, l2.next);
                return l2;
            } 
        }
    }

    // 解法一:迭代,时间复杂度是O(m + n),内存消耗为O(1)
    public ListNode mergeTwoLists_1(ListNode l1, ListNode l2) {
        ListNode r = new ListNode(-1);
        ListNode resultHead = r;
        
        for(; l1 != null && l2 != null; r = r.next) {
            if(l1.val <= l2.val) {
                r.next = l1;
                l1 = l1.next;
            } else {
                r.next = l2;
                l2 = l2.next;
            }
        }
        if(l1 != null) {
            r.next = l1;
        } else if(l2 != null) {
            r.next = l2;
        }
        return resultHead.next;
    }
}

Review: What Your IP Address Reveals About You and Why You Should Hide It

文章讲述了IP地址会暴露我们哪些信息,以及如何隐藏我们的真实IP。大致翻译如下:

IP地址是你的电脑在Internet上的唯一标识,发送给你电脑的流量需要通过IP地址找到你的电脑。IP地址可以提供很多信息,这些信息可以在Internet上定位到你,这就给黑客和广告商提供了机会。

那么IP地址会暴露你的哪些信息呢?
最大的担忧就是暴露你的地理位置。幸运的是,我们通常是通过路由器连接到Internet的,通常只会暴露路由器的IP地址,通过这个IP地址只能定位到一个大概的位置,而不能定位到你的具体地址,比如哪条街道。
当你访问网站时,你的IP会被网站记录下来。这有助于网站管理者知道访问网站的流量来自哪里。某些情况下,你的IP会被网站公布出去。那么,黑客或者政府能从你的IP地址中找到什么信息呢?

  1. 他们可以知道你访问过哪些网站。
  2. 他们可以追踪你的行动。
  3. 他们可以识别出你的信息服务提供商(ISP),报告你的不良行为。
  4. 他们可以利用你的地理位置给你推送广告。隐藏IP可以避免一些个性化的广告推送以及防止你的搜索记录被网站利用。如果你经常在公共场所使用电脑,它可以保证你的隐私记录不会以广告的形式出现,而这时可能正有人在背后看着你的屏幕。

为什么需要隐藏IP?
有如下几点原因:

  1. 隐藏你的位置。从IP地址中,可以发现如下信息:
  • 邮编
  • 城市
  • 国家
  • 地区
  • 经纬度。你可能会很紧张,一个黑客有可能从你的IP地址中找出关联的GPS数据。
  1. 绕过一些网站对IP地址的限制。有些网站会禁止某个国家或者地区的IP访问,隐藏IP可以帮助绕过这个限制。
  2. 隐藏IP可以防止你受到网络攻击。
  3. 隐藏IP可以防止你的浏览记录被公开。

如何隐藏IP呢?
要注意,现代浏览器开启匿名模式,只是保证你的浏览记录不会被浏览器存储下来,并不会隐藏你的IP。想要隐藏IP,可以通过如下几种方式:

  1. 使用Tor浏览器。Tor是一个超级安全的浏览器,它可以加密你从互联网上发送的所有信息。虽然Tor经常被精通技术的人所使用,但对大多数人来说,它的杀伤力太大了,限制了你在网络上可以做的事情(例如,激活JavaScript,甚至到Youtube上播放视频都可能破坏Tor的匿名性,泄露你的真实IP地址。BitTorrent是一个特殊的风险)
  2. 使用网络代理。网络代理可以隐藏你的真实IP,但也要小心,有些网络代理也会贩卖你的信息,而有些网络代理会向你推送自己的广告。有些网站能识别出你使用了代理,从而阻止你访问,因为代理也经常被黑客们利用。一些流媒体网站也会使用代理检测技术,防止你通过代理看到一些未在你所在地区发布的内容。WebRTC漏洞将允许一些站点通过代理跟踪您的实际位置。代理会变得越来越便宜。代理也可以起到一定阻止黑客的作用,黑客看到你正在使用代理,他会去找一些更容易攻击的目标。
  3. 使用VPN。最好的隐藏IP的方式是使用VPN。VPN的一大优势是很容易配置多终端使用。VNP使用加密技术,也更安全。使用VPN可能会影响网速。越来越多的公司要求他们的员工通过VPN接入办公室网络。
    当你在网上交易或者购物,又或者你在网上做的事情不能被你的老板发现,你就需要隐藏IP。到目前为止,隐藏IP最好的做法是注册一个VPN。现在VPN已经越来越易用且便宜了。
  4. 使用移动网络。如果你觉得你的IP地址已经受到威胁了,改变IP的最方便的方式是使用移动网络。
  5. 使用公共wifi,也能很方便的改变IP地址。但是使用公共wifi缺乏安全性。
  6. 致电ISP。

Tip: 使用Jersey上传文件

添加pom依赖

<dependency>
    <groupId>org.glassfish.jersey.media</groupId>
    <artifactId>jersey-media-multipart</artifactId>
    <version>2.25.1</version>
</dependency>

注:其他jersey的依赖这里没有列出来

注册MultipartFeature

有两种方式注册:
1,在web.xml中注册:只需要在Jersey的ServletContainer中添加initparam即可:

<init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.media.multipart.MultiPartFeature</param-value>
</init-param>

2,如果是使用Servlet3.0的方式启动,需要在ResourceConfig中添加MultipartFeature:

@ApplicationPath("webapi")
public class RestApplication extends ResourceConfig {
    public RestApplication() {
        this.packages("cn.wolfcode.jersey");
        this.register(MultiPartFeature.class);
    }
}

编写接收文件的方法

@POST
@Path("/upload")
@Produces({MediaType.APPLICATION_JSON})
@Consumes({MediaType.MULTIPART_FORM_DATA}) //这个很重要
public Response uploadRegisteredCpeSnapshot(@Context SecurityContext sc,
                                    @FormDataParam("file") InputStream inputStream,
                                    @FormDataParam("file") FormDataContentDisposition fileDetail) {
    try {
        ValidateUtils.parameterValid(inputStream != null && fileDetail != null, "uploaded file is null");
        String fileName = fileDetail.getFileName();
        File file = new File("/upload/" + fileName);
        FileUtils.copyInputStreamToFile(inputStream, file);// 需要依赖 Apache commons.io
        return ErrorResponse.ResponseUtil.creationSucceed();
    } catch (Exception e) {
        LOG.error("failed to upload file ", e);
        return ErrorResponse.ResponseUtil.failure(e);
    }
}

使用Postman测试文件上传功能

  1. 选择POST请求,输入正确的URL
  2. 在请求的body标签页选择form-data选项,在出现的key-value表格里填上 key=file, key后面的类型选择File,在value列就出现选择文件的按钮了。
  3. 在Headers里添加 Content-Type=multipart/form-data
  4. 点击Send即可。

在这里插入图片描述
在这里插入图片描述

Share: Jersey 开发RESTful(十二)Jersey上传下载

https://www.jianshu.com/p/16aa75e79baf?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值