第一,对于不支持POST的,可以简单的使用如下代码
- if ("POST".equals(request.getMethod())) {
- // 正常进行
- }else{
- // 异常请求
- out.print("异常访问");
- return;
- }
如果是servlet, 可以将doGet方法直接返回,不进行处理就行了
- public void doGet(HttpServletRequest request, HttpServletResponse response) {
- return;
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response) {
- // 正常进行操作
- }
还可以采用特定的标志来区分,比如
<form><input type="hidden" name="action" value="insert"/></form>
程序里这样判断
- if ("POST".equals(request.getMethod()) && ("insert".equals(request.getParameter("action")))) {
- // 正常进行
- }else{
- // 异常请求
- out.print("异常访问");
- return;
- }
第二,判断提交的来源referer,代码如下
- if ("POST".equals(request.getMethod())) {
- String referer = request.getHeader("referer");
- if (referer == null || !referer.startsWith("http://"+request.getServerName())) {
- // 非法来源
- return;
- }
- // 正常进行
- }else{
- // 异常请求
- out.print("异常访问");
- return;
- }
第三 防止重复提交的hashCode
在表单显示页面
- //生成一个formhash,算法可以自己定,不随便重复就可以了
- String formhash = MD5.encode(Long.toString(new Date().getTime()));
- //读取当前session里面的hashCode集合,此处使用了Set,方便判断。
- Set<String> formhashSession = (Set<String>) session.getAttribute("formhashSession");
- if (formhashSession == null) {
- formhashSession = new HashSet<String>();
- }
- // 检测重复问题
- while (formhashSession.contains(formhash)) {
- formhash = MD5.encode(Long.toString(new Date().getTime()));
- }
- // 保存到session里面
- formhashSession.add(formhash);
- // 保存
- session.setAttribute("formhashSession", formhashSession);
表单里面增加如下字段
<input type="hidden" name="formhash" id="formhash" value="<%=formhash%>" />