首页 文章 精选 留言 我的

精选列表

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

Spring Boot基础教程9-web应用开发-错误处理

一.错误的处理 方法一:Spring Boot 将所有的错误默认映射到/error, 实现ErrorController @Controller @RequestMapping(value = "error") public class BaseErrorController implements ErrorController { private static final Logger logger = LoggerFactory.getLogger(BaseErrorController.class); @Override public String getErrorPath() { logger.info("出错啦!进入自定义错误控制器"); return "error/error"; } @RequestMapping public String error() { return getErrorPath(); } } 方法二:添加自定义的错误页面 2.1 html静态页面:在resources/public/error/ 下定义 如添加404页面: resources/public/error/404.html页面,中文注意页面编码 2.2 模板引擎页面:在templates/error/下定义 如添加5xx页面: templates/error/5xx.ftl 注:templates/error/ 这个的优先级比较 resources/public/error/高 方法三:使用注解@ControllerAdvice /** * 统一异常处理 * * @param exception * exception * @return */ @ExceptionHandler({ RuntimeException.class }) @ResponseStatus(HttpStatus.OK) public ModelAndView processException(RuntimeException exception) { logger.info("自定义异常处理-RuntimeException"); ModelAndView m = new ModelAndView(); m.addObject("roncooException", exception.getMessage()); m.setViewName("error/500"); return m; } /** * 统一异常处理 * * @param exception * exception * @return */ @ExceptionHandler({ Exception.class }) @ResponseStatus(HttpStatus.OK) public ModelAndView processException(Exception exception) { logger.info("自定义异常处理-Exception"); ModelAndView m = new ModelAndView(); m.addObject("roncooException", exception.getMessage()); m.setViewName("error/500"); return m; }

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

独家 | 手把手教你用Python进行Web抓取(附代码)

作为一名数据科学家,我在工作中所做的第一件事就是网络数据采集。使用代码从网站收集数据,当时对我来说是一个完全陌生的概念,但它是最合理、最容易获取的数据来源之一。经过几次尝试,网络抓取已经成为我的第二天性,也是我几乎每天使用的技能之一。 在本教程中,我将介绍一个简单的例子,说明如何抓取一个网站,我将从Fast Track上收集2018年百强公司的数据: Fast Track: http://www.fasttrack.co.uk/ 使用网络爬虫将此过程自动化,避免了手工收集数据,节省了时间,还可以让所有数据都放在一个结构化文件中。 用Python实现一个简单的网络爬虫的快速示例,您可以在GitHub上找到本教程中所介绍的完整代码。 GitHub链接: https://github.com/kaparker/tutorials/blob/maste

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

Python全栈 Web(基于Flask框架的完整项目、项目搭建)

个人博客项目 前端模板目录结构 将动态网页放在templates模板目录中 将静态文件以及静态页面放在static目录中 项目的整体效果 搭建后端Flask项目 数据库的建模 初始化数据库 1 创建项目数据库 2 将构建好的表进行初始化 输入密码即可导入 验证数据库 blog.sql文件 /* Navicat MySQL Data Transfer Source Server : localhost Source Server Version : 50721 Source Host : localhost:3306 Source Database : blog Target Server Type : MYSQL Target Server Version : 50721 File

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

基于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个数字的所有字符串。

资源下载

更多资源
Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

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等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册