一、NSURLProtocol 详解
初衷是为了让 UIWebView可以拦截 Ajax请求。研究了一番找到了 NSURLProtocol。
NSURLProtocol是属于 Foundation框架里的 URL Loading System的一部分,它是一个抽象类,不能去实例化它,只能子类化NSURLProtocol,然后使用的时候注册子类。一个相对晦涩难解的类。
那么如果开发者自定义的一个 NSURLProtocol并且注册到 app中,那么在这个自定义的 NSURLProtocol中我们可以拦截所有的请求,进行修改,或者修改 response。
NSHipster上说:「或者这么说吧: NSURLProtocol就是一个苹果允许的中间人攻击。」
由于 NSURLProtocol是一个抽象类,所以使用的时候必须定义一个它的子类:
NSURLConnection发起请求的时候,会让所有已注册的 URLProtocol来“审批”这个请求
注意:如果是基于 NSURLSession进行的请求,注册的时候需要注册到 NSURLSessionConfiguration中:
记得用完之后注销:
注册成功之后,就需要我们的子类去实现抽象方法:
用来审批的方法。
前面说到「NSURLConnection发起请求的时候,会让所有已注册的 URLProtocol来“审批”这个请求」。这里返回NO代表放过这个请求,不作处理。返回YES,代表需要处理,则会进入后续的流程。
注意:这里需要放过已经处理过的请求:
这个方法用来统一处理请求 request对象的,可以修改头信息,或者重定向。没有特殊需要,则直接return request;
如果要在这里做重定向以及头信息的时候注意检查是否已经添加,因为这个方法可能被调用多次,也可以在后面的方法中做。
判断网络请求是否一致,一致的话使用缓存数据。没需要就调用 super的方法。
子类中最重要的方法就是-startLoading和-stopLoading,实现请求和取消流程。不同的自定义子类在调用这两个方法是会传入不同的内容,但共同点都是要围绕 protocol客户端进行操作。
可以在这里修改请求信息,重定向,DNS解析,返回自定义的测试数据。
重点:需要标记已经处理过的 request:
URLProtocolHandledKey是:
举例:直接在 startLoading中返回测试数据:
需要注意的是父类中有一个 client属性。
实现的协议<NSURLProtocolClient>如下:
对于需要处理的 connection,可以在下的 NSURLConnectionDataDelegate中进行操作:
如果我们顺序注册 A B C三个 Protocol,那么一个 connection在发送的时候,处理的顺序是 C B A,而且最多只有一个 Protocol会触发处理。
拦截 UIWebview的请求,会有被拒的风险。
注意标记处理过的,具体做法在本文搜关键词 URLProtocolHandledKey。
二、英语Duplicate Session怎么翻译
Duplicate Session
重复会话
以下是这个英语词组的详细解析,希望能够帮助到你。
1、含义解释:
指在同一时间内打开了多个相同的会话窗口或者多次登录同一账号的操作。
2、难词解释:
Duplicate [ˈduːplɪkeɪt]
动词,意为“**;重复;复刻”。
Session [ˈseʃn]
名词,意为“会话;会议;学期”。
具体双语用例:
- Please don't duplicate the file, just send me the original.
(请不要**这个文件,发给我原始文件。)
- I had a session with my boss this morning.
(今天早上我和我的老板开了个会话。)
3、语法详解:
由两个单词组成的动词短语,其中 Duplicate是动词,Session是名词,表示对会话进行了重复的操作。
4、具体用法:
- I accidentally opened a duplicate session in my browser and it slowed down my computer.
(我不小心在浏览器中打开了一个重复的会话,导致电脑变慢了。)
- The system won't allow you to have duplicate sessions for security reasons.
(出于安全考虑,系统不允许你有重复的会话。)
- If you have a duplicate session, please close it before opening a new one.
(如果你有重复的会话,请在打开新会话之前关闭它。)
- The IT department has been working on fixing the duplicate session issue for weeks.
(IT部门已经花了几周时间修复重复会话的问题。)
- The user manual explains how to avoid duplicate sessions and the consequences of having them.
(用户手册解释了如何避免重复会话以及它们的后果。)
翻译技巧:
翻译这句英语时,需要先理解其中的两个单词的含义,再根据上下文确定具体的含义。
如果是在使用电脑或网络时出现了此类提示,那么就可以确定是关于会话窗口或账号登录时的重复操作。
此外,需要注意区分这个词汇与其他类似的词汇,如 replication、repetition等。
在翻译时,可以根据上下文和语境,选择合适的翻译方式,如“重复会话”、“会话重复”、“重复登录”、“登录重复”等。
注意事项是需要根据上下文确定具体含义,避免误解。
这句英语是关于会话操作的提示,需要根据上下文和语境确定具体含义,翻译时需要注意选择合适的翻译方式。
三、servlet下怎样使用session,重点是向session传值!
Session基于Cookie技术,Session保存在服务器端(一般会设置有效期),SessionID保存在客户端.Session里面保存!!若干个!!!"键-值"对,可以通过 void setAttribute(java.lang.String name, java.lang.Object value)来修改/添加
HttpSession session= request.getSession();
session.setAttribute("abc",new Integer(567));//新增属性键:abc值:new Integer(567)
session.setAttribute("jkl",new Person());//新增属性键:jkl值:new Person()
session.setAttribute("abc",new Double(5.67));//已经存在键abc,将会修改该键对应的值
Session本质上也是一组"键-值"对其中的"键"保存在客户端(钥匙)是字符串其中的"值"保存在服务器端(保险箱)可以是Object类型
sessionID与session的关系:钥匙与银行保险箱钥匙在客户端保险箱在服务器端
URL重写:解决了关闭浏览器cookie产生的问题
!!!!!!!!!!!!!Session在关闭浏览器时会失效,在下次访问时不能获得同一个Session了
实例:
package chap03;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class GetSession extends HttpServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException
{
response.setContentType("text/html;charset=GBK");
PrintWriter out= response.getWriter();
String user="";
//此处不新建session,只是去取已经创建的session
HttpSession session= request.getSession(false);
//如果session能够取到,说明用户已经登录
if(session!=null)
{
user=(String)session.getAttribute("abc");
out.println("获得创建的Session");
out.println("<BR>");
out.println("登录名:"+user);
}
//否则,说明用户没有登录,跳转到登录页面让用户登录
else
{
response.sendRedirect("../SessionLogin.htm");
}
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException
{
doGet(request,response);
}
}
package chap03;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SaveInfo extends HttpServlet
{
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException
{
//验证登录者身份,验证过程此处省略
//如果合法用户就产生一个session来放置其登录名
//如果用户输入了用户名,则将其放在session中
if(request.getParameter("userName")!=null)
{
HttpSession session= request.getSession();//没有Session就新建一个
session.setAttribute("abc",
request.getParameter("userName"));//在服务器端存储"键-值对"
}
response.setContentType("text/html;charset=GBK");
PrintWriter out= response.getWriter();
out.println("Session已经创建");
out.println("<BR>");
out.println("转到其他<A HREF=\"chap03.GetSession\">页面</A>");
}
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws ServletException,IOException
{
doGet(request,response);
}
}
文章到此结束,希望我们对于Session详解(重点)的问题能够给您带来一些启发和解决方案。如果您需要更多信息或者有其他问题,请随时联系我们。