美文网首页
play framework 1.3.x处理cors跨域

play framework 1.3.x处理cors跨域

作者: 丑男李狗蛋 | 来源:发表于2017-07-06 19:53 被阅读0次

    通过追踪代码发现play框架在收到http请求后将HTTP请求在pipeline中被交给了PlayHandler来处理

    在PlayHandler的messageReceived方法中有如下代码片段:

    Http.Request.current.set(new Http.Request());

    finalResponse response =new Response();

    Http.Response.current.set(response);

    final Request request = parseRequest(ctx, nettyRequest, messageEvent);

    可以看到request请求被获取到并放入了ThreadLocal中

    往下追踪我们可以看到play框架调用了一组插件来处理当前请求,每个请求都会调用插件的rawInvocation方法

    boolean raw = Play.pluginCollection.rawInvocation(request, response);

    我们可以在这个方法里面给response注入

    Access-Control-Allow-Origin:*

    那么自实现一个插件:

    CorsPlugin:

    importplay.PlayPlugin;

    importplay.mvc.Http;

    /**

    * Created by yyp on 2017/7/5.

    */

    public class CorsPlugin extends PlayPlugin {

    public CorsPlugin() {

    }

    @Override

    public boolean rawInvocation(Http.Request request, Http.Response response) throws Exception {

    //获取请求头中的请求类型

    if(request.headers.containsKey("access-control-request-method")) {

    //注入请求类型到requst的method中// 在跨域请求中play框架不会自转换请求类型所以需要手动注入

    request.method= request.headers.get("access-control-request-method").value();

    }

    Http.Response.current().setHeader("Access-Control-Allow-Origin","*");

    if( request.headers.containsKey("access-control-request-headers")) {

    Http.Response.current().setHeader("Access-Control-Allow-Headers",request.headers.get("access-control-request-headers").value());

    }

    return super.rawInvocation(request, response);

    }

    }

    将插件注入play框架中

    在conf中新建文件play.plugins  在里面写入

    800:com.power.util.CorsPlugin

    其中800指的是插件的执行顺序,play会扫描classpath下所有的play.plugins文件来加载插件

    如下:

    play框架自带的插件文件如下:

    0:play.CorePlugin

    1:play.ConfigurationChangeWatcherPlugin

    100:play.data.parsing.TempFilePlugin

    200:play.data.validation.ValidationPlugin

    300:play.db.DBPlugin

    400:play.db.jpa.JPAPlugin

    450:play.db.Evolutions

    500:play.i18n.MessagesPlugin

    600:play.libs.WS

    700:play.jobs.JobsPlugin

    100000:play.plugins.ConfigurablePluginDisablingPlugin

    自此解决play框架跨域问题

    相关文章

      网友评论

          本文标题:play framework 1.3.x处理cors跨域

          本文链接:https://www.haomeiwen.com/subject/gazhhxtx.html