Web 项目杂记(一)
1、Tomcat 多实例部署
在Tomcat下多实例部署后,发现如下问题,采用etc/init.d/tomcat start方式无法启动,而需要采用startup.sh。查找原因发现,是因为多实例部署时,重复jar加载造成tomcat内存配置不足,解决的方式是将共用的jar包放在tomcat的lib下,而工程只保留自有的。
2、防盗链
防盗链是指防止自己的链接,主要是图片链接等被其他服务器盗用访问。主要防止的手段是利用http中的referer,它是header的一部分,当浏览器发送请求的时候,一般会带上Referer,告诉服务器我是从哪个页面链接过来的,服务器基此可以获得一些信息用于处理。在JAVA的技术架构中,可以写一个拦截器,然后在拦截器中比对:
String referer = request.getHeader("referer"); if (referer == null || !referer.contains(request.getServerName())) {
3、Token 防止重复提交
3.1) 在返回表单提交页面的时候,在缓存中设置一个Token;
3.2)请求的时候将这个Token作为隐藏参数带回来;
3.3)在处理表单提交请求时,比对参数Token和缓存中表单的Token;这个Token可以存在session里,也可以是Redis等第三方缓存;
上述设置的结果是不刷新页面,将无法第二次提交表单;
PS: 该特性原来在H公司是作为安全基线之一,一般是前后端都提要求,后端用的也是Token的方案,由平台端统一封装,当时应该是存在session里。
4、防止恶意请求
思路是在拦截器里比较相同请求来源的间隔。
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { HttpSession session = request.getSession(); String preRequest = (String) session.getAttribute(PREREQUEST); Long preRequestTime = (Long) session.getAttribute(TIME); String url = request.getServletPath(); if (preRequestTime != null && preRequest != null) { if ((url.equals(preRequest) || allRequest) && System.currentTimeMillis() - preRequestTime < minRequestIntervalTime) { //具体的处理 } session.setAttribute(PREREQUEST, url); session.setAttribute(TIME, System.currentTimeMillis()); return super.preHandle(request, response, handler); }