6.18 学习记录

安恒实习

公司项目

遇到的坑

tomcat正常启动但是无法访问页面

项目正常启动,但是在访问指定url显示404,排查了很久,发现是tomcat里的Deployment栏中,选定server后会自动填充Application context为你的server名,相当于所有的url前都要加一个server名,改为"/"解决了问题。

项目启动后点击跳转按钮后重定向过多

点击某个会重定向的按钮后报"127.0.0.1重定向次数过多"。百度了很久主要的方法是删除cookie,但是没有用。最后发现是nginx配置出问题了,代码中的redirect未跳转到新的页面后会重新进入跳转方法,造成多次重定向。

无法访问到前端页面

一开始以为是html文件没有对应上,也改了nginx配置,都没效果。后来查看docker中image的启动情况,发现项目重启失败,意识到是镜像未启动成功,查看日志后发现是配置文件出现了问题,修改后解决。

项目中防referer的实现

什么是referer

HTTP Referer是header的一部分,当浏览器向web服务器发送请求的时候,一般会带上referer,告诉服务器我是从哪个页面链接过来的。

什么是origin

为了防止CSRF的攻击,要求浏览器在发送POST请求的时候加上一个Origin字段,这个Origin字段主要是用来标识出最初请求是从哪里发起的。如果浏览器不能确定源在哪里,那么在发送的请求里面Origin字段的值就为空。

思路

使用了过滤器Filter,首先要实现Filter接口,重写他的init、doFilter、destory方法。当我们编写好Filter,并配置对哪个web资源进行拦截后,WEB服务器每次在调用web资源的service方法之前,都会先调用一下filter的doFilter方法。 doFilter方法会传递一个FilterChain对象进来,它是filter接口中最重要的一个对象,它也提供了一个doFilter方法,当调用这个方法后,web服务器才会调用web资源的service方法。

具体实现

重写的doFilter方法中,要取出request中的"referer"和"origin",和"URI",首先将uri与定义好的referer进行分段比较,如果能对应上则调用filterChain的dofilter方法并返回。然后继续判断referer和origin是否为空,若为空则设置HttpServletResponse的状态为200,返回非法请求的参数。 接下来要check上述的两个参数,判断他们是否是合法用户的ip,若是则合法,否则返回false,按上面说的在response中返回非法请求的参数。

参考资料

www.cnblogs.com/xdp-gacl/p/…

创建HTTP客户端工厂

目的

和线程池一样,提前创建好http的连接资源,这样可以减少http连接创建和销毁的开销,提升资源利用率。

项目实现

首先设置好几个变量,分别为连接池的最大连接数默认值、单个主机的最大连接数、连接超时默认时间、读取超时默认时间。然后创建HTTP客户端工厂,当未达到最大连接数默认值则创建SimpleClientHttpRequesFactory对象。然后调用HttpClientBuilder的方法创建HttpClient的对象,作为参数创建HttpCompoentsClientHttpRequestFactory的对象。然后初始化restTemplate,注意构造方法的参数就是上面这个方法创建的ClientHttpRequestFactory对象。最后加入Spring的bean工厂,由Spring统一管理。

拓展学习

BeanFactoryPostProcessor和BeanPosProcessor的原理和使用

每日一题

392.判断子序列

题目

给定字符串 s 和 t ,判断 s 是否为 t 的子序列。

你可以认为 s 和 t 中仅包含英文小写字母。字符串 t 可能会很长(长度 ~= 500,000),而 s 是个短字符串(长度 <=100)。

字符串的一个子序列是原始字符串删除一些(也可以不删除)字符而不改变剩余字符相对位置形成的新字符串。(例如,"ace"是"abcde"的一个子序列,而"aec"不是)。

示例 1: s = "abc", t = "ahbgdc"

返回 true.

示例 2: s = "axc", t = "ahbgdc"

返回 false.

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/is… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路

利用双指针,指向长字符串的指针步进,和指向短字符串的进行比较,如果相等则短字符串的指针步进。如果指针能走到短字符串的最后则代表是一个子字符串。

代码

class Solution {
    public boolean isSubsequence(String s, String t) {
               if(s.equals("") && t.equals("")) return  true;
                  if(!s.equals("")&& t.equals("")) return false;
                if(s.equals("") && !t.equals("")) return true;
                        if(s.length() == t.length() && !s.equals(t)) return false;
                  int i = 0;
                  int j = 0;
                  while(i != t.length() ) {
                      if(j == s.length() - 1) return true;
                      if(t.charAt(i) == s.charAt(j)) 
                          j++;
                      i++;
                  }
                  return false;
    }
复制代码

转载于:https://juejin.im/post/5d0349bd6fb9a07ed2246a72

猜你喜欢

转载自blog.csdn.net/weixin_33918114/article/details/93181370