跨域问题,防止表单重复提交,防止XSS攻击

回眸只為那壹抹淺笑 提交于 2020-02-07 07:24:00

跨域问题

1.设置请求头
代码:

b_prokect

<input type="text" name="username" id="username"><input type="button" value="提交" name="button" id="button">
	<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
	<script>
	    $(function(){
	    $("#button").click(function(){
	            //获取文本框值
	            var username=$("#username").val();
	            $.ajax({
	                url:"http://localhost:8080/a/AServlet",
	                data:{"username":username},
	                type:"post",
	                success:function (result) {
	                    alert(result);
	                }
	            })
	
	        })
	    });
	</script>

a_prokect—Aservlet

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收数据
        String username = req.getParameter("username");
        System.out.println("接收的数据"+username);
        //响应结果
        resp.getWriter().write("success");
        //设置请求头
        resp.setHeader("Access-Control-Allow-Origin","*");
    }

二.JSONP解决跨域问题

JSONP实现原理:动态加载<script>标签,利用src属性进行服务器资源的访问,但是只支持Get请求
1.在我们的Ajax请求当中,需要以JSONP方式请求(通过jquery手段,动态生成sript)

  1. jsonp:“代表的时前台传给后台,后台再传递给你 jsonpCallBack”
  2. JSONP需要以Get请求发送 ?username=zhangsan
  3. 再AJAX请求当中需要将返回的数据格式指定为jsonp
$("#button").click(function(){
            //获取文本框值
            var username=$("#username").val();
            $.ajax({
                url:"http://localhost:8080/a/AServlet?username="+username,
                type:"post",
                jsonp:"jsonpCallBack",//回调函数
                //再AJAX请求当中需要将返回的数据格式指定为jsonp
                dataType:"jsonp",
                success:function (result) {
                    alert(result);
                },
                error:function () {
                    alert("系统错误")
                }
            })

        })
        function  jsonpCallBack(result) {
            alert(result);
        }
  1. 后台需要做的事情:
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接收数据
        String username = req.getParameter("username");
        System.out.println("接收的数据"+username);
        //ajax接收
        String jsonpCallBack = req.getParameter("jsonpCallBack");
        //转JSON格式字符串
        String success = JSON.toJSONString("success");
        System.out.println(jsonpCallBack);
        //响应结果
        resp.getWriter().write(jsonpCallBack+"("+success+")");
        //设置请求头
       /* resp.setHeader("Access-Control-Allow-Origin","*");*/
    }

3.使用HTTPClient解决:就是不通过浏览器发送请求
B工程的页面发送的Ajax没有办法请求到A工程,因为浏览器会拦截,走后台,后台通过HTTPClient请求请求到A工程,获取到响应结果
B工程的页面发送的Ajax没有办法请求到A工程,因为浏览器会拦截,走后台,后台通过HTTPClient请求请求到A工程,获取到响应结果

		1.B工程的Bindex.jsp页面请求到B工程的Servlet
$("#button").click(function () {
            //获取到文本框的值
            var username=$("#username").val();
            //发送Ajax请求www.a.com的A工程
            $.ajax({
                url:"BServiet?username="+username,
                type:"GET",
                success:function (result) {
                    alert(result);
                },
                error:function () {
                    alert('系统错误~')
                }
            });
        });

2.B工程的BServlet去模拟HTTP请求到A工程

   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //内部通过HTTPClient进行转发
        //构建一个连接
        System.out.println("222222222222");
        CloseableHttpClient client = HttpClients.createDefault();

        //构建请求
        HttpGet get=new HttpGet("http://localhost:8080/a/AServlet?username="+req.getParameter("username"));
        //发送请求
        CloseableHttpResponse httpResponse = client.execute(get);
        //获取返回结果
        String result = EntityUtils.toString(httpResponse.getEntity());
        //将A工程响应结果给页面
        resp.getWriter().write(result);
    }

3.A工程处 理请求

String username=req.getParameter("username");
        System.out.println("接受的数据:"+username);

        //2.响应结果
        resp.getWriter().write("success");

2.防止表单重复提交

1.网络延迟,再网络延迟时间内,频繁的提交表单
只能提交一次,监控表单的提交事件,通过一个boolean类型的变量来区分已经点击过还是没有点击,如果已经点击过,表单就不提交,没有点击过再提交
from.jsp

<body>
    <form action="fromService" onsubmit="return fromService()" method="post">
        <input type="text" id="username" name="username"><input type="button" value="提交">
    </form>
</body>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script>
    function FromService() {
        var fol=false;
        //false 代表没有提交 true代表提交过
        if(!fol){
            fol=true;
            return true;
        }else{
            return false;
        }
    }
</script>
@Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("11");
        String username = req.getParameter("username");
        System.out.println("接收的数据为"+username);
        try {
            Thread.sleep(300);

        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        resp.getWriter().write("success");
    }

三.防止XSS攻击:大部分浏览器都已经解决了该问题

	脚本注入
	防止XSS攻击:后台创建Filter过滤器,过滤所植入的脚本数据<script>,使用正则表达式匹配提交数据的格式

大部分浏览器都已经解决了该问题
脚本注入
防止XSS攻击:后台创建Filter过滤器,过滤所植入的脚本数据

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!