一切福田,不離方寸,從心而覓,感無不通。

基础组件 —— 路由

路由入门 最基本的 Laravel 路由只接收一个 URI 和一个闭包,并以此为基础提供一个非常简单优雅的路由定义方法:

我们以在安装配置文档中新建的 blog 应用为例,在 routes/web.php 中定义该路由:  在浏览器中通过 http://blog.test/hello (我使用 Valet 作为开发环境,故而对应域名是 blog.test,实际域名以自己配置的为准)即可访问我们刚刚定义的路由,页面输出内容如下:

默认路由文件 所有 Laravel 路由都定义在位于 routes 目录下的路由文件中,这些文件通过框架自动加载,相应逻辑位于 app/Providers/RouteServiceProvider 类。routes/web.php 文件定义了 Web 界面的路由,这些路由被分配到了 web 中间件组,从而可以使用 Session 和 CSRF 保护等功能。routes/api.php 中的路由是无状态的,这是因为被分配到了 api 中间件组。 对大多数应用而言,都是从 routes/web.php 文件开始定义路由。定义在 routes/web.php 中的路由可以通过在浏览器地址栏输入相应的 URL 进行访问,例如,你可以通过 http://blog.test/user 访问下面的路由:

正如前面所提到的,定义在 routes/api.php 文件中的路由通过 app/Providers/RouteServiceProvider 的处理被嵌套在一个路由群组中, 在这个群组中,所有路由会被自动添加 /api 前缀,所以你不需要再到路由文件中为每个路由手动添加,你可以通过编辑 RouteServiceProvider 类来修改路由前缀以及其他的路由群组选项:  有效的路由方法 我们可以注册路由来响应任何 HTTP 请求动作:

有时候还需要注册一个路由响应多种 HTTP 请求动作 —— 这可以通过 match 方法来实现。或者,可以使用 any 方法注册一个路由来响应所有 HTTP 请求动作:

测试 GET 请求的时候直接在浏览器中输入请求地址即可,测试 POST 请求可以通过客户端工具,比如 Advanced REST Client,该工具可以在 Chrome 应用商店下载到,此外如果上面的路由是定义在 routes/web.php 的话,在测试 POST 请求之前,需要将对应路由取消 CSRF 保护检查,否则会返回 419 状态码导致无法请求成功,取消的方法是在 app/Http/Middleware/VerifyCsrfToken 中设置排除检查路由:  下面我们来测试下 POST 请求:  如果路由是定义在 routes/api.php 的话,则无需关注 CSRF 保护问题,比如我们在 routes/api.php 定义 bar 路由,并且在 VerifyCsrfToken 的 $except 属性数组中移除 bar,然后我们测试下对 http://blog.test 的 POST 请求: 正如我们所预测的,完全没有任何问题,背后的原因是因为 web 路由文件中定义的路由都位于 web 中间件群组,该群组默认启用 CSRF 保护检查,而 api 路由文件位于 api 路由群组,该群组下的路由主要用于 第三方 API 请求,没办法进行 CSRF 检查,所以不需要做任何处理。 CSRF 保护 在 routes/web.php 路由文件中所有请求方式为 PUT、POST 或 DELETE 的路由对应的 HTML 表单都必须包含一个 CSRF 令牌字段,否则,请求会被拒绝。关于 […]

龙生   12 Apr 2018
View Details

Laravel 5.1 中路由绑定 Controller 包含子目录写法

StackOverFlow【已答复】:How to put controller inside folder in laravel 5.1.3? 【可以使用命令在项目根目录一键创建 php artisan make:controller 目录名/控制器名 --plain (是小写 php,CSDN…我服)】 【执行后可以省去 1-5 步】 首先在 /app/Http/Controllers 下新建目录,如 User User 内新建 PHP 控制器文件,如 UserController.php 此时命名空间应当是这样的: namespace App\Http\Controllers\User; 【!重点!】 namespace 下必需含有:use App\Http\Controllers\Controller; 类名没有什么好说的,class UserController extends Controller 写一个方法到控制器内,如:public function papapa(){return 'papapa'} 回到 /app/Http/routes.php 文件,绑定控制器:Route::get ( '/user', 'User\UserController@papapa' );搞定。 看了下 StackOverFlow,有一个说法是创建好目录,然后直接写不包含路径的路由,最后在项目目录执行 composer dump-autoload 即可。【测试无效】 对了,还可以用路由群组的形式绑定:

from:https://blog.csdn.net/maxsky/article/details/54017981

龙生   12 Apr 2018
View Details

session fixation攻击

什么是session fixation攻击 Session fixation有人翻译成“Session完成攻击”[1],实际上fixation是确知和确定的意思,在此是指Web服务的会话ID是确知不变的,攻击者为受害着确定一个会话ID从而达到攻击的目的。在维基百科中专门有个词条Session fixation,在此引述其攻击情景,防范策略参考原文。 攻击情景 原文中Alice是受害者,她使用的一个银行网站http://unsafe/存在session fixation漏洞,Mallory是攻击者,他想盗窃Alice的银行中的存款,而Alice会点击Mallory发给她的网页连接(原因可能是Alice认识Mallory,或者她自己的安全意识不强)。 攻击情景1:最简单:服务器接收任何会话ID 过程如下: Mallory发现http://unsafe/接收任何会话ID,而且会话ID通过URL地址的查询参数携带到服务器,服务器不做检查 Mallory给Alice发送一个电子邮件,他可能假装是银行在宣传自己的新业务,例如,“我行推出了一项新服务,率先体验请点击:http://unsafe/?SID=I_WILL_KNOW_THE_SID",I_WILL_KNOW_THE_SID是Mallory选定的一个会话ID。 Alice被吸引了,点击了 http://unsafe/?SID=I_WILL_KNOW_THE_SID,像往常一样,输入了自己的帐号和口令从而登录到银行网站。 因为服务器的会话ID不改变,现在Mallory点击 http://unsafe/?SID=I_WILL_KNOW_THE_SID 后,他就拥有了Alice的身份。可以为所欲为了。 攻击情景2:服务器产生的会话ID不变 过程如下: Mallory访问 http://unsafe/ 并获得了一个会话ID(SID),例如服务器返回的形式是:Set-Cookie: SID=0D6441FEA4496C2 Mallory给Alice发了一个邮件:”我行推出了一项新服务,率先体验请点击:http://unsafe/?SID=0D6441FEA4496C2" Alice点击并登录了,后面发生的事与情景1相同 攻击情景3:跨站cookie(cross-site cooking) 利用浏览器的漏洞,即使 http://good 很安全,但是,由于浏览器管理cookie的漏洞,使恶意网站 http://evil/ 能够向浏览器发送 http://good 的cookie。过程如下: Mallory给Alice发送一个邮件“有个有趣的网站:http://evil 很好玩,不妨试试” Alice访问了这个链接,这个网站将一个会话ID取值为I_WILL_KNOW_THE_SID 的 http://good/ 域的cookie设置到浏览器中。 Mallory又给Alice发了个邮件:“我行推出了一项新服务,率先体验请点击:http://good/” 如果Alice登录了,Mallory就可以利用这个ID了 from:http://www.360doc.com/content/11/1028/16/1542811_159889635.shtml

龙生   11 Apr 2018
View Details

设置redis访问密码

在服务器上,这里以linux服务器为例,为redis配置密码。 1.第一种方式 (当前这种linux配置redis密码的方法是一种临时的,如果redis重启之后密码就会失效,) (1)首先进入redis,如果没有开启redis则需要先开启: [root@iZ94jzcra1hZ bin]# redis-cli -p 6379 127.0.0.1:6379> (2)查看当前redis有没有设置密码: 127.0.0.1:6379> config get requirepass 1) "requirepass" 2) "" (3)为以上显示说明没有密码,那么现在来设置密码: 127.0.0.1:6379> config set requirepass abcdefg OK 127.0.0.1:6379> (4)再次查看当前redis就提示需要密码: 127.0.0.1:6379> config get requirepass (error) NOAUTH Authentication required. 127.0.0.1:6379> 2.第二种方式 (永久方式) 需要永久配置密码的话就去redis.conf的配置文件中找到requirepass这个参数,如下配置: 修改redis.conf配置文件 # requirepass foobared requirepass 123   指定密码123 保存后重启redis就可以了   连接redis 1.redis-cli连接redis [root@iZ2ze3zda3caeyx6pn7c5zZ bin]# redis-cli 127.0.0.1:6379> keys * (error) NOAUTH Authentication required. 127.0.0.1:6379> auth 123        //指定密码 OK 127.0.0.1:6379> keys * 1) "a" 2) "cit" 3) "clist" 4) "1" 127.0.0.1:6379>   2.Jedis连接redis java 代码方式 //连接redis服务器,192.168.0.100:6379 jedis = […]

龙生   11 Apr 2018
View Details

laravel 如何引入自己的函数或类库

例如在app下建一个Common文件夹 在Common下建一个function.php 放入公共函数

from:https://blog.csdn.net/u010957293/article/details/52137241

龙生   10 Apr 2018
View Details

验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保

验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.Web.HttpException: 验证视图状态 MAC 失败。如果此应用程序由网络场或群集承载,请确保 <machineKey> 配置指定了相同的 validationKey 和验证算法。不能在群集中使用 AutoGenerate。 分析: 分析后找到了问题的根源。首先,文章中提到,如果用GridView,并且指定了DataKeyNames属性,则出于安全的理由(因为DataKeyNames指定的字段代表数据的主键,且该主键值需要保存在视图状态中发送到客户端,用户如果篡改主键值,会导致安全问题),GridView会要求加密视图状态。为此会自动在页面表单</forms>之前添加一个

。 然而,Atlas的UpdatePanel要求放置在<form></form>内部,也就是</form>之前。这就意味着添加的隐藏input控件没有被放置在UpdatePanel内,而是放置在UpdatePanel和</form>之间。 当UpdatePanel更新时,UpdatePanel内部的控件被提交到服务器进行处理(Patrial Rendering),而整个页面并没有被提交。也就是说隐藏的input控件没有随着一起提交。因此服务器并不知道提交的ViewState被加密了,从而导致MAC验证错误。 解决方法有二,仅供参考: 1.可以在当前页面的<page …>里加两个属性: enableEventValidation="false" viewStateEncryptionMode ="Never" 2.当然还可以在web.config里加入:(<system.web>之间)

其余方法 在web.config中的pages节点上添加enableviewstatemac=false 附带: 一般而言是因为你的某些操作修改了视图状态,我猜测你可能使用了ajax并在客户端用javascript动态添加了某些项 1. 在出错页面的 <%@ page %>中加enableviewstatemac="false"无效。 2. 在web.config的 <system.web>节中加

我的问题是加入:

解决 最重要的是检查自己的页面,很可能是你的页面中的问题,多注意下,肯定能发现问题,而这个问题并没有报出你想要的错误 !!! 所以,不一定所有的解决方案都适合你!!!   from:https://www.cnblogs.com/Setme/archive/2012/06/05/2537084.html

龙生   08 Apr 2018
View Details

GitHub 上最受欢迎的 5 大 Java 项目

本文列举了 GitHub 上最受欢迎的 5 个 Java 项目,从 Mockitos 到 Guava,以及 java-design-patterns 等。 GitHub 上有大约有 744K 多的 Java 项目,但是最让开发人员感兴趣的有哪些项目? 1. Mockito Mockito 并不是无酒精混合饮料的意思。Mockito 是一个针对 Java 的 mocking 框架。它与 EasyMock 和jMock 很相似,但是通过在执行后校验什么已经被调用,它消除了对期望行为(expectations)的需要。其它的 mocking 库需要你在执行前记录期望行为(expectations),而这导致了丑陋的初始化代码。 Mockito 2.0 为高级框架集成提供了更好的 API。这不是针对编写单元测试的用户,而是针对需要使用定制逻辑扩展或包装 Mockito 的其他测试工具和模拟框架。 2. java-design-patterns java-design-patterns 这个项目在不断的完善,正是因为如此,java-design-patterns 允许开发人员用Java 实现设计模式。设计模式是帮助开发人员在设计应用程序或系统时解决常见问题的正式最佳实践。它们通过提供经过验证和验证的开发范例来帮助加快开发进程。此外,重复使用模式可以帮助防止小的错位问题成为大问题。 3. RxJava RxJava 是 GitHub 上最受欢迎的 Java 项目之一,也是一个流行的框架。基于 ReactiveX API,RxJava 是一个用于使用 Java VM 的可观察序列编写异步和基于事件的程序的库。 RxJava 扩展了观察者模式用以支持数据和事件序列。它还增加了运算符,允许开发人员声明性地组合序列的同时,抽象出对低级线程,同步,线程安全和并发数据结构等问题的关注。 4. MpAndroidChart MPAndroidChart 是一个功能强大且易于使用的  Android 图表库,可在 API 8 及更高版本上运行。使用 MPAndroidChart,开发人员可以为 Android 应用程序绘制各种图形。 MPAndroidChart 被视为移动开发人员的数据可视化工具,得到了 ’em:LineChart,BarChart(垂直,水平,堆叠,分组),PieChart,ScatterChart,CandleStickChart(用于财务数据),RadarChart(蜘蛛网图),BubbleCharts 和组合图。 5. Guava Guava 中文是石榴的意思,该项目是 Google 的一个开源项目,包含许多 Google 核心的 Java 常用库。它仍然是一个对开发人员非常有用的开源工具。Java 语言的基本实用程序使用起来更加方便,扩展了JDK 集合生态系统。不仅如此,它允许开发人员在 ComparisonChain 中将收集的内容与非常先进的排序功能进行比较。 来自:jaxenter   from:https://www.oschina.net/news/94928/top-5-most-popular-java-projects-github

龙生   07 Apr 2018
View Details

SQL优化的一些实用方法

1、任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的。因为只有该字段中有null值,即使创建了索引其实也 是没有用的,所以创建索引应该在有值的字段上创建; 2、使用该sql语句将不会使用索引:select * from employee where last_name like ‘%cliton%'; 这样的话会使用索引:     select * from employee where last_name like ‘cliton%'; 3、Order by语句 ORDER BY语句决定了Oracle如何将返回的查询结果排序。Order by语句对要排序的列没有什么特别的限制,也可以将函数加入列中(象联接或 者附加等)。任何在Order by语句的非索引项或者有计算表达式都将降低查询速度。仔细检查order by语句以找出非索引项或者表达式,它们 会降低性能。解决这个问题的办法就是重写order by语句以使用索引,也可以为所使用的列建立另外一个索引,同时应绝对避免在order by 子句中使用表达式。 4、 选择最有效率的表名顺序(只在基于规则的优化器中有效): ORACLE 的解析器按照从右到左的顺序处理FROM子句中的表名,FROM子句中写在最后的表(基础表 driving table)将被最先处理,在FROM子句 中包含多个表的情况下,你必须选择记录条数最少的表作为基础表。如果有3个以上的表连接查询, 那就需要选择交叉表(intersection table)作为基础表, 交叉表是指那个被其他表所引用的表. 5、 SELECT子句中避免使用 ‘ * ‘: ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间 6、 减少访问数据库的次数,能使用一条sql语句查询出来的最好使用一条语句直接查询出来。  整合简单,无关联的数据库访问: 如果你有几个简单的数据库查询语句,你可以把它们整合到一个查询中(即使它们之间没有关系) 7、通过内部函数提高SQL效率.: 复杂的SQL往往牺牲了执行效率. 能够掌握上面的运用函数解决问题的方法在实际工作中是非常有意义的 8、 使用表的别名(Alias): 当在SQL语句中连接多个表时, 请使用表的别名并把别名前缀于每个Column上.这样一来,就可以减少解析的时间并减少那些由Column歧义引起 的语法错误. 9、 用EXISTS替代IN、用NOT EXISTS替代NOT IN: 在许多基于基础表的查询中,为了满足一个条件,往往需要对另一个表进行联接.在这种情况下, 使用EXISTS(或NOT EXISTS)通常将提高查询的 效率. 在子查询中,NOT IN子句将执行一个内部的排序和合并. 无论在哪种情况下,NOT IN都是最低效的 (因为它对子查询中的表执行了一个 全表遍历). 为了避免使用NOT IN ,我们可以把它改写成外连接(Outer Joins)或NOT EXISTS. 例: […]

龙生   07 Apr 2018
View Details

Shell入门看我吧

背景 之前写了系列的shell实战的文章,得到了挺多小伙伴的关注,遇到有些对shell不太熟悉小伙伴,所以有个想法写一篇shell入门的文章。 时间流逝,再回头去看看过去的东西,才会发现哪些东西比较重要,故撰此文,记录我在过去学习和使用shell语言过程中我个人觉得比较重要的部分,做一个小总结和分享。 文章中使用到的代码位置:https://gitee.com/dhar/YTTInjectedContentKit/tree/master/DevPods/InjectedContentKit/Example/injectContentShell 和 https://gitee.com/dhar/ShellLearning/tree/master/helloshell 文章内容结构如下: 语法 变量 打印 运算 控制 循环 容器 方法 文件 文件读取 文件写入 sed流编辑 模块 工具模块 流程模块 输入和菜单 获取输入 菜单 语法 变量 变量的定义 定义一个变量和其他语言的类似,shell是弱类型语言所以不需要使用类型限定,并且变量可以修改类型,下面的例子定义了一个字符串类型的str变量,之后修改为数值类型 注意点:变量等号两边不能有空格出现

  变量使用 变量可以赋值给另一个变量和打印,当变量被使用的时候需要在变量名称前面加上$符号,还有另一种方式是把变量名放在${}括号中使用,可以把命令执行结果作为右值赋值给变量

  打印 因为shell没有单步调试和其他功能强大的IDE,所以打印功能就经常使用到,此外打印功能还可以当做函数的返回值,比return作为函数的返回值功能更强大,shell 使用echo打印,内容默认输出到控制台中,echo可以打印字符串、变量、以及字符串中嵌入变量的混个内容,echo有几重要的参数选项 -e 转义字符处理,比如\t显示为制表符而不是显示输出\t -n 把文本字符串和命令输出显示在同一行中

  运算 使用expr执行算术运算 注意点:*乘法运算符号需要转义

  使用[]执行算术 []执行算术比expr简单多了,并且*乘法运算符号不需要转义

  控制 数值比较 控制使用if/else/fi语法,典型的数值比较如下

  还可以使用下面的比较符号: 比较符 描述 n1 -eq n2 检查n1是否与n2相等 n1 -ge n2 检查n1是否大于或等于n2 n1 -gt n2 检查n1是否大于n2 n1 -le n2 检查n1是否小于或等于n2 n1 -lt n2 检查n1是否小于n2 n1 -ne n2 检查n1是否不等于n2 一个简单的9*9乘法口诀表的例子

[…]

龙生   07 Apr 2018
View Details

Lua

Lua  是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。 Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。 Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。  Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。 一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。

龙生   07 Apr 2018
View Details