java 请求url加时间戳有什么用

1.由于浏览器会对同一 url 的图像进行缓存,向减少服务器端的请求次数,提高浏览性能

随机数就是让每次点击刷新验证码的时候请求的 URL 路径都不同。告诉浏览器上个图片已经失效了,需要重新向服务器上请求新的图片信息。这样才能实现每次点击都会刷新验证码的效果,否则只有在页面刷新的时候验证码才会变,或者点击一次之后就不再变了,而这并不是我们想要的效果。

2.加时间戳是为了防止有些浏览器(IE等)偷懒不发送请求,直接匹配URL是否一致,一致就从缓存读取数据,不一致才重新发请求

3.1,标记版本。2,防止缓存。3,特殊处理,更具后缀返回不同信息等。


  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可信时间是指一种数字签名技术,可以证明某个数字签名是在特定的时间之前完成的。Java中可以使用Bouncy Castle库来实现可信时间功能。 以下是一个简单的Java代码示例,用于生成和验证可信时间: ```java import java.io.ByteArrayOutputStream; import java.io.IOException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Security; import java.security.cert.Certificate; import java.security.cert.CertificateEncodingException; import java.security.cert.X509Certificate; import java.util.Date; import java.util.Hashtable; import java.util.Vector; import org.bouncycastle.asn1.ASN1ObjectIdentifier; import org.bouncycastle.asn1.cms.AttributeTable; import org.bouncycastle.asn1.cms.ContentInfo; import org.bouncycastle.asn1.cms.SignedData; import org.bouncycastle.asn1.cms.TimeStampToken; import org.bouncycastle.asn1.tsp.MessageImprint; import org.bouncycastle.asn1.tsp.TSTInfo; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.cms.CMSException; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.cms.CMSSignedDataGenerator; import org.bouncycastle.cms.CMSTypedData; import org.bouncycastle.cms.SignerInfoGenerator; import org.bouncycastle.cms.SignerInformation; import org.bouncycastle.cms.SignerInformationGenerator; import org.bouncycastle.cms.SignerInformationStore; import org.bouncycastle.cms.jcajce.JcaSignerInfoGeneratorBuilder; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.operator.ContentSigner; import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder; import org.bouncycastle.operator.DigestAlgorithmIdentifierFinder; import org.bouncycastle.operator.OperatorCreationException; import org.bouncycastle.operator.bc.BcDigestCalculatorProvider; import org.bouncycastle.operator.bc.BcRSAContentSignerBuilder; import org.bouncycastle.tsp.TSPException; import org.bouncycastle.tsp.TimeStampRequest; import org.bouncycastle.tsp.TimeStampRequestGenerator; import org.bouncycastle.tsp.TimeStampResponse; import org.bouncycastle.tsp.TimeStampTokenGenerator; public class TrustedTimestamp { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 输入要签名的数据 byte[] data = "Hello World".getBytes(); // 创建时间请求 TimeStampRequestGenerator reqGen = new TimeStampRequestGenerator(); reqGen.setCertReq(true); byte[] digest = getMessageDigest(data); TimeStampRequest req = reqGen.generate( new ASN1ObjectIdentifier("1.2.840.113549.1.1.5"), digest); // 发送时间请求并接收响应 byte[] tsTokenBytes = getTimestampToken(req.getEncoded()); // 解析时间响应并验证签名 TimeStampToken tsToken = new TimeStampToken(new ContentInfo( SignedData.getInstance(tsTokenBytes))); if (tsToken.isSignatureValid(new SignerInformationStore( tsToken.getSignedContent() .getContentInfo() .getContentType(), tsToken.getSignedContent() .getContentInfo() .getContent()))) { System.out.println("Timestamp signature verified."); } else { System.out.println("Timestamp signature verification failed!"); } // 验证时间中的原文摘要值与输入数据的摘要值是否一致 TSTInfo tstInfo = tsToken.getTimeStampInfo().toTSTInfo(); if (MessageDigest.isEqual(digest, tstInfo.getMessageImprint() .getHashedMessage())) { System.out.println("Message digest verified."); } else { System.out.println("Message digest verification failed!"); } } private static byte[] getMessageDigest(byte[] data) throws NoSuchAlgorithmException { MessageDigest md = MessageDigest.getInstance("SHA-256"); return md.digest(data); } private static byte[] getTimestampToken(byte[] request) throws IOException, OperatorCreationException, CertificateEncodingException, TSPException { // 时间服务URL String url = "http://timestamp.comodoca.com/authenticode"; // 时间服务用户名 String username = "username"; // 时间服务密码 String password = "password"; // 创建时间请求对象 Hashtable<String, String> headers = new Hashtable<>(); headers.put("Content-Type", "application/timestamp-query"); headers.put("Authorization", "Basic " + Base64.getEncoder().encodeToString((username + ":" + password).getBytes())); HttpTimestamper timestamper = new HttpTimestamper(url, headers); // 获取时间响应数据 TimeStampResponse response = timestamper.generateTimeStampResponse(request); // 提取时间令牌 TimeStampTokenGenerator tsTokenGen = new TimeStampTokenGenerator( new JcaSignerInfoGeneratorBuilder( new BcDigestCalculatorProvider()) .build(new BcRSAContentSignerBuilder( response.getTimeStampToken().getSignedData() .getDigestAlgorithm(), response.getTimeStampToken().getSignedData() .getEncapContentInfo() .getContentEncryptionAlgorithm()) .build(response.getTimeStampToken() .getSignerInfos() .getSigners() .iterator() .next() .getPrivateKey()))); tsTokenGen.setAccuracySeconds(1); tsTokenGen.setAccuracyMillis(0); tsTokenGen.setAccuracyMicros(0); tsTokenGen.setTSA(new X509Certificate[]{response.getTimeStampToken() .getCertificates()[0]}); return tsTokenGen.generate(new CMSProcessableByteArray(request), false).getEncoded(); } private static class HttpTimestamper { private final String url; private final Hashtable<String, String> headers; HttpTimestamper(String url, Hashtable<String, String> headers) { this.url = url; this.headers = headers; } TimeStampResponse generateTimeStampResponse(byte[] request) throws IOException, TSPException { byte[] response = post(url, request, headers); return new TimeStampResponse(response); } private static byte[] post(String url, byte[] data, Hashtable<String, String> headers) throws IOException { HttpURLConnection conn = (HttpURLConnection) new URL(url) .openConnection(); conn.setRequestMethod("POST"); conn.setDoOutput(true); conn.setUseCaches(false); conn.setRequestProperty("Content-Type", headers.get("Content-Type")); for (String key : headers.keySet()) { if (!key.equalsIgnoreCase("Content-Type")) { conn.setRequestProperty(key, headers.get(key)); } } OutputStream out = conn.getOutputStream(); out.write(data); out.close(); InputStream in = conn.getInputStream(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); byte[] buffer = new byte[8192]; int count; while ((count = in.read(buffer)) != -1) { baos.write(buffer, 0, count); } in.close(); return baos.toByteArray(); } } } ``` 代码中通过Bouncy Castle库实现了时间的生成和验证。在生成时间的过程中,需要调用时间服务的API来获取时间响应数据,并将响应数据转换为时间令牌;在验证时间的过程中,需要校验时间令牌的签名和原文摘要值。 注意,为了使用Bouncy Castle库,需要在代码中添以下语句: ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; Security.addProvider(new BouncyCastleProvider()); ``` 同时,为了使用时间服务,需要替换代码中的时间服务URL、用户名和密码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值