JAVAEE——宜立方商城07:Linux上搭建Solr服務、資料庫導入索引庫、搜索功能的實現

来源:https://www.cnblogs.com/xieyupeng/archive/2018/07/26/9374655.html
-Advertisement-
Play Games

1. 學習計劃 1、Solr服務搭建 2、Solrj使用測試 3、把資料庫中的數據導入索引庫 4、搜索功能的實現 2. Solr服務搭建 2.1. Solr的環境 Solr是java開發。 需要安裝jdk。 安裝環境Linux。 需要安裝Tomcat。 2.2. 搭建步驟 第一步:把solr 的壓縮 ...


1. 學習計劃

1、Solr服務搭建

2、Solrj使用測試

3、把資料庫中的數據導入索引庫

4、搜索功能的實現

2. Solr服務搭建

2.1. Solr的環境

Solrjava開發。

需要安裝jdk

安裝環境Linux

需要安裝Tomcat

2.2. 搭建步驟

第一步:把solr 的壓縮包上傳到Linux系統

第二步:解壓solr

第三步:安裝Tomcat,解壓縮即可。

第四步:把solr部署到Tomcat下。

第五步:解壓縮war包。啟動Tomcat解壓。

tail -f ../logs/catalina.out 查看tomcat運行情況 f是迴圈讀取的意思

第六步:把/root/solr-4.10.3/example/lib/ext目錄下的所有的jar包,添加到solr工程中。

[root@localhost ext]# pwd

/root/solr-4.10.3/example/lib/ext

[root@localhost ext]# cp * /usr/local/solr/tomcat/webapps/solr/WEB-INF/lib/

第七步:創建一個solrhome/example/solr目錄就是一個solrhome。複製此目錄到/usr/local/solr/solrhome

[root@localhost example]# pwd

/root/solr-4.10.3/example

[root@localhost example]# cp -r solr /usr/local/solr/solrhome

[root@localhost example]#

第八步:關聯solrsolrhome。需要修改solr工程的web.xml文件。

 

第九步:啟動Tomcat

http://192.168.25.154:8080/solr/

windows下的配置完全一樣。

 

 

2.3. 配置業務域

schema.xml中定義

1、商品Id

2、商品標題

3、商品賣點

4、商品價格

5、商品圖片

6、分類名稱

 

創建對應的業務域。需要制定中文分析器。

 

創建步驟:

第一步:把中文分析器添加到工程中。

1、IKAnalyzer2012FF_u1.jar添加到solr工程的lib目錄下

2、把擴展詞典、配置文件放到solr工程的WEB-INF/classes目錄下。

第二步:配置一個FieldType,制定使用IKAnalyzer

修改schema.xml文件

修改Solrschema.xml文件,添加FieldType

<fieldType name="text_ik" class="solr.TextField">

  <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>

</fieldType>

第三步:配置業務域,type制定使用自定義的FieldType

設置業務系統Field

<field name="item_title" type="text_ik" indexed="true" stored="true"/>

<field name="item_sell_point" type="text_ik" indexed="true" stored="true"/>

<field name="item_price"  type="long" indexed="true" stored="true"/>

<field name="item_image" type="string" indexed="false" stored="true" />

<field name="item_category_name" type="string" indexed="true" stored="true" />

 

<field name="item_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>

<copyField source="item_title" dest="item_keywords"/>

<copyField source="item_sell_point" dest="item_keywords"/>

<copyField source="item_category_name" dest="item_keywords"/>

第四步:重啟tomcat

 

 

3. 搜索工程搭建

 

 

要實現搜索功能,需要搭建solr服務、搜索服務工程、搜索系統

 

 

3.1. 搜索服務工程搭建

可以參考e3-manager創建。

e3-search(聚合工程pom

|--e3-search-interfacejar

|--e3-search-Servicewar

e3-search-webwar

 

 

 

 

4. 使用solrJ管理索引庫

使用SolrJ可以實現索引庫的增刪改查操作。

 

4.1. 添加文檔

第一步:把solrJjar包添加到工程中。

第二步:創建一個SolrServer,使用HttpSolrServer創建對象。

第三步:創建一個文檔對象SolrInputDocument對象。

第四步:向文檔中添加域。必須有id域,域的名稱必須在schema.xml中定義。

第五步:把文檔添加到索引庫中。

第六步:提交。

@Test
    public void addDocument() throws Exception {
        // 第一步:把solrJ的jar包添加到工程中。
        // 第二步:創建一個SolrServer,使用HttpSolrServer創建對象。
        SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        // 第三步:創建一個文檔對象SolrInputDocument對象。
        SolrInputDocument document = new SolrInputDocument();
        // 第四步:向文檔中添加域。必須有id域,域的名稱必須在schema.xml中定義。
        document.addField("id", "test001");
        document.addField("item_title", "測試商品");
        document.addField("item_price", "199");
        // 第五步:把文檔添加到索引庫中。
        solrServer.add(document);
        // 第六步:提交。
        solrServer.commit();
    }

 


4.2. 刪除文檔
 

4.2.1. 根據id刪除

第一步:創建一個SolrServer對象。

第二步:調用SolrServer對象的根據id刪除的方法。

第三步:提交。

@Test
    public void deleteDocumentById() throws Exception {
        // 第一步:創建一個SolrServer對象。
        SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        // 第二步:調用SolrServer對象的根據id刪除的方法。
        solrServer.deleteById("1");
        // 第三步:提交。
        solrServer.commit();
    }

 


4.2.2. 根據查詢刪除
 

@Test
    public void deleteDocumentByQuery() throws Exception {
        SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        solrServer.deleteByQuery("title:change.me");
        solrServer.commit();
    }

 


4.3. 查詢索引庫
 

查詢步驟:

第一步:創建一個SolrServer對象

第二步:創建一個SolrQuery對象。

第三步:向SolrQuery中添加查詢條件、過濾條件。。。

第四步:執行查詢。得到一個Response對象。

第五步:取查詢結果。

第六步:遍歷結果並列印。

 

4.3.1. 簡單查詢

@Test
    public void queryDocument() throws Exception {
        // 第一步:創建一個SolrServer對象
        SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        // 第二步:創建一個SolrQuery對象。
        SolrQuery query = new SolrQuery();
        // 第三步:向SolrQuery中添加查詢條件、過濾條件。。。
        query.setQuery("*:*");
        // 第四步:執行查詢。得到一個Response對象。
        QueryResponse response = solrServer.query(query);
        // 第五步:取查詢結果。
        SolrDocumentList solrDocumentList = response.getResults();
        System.out.println("查詢結果的總記錄數:" + solrDocumentList.getNumFound());
        // 第六步:遍歷結果並列印。
        for (SolrDocument solrDocument : solrDocumentList) {
            System.out.println(solrDocument.get("id"));
            System.out.println(solrDocument.get("item_title"));
            System.out.println(solrDocument.get("item_price"));
        }
    }

 


4.3.2. 帶高亮顯示
 

@Test
    public void queryDocumentWithHighLighting() throws Exception {
        // 第一步:創建一個SolrServer對象
        SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        // 第二步:創建一個SolrQuery對象。
        SolrQuery query = new SolrQuery();
        // 第三步:向SolrQuery中添加查詢條件、過濾條件。。。
        query.setQuery("測試");
        //指定預設搜索域
        query.set("df", "item_keywords");
        //開啟高亮顯示
        query.setHighlight(true);
        //高亮顯示的域
        query.addHighlightField("item_title");
        query.setHighlightSimplePre("<em>");
        query.setHighlightSimplePost("</em>");
        // 第四步:執行查詢。得到一個Response對象。
        QueryResponse response = solrServer.query(query);
        // 第五步:取查詢結果。
        SolrDocumentList solrDocumentList = response.getResults();
        System.out.println("查詢結果的總記錄數:" + solrDocumentList.getNumFound());
        // 第六步:遍歷結果並列印。
        for (SolrDocument solrDocument : solrDocumentList) {
            System.out.println(solrDocument.get("id"));
            //取高亮顯示
            Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
            List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
            String itemTitle = null;
            if (list != null && list.size() > 0) {
                itemTitle = list.get(0);
            } else {
                itemTitle = (String) solrDocument.get("item_title");
            }
            System.out.println(itemTitle);
            System.out.println(solrDocument.get("item_price"));
        }
    }

 


5. 
把商品數據導入到索引庫中 

5.1. Dao

5.1.1. Sql語句

 

SELECT
    a.id,
    a.title,
    a.sell_point,
    a.price,
    a.image,
    b.`name` category_name
FROM
    `tb_item` a
LEFT JOIN tb_item_cat b ON a.cid = b.id
WHERE a.`status`=1

 

 


 
需要自己創建
Mapper文件。

5.1.2. 創建對應數據集的pojo

public class SearchItem implements Serializable{
    private String id;
    private String title;
    private String sell_point;
    private long price;
    private String image;
    private String category_name;
}

 


5.1.3. 介面定義
 

public interface ItemMapper {

List<SearchItem> getItemList();

} 


5.1.4. Mapper映射文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="cn.e3mall.search.mapper.ItemMapper" >
    
    <select id="getItemList" resultType="cn.e3mall.common.pojo.SearchItem">
        SELECT
            a.id,
            a.title,
            a.sell_point,
            a.price,
            a.image,
            b.`name` category_name
        FROM
            `tb_item` a
        LEFT JOIN tb_item_cat b ON a.cid = b.id
        WHERE a.`status`=1
    </select>

</mapper>

 


5.2. Service
 

5.2.1. 功能分析

1、查詢所有商品數據。

2、迴圈把商品數據添加到索引庫。使用solrJ實現。

3、返回成功。返回E3Result

 

參數:無

返回值:E3Result

5.2.2. solrJ添加索引庫

1、solrJjar包添加到工程。

2、創建一個SolrServer對象。創建一個和sorl服務的連接。HttpSolrServer

3、創建一個文檔對象。SolrInputDocument

4、向文檔對象中添加域。必須有一個id域。而且文檔中使用的域必須在schema.xml中定義。

5、把文檔添加到索引庫

6、Commit

@Test
    public void addDocument() throws Exception {
        // 1、把solrJ的jar包添加到工程。
        // 2、創建一個SolrServer對象。創建一個和sorl服務的連接。HttpSolrServer。
        //如果不帶Collection預設連接Collection1
        SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        // 3、創建一個文檔對象。SolrInputDocument。
        SolrInputDocument document = new SolrInputDocument();
        // 4、向文檔對象中添加域。必須有一個id域。而且文檔中使用的域必須在schema.xml中定義。
        document.addField("id", "test001");
        document.addField("item_title", "測試商品");
        // 5、把文檔添加到索引庫
        solrServer.add(document);
        // 6、Commit。
        solrServer.commit();
    }

 


5.2.3. 代碼實現
 

/**
 * 將商品數據導入索引庫
 * <p>Title: SearchItemServiceImpl</p>
 * <p>Description: </p>
 * <p>Company: www.itcast.cn</p> 
 * @version 1.0
 */
@Service
public class SearchItemServiceImpl implements SearchItemService {

    @Autowired
    private ItemMapper itemMapper;
    @Autowired
    private SolrServer solrServer;
    
    @Override
    public E3Result importItmes() {
        try {
            //查詢商品列表
            List<SearchItem> itemList = itemMapper.getItemList();
            //導入索引庫
            for (SearchItem searchItem : itemList) {
                //創建文檔對象
                SolrInputDocument document = new SolrInputDocument();
                //向文檔中添加域
                document.addField("id", searchItem.getId());
                document.addField("item_title", searchItem.getTitle());
                document.addField("item_sell_point", searchItem.getSell_point());
                document.addField("item_price", searchItem.getPrice());
                document.addField("item_image", searchItem.getImage());
                document.addField("item_category_name", searchItem.getCategory_name());
                //寫入索引庫
                solrServer.add(document);
            }
            //提交
            solrServer.commit();
            //返回成功
            return E3Result.ok();
            
        } catch (Exception e) {
            e.printStackTrace();
            return E3Result.build(500, "商品導入失敗");
        }
    }

}

 


5.2.4. SolrServer
的配置 

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">

    <bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
        <constructor-arg index="0" value="http://192.168.25.154:8080/solr"/>
    </bean>

</beans>

 


5.2.5. 發佈服務
 

 

 

 

5.3. 表現層

後臺管理工程中調用商品導入服務。

 

 

5.3.1. 功能分析

 

 

請求的url/index/item/import

響應的結果:json數據。可以使用E3Result

 

5.3.2. Controller

@Controller
public class SearchItemController {

    @Autowired
    private SearchItemService searchItemService;
    
    @RequestMapping("/index/item/import")
    @ResponseBody
    public E3Result impotItemIndex() {
        E3Result result = searchItemService.importItmes();
        return result;
    }

}

 


5.4. 
解決Mapper映射文件不存在異常 

e3-search-servicepom文件中需要添加資源配置。

<!-- 如果不添加此節點mybatis的mapper.xml文件都會被漏掉。 -->
    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>

 


  

6. 搜索功能實現

6.1. 使用sorlJ 查詢索引庫

//使用solrJ實現查詢
    @Test
    public void queryDocument() throws Exception {
        //創建一個SolrServer對象
        SolrServer solrServer = new HttpSolrServer("http://192.168.25.154:8080/solr");
        //創建一個查詢對象,可以參考solr的後臺的查詢功能設置條件
        SolrQuery query = new SolrQuery();
        //設置查詢條件
//        query.setQuery("阿爾卡特");
        query.set("q","阿爾卡特");
        //設置分頁條件
        query.setStart(1);
        query.setRows(2);
        //開啟高亮
        query.setHighlight(true);
        query.addHighlightField("item_title");
        query.setHighlightSimplePre("<em>");
        query.setHighlightSimplePost("</em>");
        //設置預設搜索域
        query.set("df", "item_title");
        //執行查詢,得到一個QueryResponse對象。
        QueryResponse queryResponse = solrServer.query(query);
        //取查詢結果總記錄數
        SolrDocumentList solrDocumentList = queryResponse.getResults();
        System.out.println("查詢結果總記錄數:" + solrDocumentList.getNumFound());
        //取查詢結果
        Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
        for (SolrDocument solrDocument : solrDocumentList) {
            System.out.println(solrDocument.get("id"));
            //取高亮後的結果
            List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
            String title= "";
            if (list != null && list.size() > 0) {
                //取高亮後的結果
                title = list.get(0);
            } else {
                title = (String) solrDocument.get("item_title");
            }
            System.out.println(title);
            System.out.println(solrDocument.get("item_sell_point"));
            System.out.println(solrDocument.get("item_price"));
            System.out.println(solrDocument.get("item_image"));
            System.out.println(solrDocument.get("item_category_name"));
        }
        
    }

 


6.2. 功能分析
 

把搜索結果頁面添加到工程中。

 

 

請求的url/search

請求的方法:GET

參數:

keyword:查詢條件

Page:頁碼。如果沒有此參數,需要給預設值1

返回的結果:

1)商品列表

2)總頁數

3)總記錄數

使用jsp展示,返回邏輯視圖。

 

商品列表使用:SearchItem表示。

需要把查詢結果封裝到一個pojo中:

1)商品列表List<SearchItem>

2)總頁數。Int totalPages。總記錄數/每頁顯示的記錄數向上取整。把每頁顯示的記錄是配置到屬性文件中。

3)總記錄數。Int recourdCount

public class SearchResult implements Serializable {

  private List<SearchItem> itemList;

  private int totalPages;

  private int recourdCount;

}

 

6.3. Dao

跟據查詢條件查詢索引庫,返回對應的結果。

參數:SolrQuery

返回結果:SearchResult

@Repository
public class SearchDao {

    @Autowired
    private SolrServer solrServer;
    
    public SearchResult search(SolrQuery query) throws Exception {
        //根據查詢條件查詢索引庫
        QueryResponse queryResponse = solrServer.query(query);
        //取查詢結果總記錄數
        SolrDocumentList solrDocumentList = queryResponse.getResults();
        long numFound = solrDocumentList.getNumFound();
        //創建一個返回結果對象
        SearchResult result = new SearchResult();
        result.setRecourdCount((int) numFound);
        //創建一個商品列表對象
        List<SearchItem> itemList = new ArrayList<>();
        //取商品列表
        //取高亮後的結果
        Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
        for (SolrDocument solrDocument : solrDocumentList) {
            //取商品信息
            SearchItem searchItem = new SearchItem();
            searchItem.setCategory_name((String) solrDocument.get("item_category_name"));
            searchItem.setId((String) solrDocument.get("id"));
            searchItem.setImage((String) solrDocument.get("item_image"));
            searchItem.setPrice((long) solrDocument.get("item_price"));
            searchItem.setSell_point((String) solrDocument.get("item_sell_point"));
            //取高亮結果
            List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
            String itemTitle = "";
            if (list != null && list.size() > 0) {
                itemTitle = list.get(0);
            } else {
                itemTitle = (String) solrDocument.get("item_title");
            }
            searchItem.setTitle(itemTitle);
            //添加到商品列表
            itemList.add(searchItem);
        }
        //把列表添加到返回結果對象中
        result.setItemList(itemList);
        return result;
    }
}

 


6.4. Service
 

需要有一個介面一個實現類,需要對外發佈服務。

參數:String keyWord

      int page

      int rows

返回值:SearchResult

業務邏輯:

1)根據參數創建一個查詢條件對象。需要指定預設搜索域,還需要配置高亮顯示。

2)調用dao查詢。得到一個SearchResult對象

3)計算查詢總頁數,每頁顯示記錄數就是rows參數。

@Service
public class SearchServiceImpl implements SearchService {

    @Autowired
    private SearchDao searchDao;
    
    @Value("${DEFAULT_FIELD}")
    private String DEFAULT_FIELD;
    
    @Override
    public SearchResult search(String keyWord, int page, int rows) throws Exception {
        //創建一個SolrQuery對象
        SolrQuery query = new SolrQuery();
        //設置查詢條件
        query.setQuery(keyWord);
        //設置分頁條件
        query.setStart((page - 1) * rows);
        //設置rows
        query.setRows(rows);
        //設置預設搜索域
        query.set("df", DEFAULT_FIELD);
        //設置高亮顯示
        query.setHighlight(true);
        query.addHighlightField("item_title");
        query.setHighlightSimplePre("<em style=\"color:red\">");
        query.setHighlightSimplePost("</em>");
        //執行查詢
        SearchResult searchResult = searchDao.search(query);
        //計算總頁數
        int recourdCount = searchResult.getRecourdCount();
        int pages = recourdCount / rows;
        if (recourdCount % rows > 0) pages++;
        //設置到返回結果
        searchResult.setTotalPages(pages);
        return searchResult;
    }

}

 


6.4.1. 發佈服務
 

 

 

 

6.5. 表現層

6.5.1. 引用服務

e3-search-web中添加介面依賴

 

 

Springmvc.xml

 

 

6.5.2. Controller

請求的url/search

請求的方法:GET

參數:

keyword:查詢條件

Page:頁碼。如果沒有此參數,需要給預設值1

返回的結果:

使用jsp展示,返回邏輯視圖。

@Controller
public class SearchController {

    @Autowired
    private SearchService searchService;
    @Value("${PAGE_ROWS}")
    private Integer PAGE_ROWS;
    
    @RequestMapping("/search")
    public String search(String keyword,@RequestParam(defaultValue="1") Integer page, Model model) throws Exception {
        //需要轉碼
        keyword = new String(keyword.getBytes("iso8859-1"), "utf-8");
        //調用Service查詢商品信息 
        SearchResult result = searchService.search(keyword, page, PAGE_ROWS);
        //把結果傳遞給jsp頁面
        model.addAttribute("query", keyword);
        model.addAttribute("totalPages", result.getTotalPages());
        model.addAttribute("recourdCount", result.getRecourdCount());
        model.addAttribute("page", page);
        model.addAttribute("itemList", result.getItemList());
        //返回邏輯視圖
        return "search";
    }
    
}

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先感謝授課XXX老師。 1.什麼是線程安全問題 當多個線程共用同一個全局變數,做寫的操作時候,可能會受到其他線程的干擾,導致數據出現問題,這種現象就叫做線程安全問題。做讀的時候不會產生線程安全問題。 什麼安全:多個線程同時共用一個全局變數,做寫操作的時候會發生線程安全。 多個線程共用同一個局部變數 ...
  • 最近在做一個項目的時候,需要使用golang來調用操作系統中的命令行,來執行shell命令或者直接調用第三方程式,這其中自然就用到了golang自帶的exec.Command. 但是如果直接使用原生exec.Command會造成大量的重覆代碼,網上搜了一圈又沒有找到對exec.Command相應的封 ...
  • 本文為CUBA-Platform簡介 ,一個結合了可靠架構、企業級應用程式“必備”功能和應用程式快速開發工具的開源框架。 ...
  • <! done   簡單的‘Hello World!’   Python命令行 假設你已經安裝好了Python, 那麼在Linux命令行輸入: $python 將直接進入python。然後在命令行提示符>>>後面輸入: >>>print('He ...
  • 前言 CountDownLatch是一個閉鎖實現,它可以使一個或者多個線程等待一組事件發生。它包含一個計數器,用來表示需要等待的事件數量,coutDown方法用於表示一個事件發生,計數器隨之遞減,而await方法等待計數器為0之前一直阻塞。它是基於AQS的共用鎖來實現的,其中使用了較多的AQS的方法 ...
  • 1、作用域public,private,protected,以及不寫時的區別 答:區別如下: 作用域 當前類 同一package 子孫類 其他package public √ √ √ √ protected √ √ √ × friendly √ √ × × private √ × × × 不寫時預設 ...
  • 網關服務的作用: 身份認證、路由服務、為前端服務的後端—數據聚合 身份認證 如果我們的微服務和終端通信,勢必要考慮身份認證,如果我們的微服務都與每個終端用戶打交道,那麼這些代碼就需要拷貝多份, 並且植入到每個微服務業務代碼中,這就造成業務代碼和身份認證代碼耦合,降低代碼的復用性。 路由服務 由運維人 ...
  • DVWA列出了最流行、危害最大的幾個漏洞中就有命令註入漏洞。這種漏洞利用起來非常的簡單。只要會使用基本的命令就可以利用,入門門檻非常非常的低。以DVWA為靶機,測試一下命令註入漏洞。 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...