从零开始建站(四) - 后端项目搭建

news/2024/5/16 6:19:39/文章来源:https://blog.csdn.net/weixin_34327761/article/details/93906951

简介:

这节聊一聊项目的后端,之前也讲过,因为对前端不熟悉,所以在前端花了太多的时间,导致到后端开发的时候搞的人有点疲,所以很多东西从简了,很多细节东西没有考虑,只想着把基本功能做出来就好了。框架选择的是现在比较流行的Springboot+Mybatis+Tomcat+MySQLSpringboot是在Spring的基础上做了集成和配置简化,使用起来超级舒服。

一、搭建Springboot框架

1. 框架简介

Springboot是现在非常火热的JavaEE框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,为什么这么说呢,看一下他的几个特点:

>>> 嵌入的Tomcat,无需部署WAR文件

>>> 简化Maven配置

>>> 自动配置Spring

>>> 提供生产就绪型功能,如指标,健康检查和外部配置

>>> XML也没有配置要求比较灵活

然后我们选择Maven来管理我们的JAR包,这个没什么好说的,以后我们用一个pom文件就可以走天下了,不用在背着沉重的JAR包到处跑。

2. Springboot项目初始化

快速创建Springboot可以使用 https://start.spring.io/网页版生成项目然后导入Eclipse中或者使用IDEA创建,这里我们选择前者:首先我们访问 https://start.spring.io/ ,然后按照顺序选择填写:

1. 项目管理工具,现在一般使用Maven来管理

2. 项目开发语言

3. 这是Springboot版本

4. 项目唯一标识,可以用来确定下面的包名

5. 项目名称

6. 项目包名、打包方式、java版本

7. 项目依赖:下面勾选对应的依赖,这里我只选了web可以视自己情况而定

8. 生成项目

这里直接生成yytf.zip包,我们解压后用eclipse使用导入maven项目方式导入项目(这里要注意刚导入后项目目录不是下图中这种结构,要等一会jar包下载完成后才会形成如下图结构),如下图目录就是导入后的目录结构,而pom文件里的参数也是我们之前在网页填写的对号入座。

然后我们找到项目的启动文件,这里是BlogApplication.java,右键run as使用java application运行,控制台出现Started BlogApplication in 2.101 seconds (JVM running for 2.455)springboot启动成功。

二、项目配置

1. 配置pom.xml引入需要的JAR

<dependencies><!-- springboot启动依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 排除Springboot自带的日志工具 --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion><!-- 使用外部TOMCAT方式一:排除Springboot自带的tomcat --><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId></exclusion></exclusions></dependency><!-- 使用外部TOMCAT方式二:添加provided --><!-- provided:已提供依赖范围。使用此依赖范围的Maven依赖,对于编译和测试classpath有效,但在运行时候无效 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><!-- springboot整合log4j --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency><!-- springboot整合mybatis --><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><!-- springboot连接mysql驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version></dependency><!-- springboot整合jwt的token验证 --><dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>2.2.0</version></dependency>
</dependencies><!-- generate工具生成dao,mapper,xml -->
<build><finalName>blog</finalName><resources><resource><directory>src/main/java</directory><!-- 此配置不可缺,否则mybatis的Mapper.xml将会丢失 --><includes><include>**/*.xml</include></includes></resource><!-- 指定资源的位置 --><resource><directory>src/main/resources</directory></resource></resources>
</build>

2. 配置外部tomcat部署项目

2.1 maven依赖配置

首先我们把打包方式改成war,在pom.xml<packaging>jar</packaging>修改成<packaging>war</packaging>,在上面的pom.xml中已经写清楚两种使用外部tomcat方式:第一种是去掉springboot内置的tomcat,第二中时在运行时使内部tomcat失效

2.2 修改启动类

Application.java中继承SpringBootServletInitializer并重写configure方法

package com.yytf;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.support.SpringBootServletInitializer;
import org.springframework.scheduling.annotation.EnableScheduling;@MapperScan("com.yytf.dao")
@SpringBootApplication
@EnableScheduling
public class Application extends SpringBootServletInitializer{@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(Application.class);}public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

3.配置generatorConfig.xml自动生成vo,dao,mapper

3.1pom.xml中修改build标签,代码上面已贴出

3.2 首先安装eclipse插件:Mybatis Generator 1.3.5,Eclipse => Help => Eclipse Marketplace 搜索mybatis安装最新版本

3.3 生成generatorConfig.xml文件

New一个文件,然后选择mybatis generator configuration file,然后选择到generatorConfig.xml文件要保存的位置,例如这里保存到\blog\src\main\resources下面

3.4 配置generatorConfig.xml文件,这里注意mysql驱动包要使用绝对路径,targetProject为生成文件位置,容易出错:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration><!-- 必须使用绝对路径 --><classPathEntry location="D:\Project\Blog\Repository\mysql\mysql-connector-java\5.1.6\mysql-connector-java-5.1.6.jar"/><context id="blogTable" targetRuntime="MyBatis3"><commentGenerator><!-- 是否去除自动生成的注释 true:是 : false:否 --><property name="suppressAllComments" value="true" /></commentGenerator><!--数据库连接的信息:驱动类、连接地址、用户名、密码 --><!-- Oracle连接方式 --><!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@000.000.000.000:1521:orcl" userId="root" password="********"> </jdbcConnection> --><!-- Mysql连接方式 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://000.000.000.000:3306/blog?useUnicode=true&amp;characterEncoding=UTF-8" userId="root"password="********" /><!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和 NUMERIC 类型解析为java.math.BigDecimal --><javaTypeResolver><property name="forceBigDecimals" value="false" /></javaTypeResolver><!-- targetProject:生成PO类的位置 --><javaModelGenerator targetPackage="com.yytf.vo"targetProject="blog/src/main/java"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /><!-- 从数据库返回的值被清理前后的空格 --><property name="trimStrings" value="true" /></javaModelGenerator><!-- targetProject:mapper映射文件生成的位置 --><sqlMapGenerator targetPackage="mapper"targetProject="blog/src/main/resources"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /></sqlMapGenerator><!-- targetPackage:mapper接口生成的位置 --><javaClientGenerator type="XMLMAPPER"targetPackage="com.yytf.dao" targetProject="blog/src/main/java"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /></javaClientGenerator><!-- 指定数据库表 --><!-- 文章表 --><table tableName="article" enableCountByExample="false"enableUpdateByExample="false" enableDeleteByExample="false"enableSelectByExample="false" selectByExampleQueryId="false"></table><!-- 分类表 --><table tableName="category"enableCountByExample="false" enableUpdateByExample="false"enableDeleteByExample="false" enableSelectByExample="false"selectByExampleQueryId="false"></table></context>
</generatorConfiguration>

3.5 运行mybatis generator

4.配置application.properties

#springboot整合mybatis
#实体类包
mybatis.type-aliases-package=com.yytf.vo
#mybatis配置文件和mapper文件位置
mybatis.mapper-locations=classpath*:mapper/*.xml#mysql数据库连接信息
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://000.000.000.000:3306/blogs?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&amp
spring.datasource.username = root
spring.datasource.password = ********spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5#tomcat端口号
server.port=8080
server.session.timeout=10
server.tomcat.uri-encoding=UTF-8
server.context-path=/#log4j日志配置
logging.config=classpath:log4j2.xml
#log4j打印mybatis的sql语句
#logging.level.com.yytf.dao=debug

5.springboot整合mybatis

5.1 引入依赖,pom.xml中引入:

<!-- springboot整合mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.1</version>
</dependency>
<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version>
</dependency><!-- springboot连接mysql驱动依赖 -->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.11</version>
</dependency>

5.2 application.properties里配置:

#实体类包
mybatis.type-aliases-package=com.yytf.vo
#mybatis配置文件和mapper文件位置
mybatis.mapper-locations=classpath*:mapper/*.xml
#mysql数据库连接信息
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
spring.datasource.url = jdbc:mysql://000.000.000.000:3306/blogs?useUnicode=true&allowPublicKeyRetrieval=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8&amp
spring.datasource.username = root
spring.datasource.password = ********

5.3 在启动类Application.java中配置mapper扫描注解 @MapperScan("com.yytf.dao")

6.springboot整合log4j

6.1 pom.xml文件中添加log4jjar包依赖,首先排除内置的日志工具

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId><!-- 排除Springboot自带的日志工具 --><exclusions><exclusion><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-logging</artifactId></exclusion></exclusions></dependency><!-- springboot整合log4j --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-log4j2</artifactId></dependency>
</dependencies>

6.2 application.properties中配置指定log4j2.xml的位置

#log4j日志配置
logging.config=classpath:log4j2.xml
#log4j打印mybatis的sql语句
#logging.level.com.yytf.dao=debug

6.3 配置log4j2.xml

下面贴上代码:解释一下

>>> LOG_HOME:这里的/var/log/blogs路径如果在linux就是对应的目录,如果在windows上则在当前盘符下新建一个var文件夹,例如tomcatD盘,则在D盘新建路径D:\var\log\blogs

>>> FILE_NAME:临时生成的日志文件名称,下面配置中第二天会被新生成的替代

>>> Console标签:输出到控制台

>>> RollingRandomAccessFile标签:周期性生成新的日志文件并存档

>>> filePattern:存档的日志文件的命名规则,例如下面配置生成:D:\var\log\blogs\2018-09\blogs-2018-09-15-1.logi%代表1开始递增

>>> TimeBasedTriggeringPolicy标签:生成新文件周期数,例如下面interval="1"是一天一个日志文件

>>> SizeBasedTriggeringPolicy标签和i%是配合使用的,表示当日志文件大小超过20MB就生成新日志文件,新日志文件后缀i%就递:blogs-2018-09-15-2.log

>>> 最后一个Logger name="com.yytf.dao"是在本地调试时把sql语句打印在控制台

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN"> <properties><property name="LOG_HOME">/var/log/blogs</property><property name="FILE_NAME">blogs</property><property name="log.sql.level">info</property></properties><Appenders>  <Console name="Console" target="SYSTEM_OUT">  <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n" />  </Console><RollingRandomAccessFile name="RollingRandomAccessFile" fileName="${LOG_HOME}/${FILE_NAME}.log" filePattern="${LOG_HOME}/$${date:yyyy-MM}/${FILE_NAME}-%d{yyyy-MM-dd}-%i.log"><PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %l - %msg%n"/><Policies><TimeBasedTriggeringPolicy interval="1"/><SizeBasedTriggeringPolicy size="10 MB"/></Policies><DefaultRolloverStrategy max="20"/></RollingRandomAccessFile></Appenders>  <Loggers>  <Root level="info">  <AppenderRef ref="Console" /><AppenderRef ref="RollingRandomAccessFile" />  </Root><Logger name="com.yytf.dao" level="${log.sql.level}" additivity="false"><AppenderRef ref="Console" /></Logger></Loggers>  
</Configuration>

7.springboot使用内置定时任务

7.1 启动类Application.java

添加注解:@EnableScheduling

7.2 定时任务类

package com.yytf.util;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class Timer {@AutowiredEverydayTalkMapper everydayTalkMapper;@Scheduled(cron = "0 59 23 * * ?")public void scheduleUpdateTalkId() {System.out.println("======>" + System.currentTimeMillis());}
}

7.3 使用场景

项目中每日一语需要每天变换,设置cron表达式为:cron = "0 59 23 * * ?"在每天0点前把项目中的存储每日一语的静态变量的信息更换。

8.springboot使用JWTJava Web Token)做Token验证

8.1 为什么要使用token验证

>>> 因为我们的前后端是分离的,所有的请求都是跨域行为,所以sessionId一直是变化的,不能通过sessionId来获得用户信息

>>> token的时候我们只用在第一次登录的时候查询一下数据库,然后在token的过期时间内就可以不用再与数据库用户表交互,减少IO操作。

>>> 如果有多台服务器做负载均衡,因为token是无状态的,所以服务器之间可以共用token

8.2 pom.xml中引入jwtjar包依赖

<dependency><groupId>com.auth0</groupId><artifactId>java-jwt</artifactId><version>2.2.0</version>
</dependency>

8.3 新建Token签发与解析验证类JavaWebToken.java注意payload里面不要存放敏感信息,例如不要存放密码等,因为该部分是对称加密,在客户端可以解密。SECRET是不能暴露出去的,相当于私钥,加密的方式由它决定。

package com.yytf.util;import java.util.HashMap;
import java.util.Map;import com.auth0.jwt.JWTSigner;
import com.auth0.jwt.JWTVerifier;
import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;public class JavaWebToken {private static final String SECRET = "********";private static final String EXP = "exp";private static final String PAYLOAD = "payload";public static <T> String sign(T object, long maxAge) {try {final JWTSigner signer = new JWTSigner(SECRET);final Map<String, Object> claims = new HashMap<String, Object>();ObjectMapper mapper = new ObjectMapper();String jsonString = mapper.writeValueAsString(object);claims.put(PAYLOAD, jsonString);claims.put(EXP, System.currentTimeMillis() + maxAge);return signer.sign(claims);} catch(Exception e) {return null;}}public static<T> T unsign(String jwt, Class<T> classT) {final JWTVerifier verifier = new JWTVerifier(SECRET);try {final Map<String,Object> claims= verifier.verify(jwt);if (claims.containsKey(EXP) && claims.containsKey(PAYLOAD)) {long exp = (Long)claims.get(EXP);long currentTimeMillis = System.currentTimeMillis();if (exp > currentTimeMillis) {String json = (String)claims.get(PAYLOAD);ObjectMapper objectMapper = new ObjectMapper();return objectMapper.readValue(json, classT);}}return null;} catch (Exception e) {return null;}}
}

8.4 登录成功签发token

loginController.java中:

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;import com.yytf.util.JavaWebToken;
import com.yytf.vo.UserVO;@Controller
@RequestMapping(value="/login")
public class LoginController {@RequestMapping(value="/login",method=RequestMethod.POST)@ResponseBodypublic ResponseUtil login(@RequestBody UserVO userVO) {UserVO resultUserVO = new UserVO();String userName = PropertiesUtil.getProperty("userName");String password = PropertiesUtil.getProperty("password");if(userVO.getUserName().equals(userName) && userVO.getPassword().equals(password)) {Map<String, UserVO> data = new HashMap<String, UserVO>();resultUserVO.setUserName(userName);String token = JavaWebToken.sign(resultUserVO, 1000L * 3600L * 3L);data.put("user", resultUserVO);return ResponseUtil.loginSuccess(data, token);}return ResponseUtil.fail("login fail");}
}

8.5 访问怎删改查接口验证是否登录

前台传入token,然后验证token是否正确,如果不正确则返回前台登录界面

public class CheckIsLogin {/*** 检查是否有操作权限* @param token* @return*/public static boolean checkIsLogin(String token) {UserVO userVO = JavaWebToken.unsign(token, UserVO.class);String userName = PropertiesUtil.getProperty("userName");if(userVO != null && userVO.getUserName().equals(userName)) {return true;}return false;}
}

9.springboot使用CORS配置解决跨域问题

package com.yytf.util;import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;/*** 全局CORS配置解决跨域问题
*/
@Configuration
public class CORSConfiguration {/*方式一只支持一个域名配置*/
//      @Bean
//    public FilterRegistrationBean corsFilter() {
//        UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
//        CorsConfiguration config = new CorsConfiguration();
//        config.setAllowCredentials(true);
//        // 设置你要允许的网站域名,如果全允许则设为 *
//        config.addAllowedOrigin("*");
       config.addAllowedOrigin("http://test.com");
//        // 如果要限制 HEADER 或 METHOD 请自行更改
//        config.addAllowedHeader("*");
//        config.addAllowedMethod("*");
//        source.registerCorsConfiguration("/**", config);
//        FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
//        // 这个顺序很重要哦,为避免麻烦请设置在最前
//        bean.setOrder(0);
//        return bean;
//    }/*方式二支持多个域名*/@Beanpublic WebMvcConfigurer corsConfigurer() {return new WebMvcConfigurerAdapter() {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("http://test.com","http://www.test.com").allowedHeaders("*").allowedMethods("GET", "POST", "DELETE", "PUT", "OPTIONS").allowCredentials(true).maxAge(3600);}};}}

三、Debug记录

1.数据正常返回,前台却报404错误,因为后台方法缺少@ResponseBody注解

2.mybatisforeach标签使用参数中间缺少逗号

3.使用mybatis-generator生成dao,mapper时报错

4.使用mybatis-generator生成dao,mapper时报错

5.MySQL8以上(包含8)版本注意事项

在前面的配置文件里代码已经贴出

6.MapperService实例注入失败,不能被发现

OJBK大概就这些了,剩下的都基本是苦力活就不说了,整个项目搞下来还是花了不少时间,超出了预期时间很多,不过也学到了不少东西。俗话说:纸上得来终觉浅,绝知此事要躬行,只用多写,多敲,多练我们才能进步的更快。我的自控力很差,玩起来就什么不管了,很难坚持一件事到底,所以我有时候想是不是要给自己每天规划一下要完成什么任务,要先坚持一个东西,比如写博客来锻炼自己的持久力,能做好一个,其它的慢慢就都能搞好了吧。渴望进步证明我还没有堕落到当一个咸鱼,哈哈,加油吧!

转载于:https://www.cnblogs.com/songzhen/p/blogs-diary-4.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_738770.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu Nginx下配置网站ssl实现https访问

为什么80%的码农都做不了架构师&#xff1f;>>> 最近在看 HTTP权威指南 看到介绍了HTTPS的ssl&#xff0c;自己就动手测试了下&#xff0c;将步骤记录下 HTTPS简介 什么是HTTPS&#xff1f;百科是这样解释的。HTTPS&#xff08;全称&#xff1a;Hyper Text Tran…

大型网站架构系列:负载均衡详解(1)(转)

面对大量用户访问、高并发请求&#xff0c;海量数据&#xff0c;可以使用高性能的服务器、大型数据库&#xff0c;存储设备&#xff0c;高性能Web服务器&#xff0c;采用高效率的编程语言比如(Go,Scala)等&#xff0c;当单机容量达到极限时&#xff0c;我们需要考虑业务拆分和分…

搜索关键词分析——以个人博客网站为例

背景 我做了一个个人博客网站&#xff0c;希望能够记录自己的学习&#xff0c;工作和成长笔记。同时为更多有相同需求的人提供帮助和支持。那么用户应该怎么来找到我这个博客网站呢&#xff1f;通过什么关键词能够快速找到这个博客网站呢&#xff1f; 接下来本文就来探讨一下关…

基于python的种子搜索网站,你懂得!

该项目是基于python的web类库django开发的一套web网站&#xff0c;给师弟做的毕业设计。本人的研究方向是一项关于搜索的研究项目。在该项目中&#xff0c;笔者开发了一个简单版的搜索网站&#xff0c;实现了对数据库数据的检索和更新。通过开发该项目&#xff0c;笔者学习和巩…

只有登陆注册页需要https加密吗?N网站有必要全站加密吗?

很多人都觉得&#xff0c;HTTPS 可以保护用户的密码等登陆信息&#xff0c;那么其他时候就不需要了。但火狐Firefox浏览器插件Firesheep&#xff0c;证明了这种想法是错的。我们可以看到&#xff0c;其实在一些社交平台&#xff0c;劫持其他人的session是非常容易的。我们以常见…

windwos服务器网站504,打开网站出现504 gateway time-out的原因及解决方法

我们在访问大流量网站或者运营有较多数据的网站时候&#xff0c;偶尔会出现504 GatewayTime-out错误&#xff0c;那么造成504 gateway time-out是什么原因呢&#xff1f;这多是网站服务器配置不当导致的&#xff0c;下面分享一下504 gateway time-out解决方法。1、代码释义504 …

java嵌套其他人网站页面_手把手教你实现Java权限管理系统 前端篇(十五):嵌套外部网页...

嵌套外部网页在有些时候&#xff0c;我们需要在我们的内容栏主区域显示外部网页。如查看服务端提供的SQL监控页面&#xff0c;接口文档页面等。这个时候就要求我们的导航菜单能够解析嵌套网页的URL&#xff0c;并根据URL路由到相应的嵌套组件。接下来我们就讲解具体实现方案。实…

使用Apache JMeter测试网站压力

使用Apache JMeter测试网站压力 一、进入官网下载资源 官网地址&#xff1a;http://jmeter.apache.org/download_jmeter.cgi 提供同版本百度网盘下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1kM3hucZJWwFZpwBFk-2FYA 提取码&#xff1a;0qrf 二、解压资源apach…

centos7 php无法启动服务器,centos7下无法启动ssh服务_网站服务器运行维护,centos7,ssh...

win10文件夹显示一个小一个大怎么办_网站服务器运行维护win10文件夹显示一个小一个大的解决办法&#xff1a;首先进入“我的电脑”&#xff0c;点击上方的“查看”&#xff1b;然后点击界面右边的“选项”&#xff1b;接着在弹出的窗口中选择“查看”&#xff1b;最后选择“应用…

宝塔面板ab模板建站_建站工具篇:在首次建站过程中,我都用到了哪些建站工具?...

工欲善其事&#xff0c;必先利其器。在生活中、在工作中我们经常会使用到一些实用的工具&#xff0c;来帮助我们快速的完成任务&#xff0c;建站也是一样&#xff0c;我们需要利用一些工具来帮助我们快速便捷地搭建网站。下面&#xff0c;跟大家聊聊在建站的过程中我都使用了哪…

速度优化_WordPress网站速度优化指南

使用Wordpress搭建的网站普遍打开速度太慢&#xff0c;针于SEO来讲提升网站打开速度才能获得好的体验。如何提升Wordpress网站打开速度&#xff0c;让WP博客程序实现速度秒开&#xff0c;经过研究实践终于突破了速度这一难题。要提升Wordpress速度需要结合多方面来进行操作&…

java精品课程设计开发_《java语言课程设计》精品课程网站规划和建设.doc

《java语言课程设计》精品课程网站规划和建设.doc 学科类网络工程学号1101010136学校代码13421密级2015届本科生毕业论文JAVA语言程序设计精品课程网站规划与建设学院信息学院专业网络工程姓名宋冬冬指导教师万里勇职称讲师答辩日期二〇一五年四月七日毕业论文诚信声明本人郑重…

2012网站服务器目录磁盘满了,服务器磁盘异常爆满的原因及解决方法

最近经常收到360网站监控发来的邮件&#xff0c;提示网站打不开&#xff0c;原因则无一例外都是磁盘爆满&#xff0c;导致mysql停止工作&#xff0c;删除部分文件后&#xff0c;网站恢复访问&#xff0c;不过过不多久&#xff0c;网站又再次因为磁盘爆满而打不开&#xff0c;在…

linux网站ip访问量查询,如何统计网站每天PV和IP访问量排行

近几天&#xff0c;官网登陆注册页面总是会有人进行账号密码试探&#xff0c;为了观察网站每天一些访问量情况&#xff0c;提早发现问题&#xff0c;特意统计了网站的页面及IP访问量&#xff0c;并将前10名&#xff0c;通过web页面展示出来。1.分析页面和IP访问量排行。#!/bin/…

3D溜溜网站用的是php吗_用完磨砂膏皮肤滑溜溜,但是磨砂膏真的好用吗?

众所周知用完磨砂膏的皮肤摸上去滑滑的&#xff0c;可以让皮肤看上去像抛光了一样&#xff0c;磨砂膏是一种细微颗粒状的清洁皮肤的用品&#xff0c;有去死皮的功效&#xff0c;能够对皮肤深层次的垃圾进行去除&#xff0c;减轻皮肤的负担&#xff0c;但如此超强清洁能力的颗粒…

.net网站 发布到服务器,.netcore 网站发布到Linux服务器

准备Linux服务器一台。安装.netcore sdk。1&#xff0c;添加微软的库到本地源中&#xff1a;rpm -Uvh https://packages.microsoft.com/config/rhel/7/packages-microsoft-prod.rp2&#xff0c;将系统软件更新到最新状态。 更新过程中直接yes就好&#xff0c;然后等待更亲完成。…

在html如何将链接隐藏,网页查看隐藏链接的方法和检测工具(附:网站链接隐藏的方法)...

通常的情况下&#xff0c;网页的链接是不允许被隐藏的&#xff0c;所以在没有必要的情况下&#xff0c;我们通常都不建议做隐藏链接&#xff0c;但是部分黑帽SEO技术员则会将链接隐藏&#xff0c;一来是为了不容易被别人发现&#xff0c;二来可以做到吸引蜘蛛的效果&#xff0c…

不会自动更新了_dedecms自动更新首页,这个方法屡试不爽对SEO优化也很友好

使用dedecms建站&#xff0c;如何自动更新首页呢&#xff1f;默认是将所有的页面生成静态HTML文件&#xff0c;对于详情页和栏目等内页&#xff0c;可以在网站后台设置发布文章后自动更新栏目、上下篇等&#xff0c;但是这个有点问题&#xff1a;就是当你的网站是一个个人站或者…

.net url参数全站加密_网站全站启用HTTPS要如何配置?

网站全站启用HTTPS要如何配置&#xff1f;百度站长平台目前是建议HTTP的网站将协议改造成HTTPS协议&#xff0c;百度搜索引擎也会优先收录HTTPS的网站。主要HTTPS是建立一个信息安全通道&#xff0c;具有加密传输有效保障了用户隐私数据密文传输&#xff0c;截取后也是无法解密…

php使用iframe框架,DedeCMS网站js/jquery操作iframe框架的方法

IFRAME是HTML标签&#xff0c;作用是文档中的文档&#xff0c;或者浮动的框架(FRAME)。iframe元素会创建包含另外一个文档的内联框架(即行内框架)。DedeCMS网站js/jquery操作iframe框架的方法JavaScript代码在父窗口中获取iframe中的元素&#xff1a;格式&#xff1a;window.fr…