分类 技术相关 下的文章

方式1

修改/var/HyperDown.php文件中的超链接标签,添加 target='_blank',修改后代码如下:

<a href=\"{$url}\" target='_blank'>{$escaped}</a>

,此种方式适用于通过后台编辑器,超链接选项,添加的超链接。

方式2

  • 引入jquery,

    <script src="https://lib.baomitu.com/jquery/1.9.1/jquery.min.js"></script>
    
  • ready函数中

    //a new window 打开
    $("a[href*='://']:not(a[href^='http://www.域名/'],a[href^='http://域名/'])").attr({target:"_blank",rel:"nofollow"});
    

背景:

www.mydomain.com 和 test.mydomain.com的三级域名是不同的。默认情况下在相同浏览器、不同tab页访问分别访问这两个域名的session不共享的。因为cookie的domain是不一样的,所以浏览器不能携带同一目录的sessionId给服务器。登录一个域名,切换到第二个域名时,需要重新登录。

使用一个过渡域名,将sessionID更新成一致

如下:

 String JSESSIONID = request.getSession().getId();//获取当前JSESSIONID (不管是从主域还是二级域访问产生)

 Cookie cookie = new Cookie("JSESSIONID", JSESSIONID);
 cookie.setDomain(".test.com"); //关键在这里,将cookie设成主域名,确保不同域之间都能获取到该cookie的值,从而确保session统一
 response.addCookie(cookie);  //将cookie返回到客户端
 request.getRequestDispatcher("indes.jsp").forward(request, response);

tomcat配置context增加属性:

<Context sessionCookieDomain=".mydomain.com" sessionCookiePath="/">

FilenameUtils工具类

是一个Java操作文件的常用库,是Apache对java的IO包的封装,这里面有两个非常核心的类FilenameUtils跟FileUtils,其中FilenameUtils是对文件名操作的封装;FileUtils是文件封装,开发中对文件的操作。

  • 引入commons-io包
<dependency>  
      <groupId>commons-io</groupId>  
      <artifactId>commons-io</artifactId>  
      <version>2.4</version>  
</dependency>  
  • 测试类代码
import java.util.ArrayList;  
import java.util.List;  
import org.apache.commons.io.FilenameUtils;  
import org.apache.commons.io.IOCase;  
/** 
 * org.apache.commons.io.FilenameUtils工具类笔记 
 * @author Ickes 
 */  
public class FilenameUtilsTest {  
    public static void main(String[] args) throws Exception {  
        String fileDirectory = "/D:/aa/bb/cc";   
        String fileName ="file.txt";  
        String fileFullName = fileDirectory +"/"+ fileName;  
        System.out.println("(1)显示linux路径:"+FilenameUtils.normalizeNoEndSeparator(fileFullName));  
        System.out.println("(2)合并目录和文件名为文件全路径:"+FilenameUtils.concat(fileDirectory, fileName));  
        System.out.println("(3)文件路径去除目录和后缀后的文件名:"+FilenameUtils.getBaseName(fileFullName));  
        System.out.println("(4)获取文件的后缀:"+FilenameUtils.getExtension(fileFullName));  
        System.out.println("(5)获取文件的完整目录:"+FilenameUtils.getFullPath(fileFullName));  
        System.out.println("(6)获取文件的目录不包含结束符:"+FilenameUtils.getFullPathNoEndSeparator(fileFullName));  
        System.out.println("(7)获取文件名称,包含后缀:"+FilenameUtils.getName(fileFullName));  
        System.out.println("(8)去除前缀的路径:"+FilenameUtils.getPath(fileFullName));   
        System.out.println("(9)去除前缀并结尾去除分隔符:"+FilenameUtils.getPathNoEndSeparator(fileFullName));  
        System.out.println("(10)获取前缀:"+FilenameUtils.getPrefix(fileFullName));  
        System.out.println("(11)获取前缀长度:"+FilenameUtils.getPrefixLength(fileFullName));  
        System.out.println("(12)获取最后一个.的位置:"+FilenameUtils.indexOfExtension(fileFullName));  
        System.out.println("(13)获取最后一个/的位置:"+FilenameUtils.indexOfLastSeparator(fileFullName));  
        System.out.println("(14)获取当前系统格式化路径:"+FilenameUtils.normalize(fileFullName));  
        System.out.println("(16)获取当前系统无结尾分隔符的路径:"+FilenameUtils.normalizeNoEndSeparator(fileDirectory));  
        System.out.println("(17)获取linux系统无结尾分隔符的路径:"+FilenameUtils.normalizeNoEndSeparator(fileDirectory));  
        System.out.println("(18)移除文件的扩展名:"+FilenameUtils.removeExtension(fileFullName));  
        System.out.println("(19)转换分隔符为当前系统分隔符:"+FilenameUtils.separatorsToSystem(fileFullName));  
        System.out.println("(20)转换分隔符为linux系统分隔符:"+FilenameUtils.separatorsToUnix(fileFullName));  
        System.out.println("(21)转换分隔符为windows系统分隔符:"+FilenameUtils.separatorsToWindows(fileFullName));  
        System.out.println("(22)判断目录下是否包含指定文件或目录:"+FilenameUtils.directoryContains(fileDirectory, fileName));  
        String linuxFileName = FilenameUtils.normalize(fileFullName);  
        System.out.println("(23)判断文件路径是否相同:"+FilenameUtils.equals(fileFullName, linuxFileName));  
        System.out.println("(24)判断文件路径是否相同,格式化并大小写不敏感:"+FilenameUtils.equals(fileFullName,   
                FilenameUtils.normalize(fileFullName),true,IOCase.INSENSITIVE));  
        System.out.println("(25)判断文件路径是否相同,格式化并大小写敏感:"   
                + FilenameUtils.equalsNormalized(fileFullName, linuxFileName));  
        System.out.println("(26)判断文件路径是否相同,不格式化,大小写敏感根据系统规则:windows:敏感;linux:不敏感:"  
                + FilenameUtils.equalsOnSystem(fileFullName, linuxFileName));   
        List<String> extensions = new ArrayList<>();    
        extensions.add("txt");    
        extensions.add("java");   
        System.out.println("(27)判断文件扩展名是否包含在指定集合中:"  
                + FilenameUtils.isExtension(fileFullName, extensions));   
        System.out.println("(28)判断文件扩展名是否等于指定扩展名:"   
                + FilenameUtils.isExtension(fileFullName, "txt"));  
        System.out.println("(29)判断文件扩展名是否包含在指定字符串数组中:"   
                + FilenameUtils.isExtension(fileFullName, new String[]{"txt","java"}));  
        System.out.println("(30)判断文件扩展名是否和指定规则匹配,大小写敏感:"  
                + FilenameUtils.wildcardMatch(fileName, "*.???"));   
        System.out.println("(31)判断文件扩展名是否和指定规则匹配,大小写不敏感:"   
                + FilenameUtils.wildcardMatch(fileName, "*.???",IOCase.INSENSITIVE));  
        System.out.println("(32)判断文件扩展名是否和指定规则匹配,根据系统判断敏感型:windows:不敏感;linux:敏感:"   
                + FilenameUtils.wildcardMatchOnSystem(fileName, "*.???"));  
          
    }  
}  
  • 打印结果
(1)显示linux路径:\D:\aa\bb\cc\file.txt  
(2)合并目录和文件名为文件全路径:\D:\aa\bb\cc\file.txt  
(3)文件路径去除目录和后缀后的文件名:file  
(4)获取文件的后缀:txt  
(5)获取文件的完整目录:/D:/aa/bb/cc/  
(6)获取文件的目录不包含结束符:/D:/aa/bb/cc  
(7)获取文件名称,包含后缀:file.txt  
(8)去除前缀的路径:D:/aa/bb/cc/  
(9)去除前缀并结尾去除分隔符:D:/aa/bb/cc  
(10)获取前缀:/  
(11)获取前缀长度:1  
(12)获取最后一个.的位置:17  
(13)获取最后一个/的位置:12  
(14)获取当前系统格式化路径:\D:\aa\bb\cc\file.txt  
(16)获取当前系统无结尾分隔符的路径:\D:\aa\bb\cc  
(17)获取linux系统无结尾分隔符的路径:\D:\aa\bb\cc  
(18)移除文件的扩展名:/D:/aa/bb/cc/file  
(19)转换分隔符为当前系统分隔符:\D:\aa\bb\cc\file.txt  
(20)转换分隔符为linux系统分隔符:/D:/aa/bb/cc/file.txt  
(21)转换分隔符为windows系统分隔符:\D:\aa\bb\cc\file.txt  
(22)判断目录下是否包含指定文件或目录:false  
(23)判断文件路径是否相同:false  
(24)判断文件路径是否相同,格式化并大小写不敏感:true  
(25)判断文件路径是否相同,格式化并大小写敏感:true  
(26)判断文件路径是否相同,不格式化,大小写敏感根据系统规则:windows:敏感;linux:不敏感:false  
(27)判断文件扩展名是否包含在指定集合中:true  
(28)判断文件扩展名是否等于指定扩展名:true  
(29)判断文件扩展名是否包含在指定字符串数组中:true  
(30)判断文件扩展名是否和指定规则匹配,大小写敏感:true  
(31)判断文件扩展名是否和指定规则匹配,大小写不敏感:true  
(32)判断文件扩展名是否和指定规则匹配,根据系统判断敏感型:windows:不敏感;linux:敏感:true

1.修改apk扩展名 .zip
2.解压,找到META-INF目录
3.java环境下执行如下命令:

命令:keytool -printcert -file xxx/META-INF/CERT.RSA //xxx文件所在路径
例如:keytool -printcert -file F:\Test\META-INF/CERT.RSA

41341-3oqr4f1p3o9.png

如果证书指纹跟官方一致,则说明apk没有经过二次封装,安全可用。

各文件介绍

(1)MANIFEST.MF:这是摘要文件。程序遍历Apk包中的所有文件(entry),对非文件夹非签名文件的文件,逐个用SHA1生成摘要信息,再用Base64进行编码。如果你改变了apk包中的文件,那么在apk安装校验时,改变后的文件摘要信息与MANIFEST.MF的检验信息不同,于是程序就不能成功安装。

说明:这是Android签名验证过程的第一步,保证每个APK包内的每个文件与MANIFEST.MF中的摘要值一一对应,修改某个文件内容,必须修改MANFEST.MF文件中的摘要值,使他们对应起来。
(2)CERT.SF:这是对摘要的签名文件。对前一步生成的MANIFEST.MF,对MANIFEST.MF中的每一条内容分别进行SHA1计算,然后再用Base64编码转换。此外,把MANIFEST.MF的内容也进行SHA1计算,并且计算BASE64编码。将上述内容写入CERT.SF文件中。

说明:这是签名认证过程的第二步,这一步做的是多第一步得到的签名文件的摘要,比如第一步中对文件和MANIFEST.MF摘要都改了,这一步中MANIFEST.MF的摘要值也要修改,否则就对应不起来。
所以,前面这两步,做的都是摘要,是为第三步骤做准备的,第三步骤才是最重要的。
(3)CERT.RSA文件中保存了公钥、所采用的加密算法等信息,此外重要的,还包括对CERT.SF中的内容的用私钥进行加密之后的值。
说明:在这一步,即使开发者修改了程序内容,并生成了新的摘要文件,MANIFEST.MF能与内容对应起来,CERT.SF也能与内容对应起来,但是攻击者没有开发者的私钥,所以不能生成正确的签名文件(CERT.RSA)。系统在对程序进行验证的时候,用开发者公钥对不正确的签名文件进行解密,得到的结果对应不起来,所以不能通过检验,不能成功安装文件。
结论:从上面的总结可以看出,META-INFO里面的说那些文件环环相扣,从而保证Android程序的安全性。(只是防止开发者的程序不被攻击者修改,如果开发者的公私钥对对攻击者得到或者开发者开发出攻击程序,Android系统都无法检测出来。)

免责声明
本博客部分内容来自于互联网,不代表作者的观点和立场,如若侵犯到您的权益,请联系[email protected]。我们会在24小时内进行删除。