Content Table

防止 XSS 攻击

可以使用 XSS Filter 防止 XSS 攻击,具体细节请访问 http://www.servletsuite.com/servlets/xssflt.htm

使用步骤:

  1. xssflt.jar 放到 WEB-INF/lib

  2. xssflt.jar 添加到 Gradle 依赖

    1
    compile fileTree(dir: 'src/main/webapp/WEB-INF/lib', include: ['*.jar'])
  3. 修改 web.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    <!-- 防止 XSS 攻击 -->
    <filter>
    <filter-name>XSSFilter</filter-name>
    <filter-class>com.cj.xss.XSSFilter</filter-class>
    </filter>
    <filter-mapping>
    <filter-name>XSSFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>

Webuploader 上传文件

SpringMVC Ajax 拖拽上传文件 一文介绍了使用 jQuery File Upload 拖拽上传文件,也挺简单的,只不过使用的 js 文件比较多,这里介绍使用百度的 Webuploader 实现拖拽上传文件,只需要引入 2 个文件:

  • webuploader.css
  • webuploader.js

WebUploader是由 Baidu WebFE(FEX) 团队开发的一个简单的以 HTML5 为主,FLASH 为辅的现代文件上传组件。在现代的浏览器里面能充分发挥 HTML5 的优势,同时又不摒弃主流 IE 浏览器,沿用原来的 FLASH 运行时,兼容 IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。

采用大文件分片并发上传,极大的提高了文件上传效率。

有下面一些特性:

  • 允许的类型
  • 允许的大小
  • 创建缩略图
  • 图片压缩
  • 上传进度
  • 拖拽上传
  • 自动上传
  • 手动上传: uploader.upload()
  • 更多信息请访问官网 http://fex.baidu.com/webuploader/,以及查看 API 文档。

Redis 集成

如果数据每次都从数据库查询,当并发大的时候,性能就会急剧的下降,常用、很少变化的数据可以采用 Redis 作为缓存,数据首先从 Redis 里查询,如果 Redis 里没有,然后才从数据库查询,并把查询到的结果放入 Redis。

乱码处理

字符集主要涉及 2 个方面

  • 文件本身的字符集(文件,数据库存储使用,返回给浏览器端的 html 内容)
  • 程序中编码解码时候使用的字符集(如解析 http 请求的数据)

为了防止乱码,我们规定:所有的字符集都用 UTF-8

Mybatis 语法

使用 MySQL 自动生成的主键

1
2
3
<insert id="insert" parameterType="Person" useGeneratedKeys="true" keyProperty="id">
INSERT INTO person(name, password) VALUES(#{name}, #{password})
</insert>

插入成功后,自动设置传入的参数的 id 属性。

使用 Oracle 序列生成的主键

1
2
3
4
5
6
7
<insert id="insertEnrollment" parameterType="EnrollmentForm">
<selectKey keyProperty="enrollId" resultType="long" order="BEFORE">
SELECT S_ENR_ID.Nextval FROM DUAL
</selectKey>

INSERT INTO enrollment (id, address) VALUES (#{enrollId}, #{address})
</insert>

使用 MySQL 自动生成 UUID

1
2
3
4
5
6
7
8
<insert id="createKnowledgePoint" parameterType="KnowledgePoint">
<selectKey keyProperty="knowledgePointId" resultType="string" order="BEFORE">
SELECT uuid() FROM dual
</selectKey>

INSERT INTO knowledge_point(knowledge_point_id, name, knowledge_point_group_id, is_deleted)
VALUES(#{knowledgePointId}, #{name}, #{knowledgePointGroupId}, 0)
</insert>

使用 LIKE 语句

1
2
3
4
5
6
7
8
9
10
11
12
13
MySql:
SELECT * FROM user WHERE name like CONCAT('%',#{name},'%')

Oracle:
SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或
SELECT * FROM user WHERE name like '%'||#{name}||'%'

SQLServer:
SELECT * FROM user WHERE name like '%'+#{name}+'%'

DB2:
SELECT * FROM user WHERE name like CONCAT('%',#{name},'%') 或
SELECT * FROM user WHERE name like '%'||#{name}||'%'

MyBatis 集成

SpringMVC 集成 MyBatis 需要以下几个文件

  • 配置文件
    • datasource.xml
    • mybatis.xml
    • web.xml
  • 查询需要的文件
    • 可选:bean(也可以不要,直接用 Map)
    • 必要:mapper xml
    • 必要:mapper interface

View Controller

有很多静态页面,里没有动态的内容,如果写 Controller 去做映射的话又感觉很麻烦,都是体力活,没什么意思,这时可以用 mvc:view-controller 进行映射达到相同的效果而又不需要写 Controller。

因为这个配置需要 Controller 的支持,所以 view 的文件需要放在模版所在文件夹。